劃一波水,寫一道題

2022-05-19 03:10:00 字數 1511 閱讀 5705

\(2×n\)名編號為 \(1\sim2n\)的選手共進行r輪比賽。每輪比賽開始前,以及所有比賽結束後,都會按照總分從高到低對選手進行一次排名。選手的總分為第一輪開始前的初始分數加上已參加過的所有比賽的得分和。總分相同的,約定編號較小的選手排名靠前。

每輪比賽的對陣安排與該輪比賽開始前的排名有關:第1名和第2名、第3名和第4名、……、第(2k-1)名和第2k名……、第(2n-1)名和第2n名,各進行一場比賽。每場比賽勝者得1分,負者得0分。也就是說除了首輪以外,其它輪比賽的安排均不能事先確定,而是要取決於選手在之前比賽中的表現。

現給定每個選手的初始分數及其實力值,試計算在r輪比賽過後,排名第q的選手編號是多少。我們假設選手的實力值兩兩不同,且每場比賽中實力值較高的總能獲勝。

是不是看到這道題非常興奮:這不就是快排嘛?!

真的那麼簡單嗎???

然鵝事實狠狠地又打了自己的臉(啪!)——它的複雜度非常非常非常非常……高!達到了驚銀的$o(nlogn)$以上

so……超時了。那怎麼辦。。。沒辦法了?怎麼可能!

仔細讀題,模擬後可以知道,每輪比賽結束後,勝利者和失敗者兩個集合的內部順序是不會被打亂的。所以也就是說這裡每一輪比賽下來,有一半人的相對順序已經確定了,二我們所熟知的快排`sort`是針對隨機數列的,既然已經有確定的部分,那它那可憐的優勢也沒有了,也就不那麼高效了。

這樣看來我們就需要新的排序方法——歸併(我太弱了,只能想到歸併)

so,每一輪比賽後用o(n)的時間歸併一次,時間就夠了。

沒了。沒了?$\downarrow$

對於\(30\%\)的資料,\(1 ≤ n ≤ 100\);

對於\(50\%\)的資料,\(1 ≤ n ≤ 10,000\);

對於\(100\%\)的資料,\(1 ≤ n ≤ 100,000,1 ≤ r ≤ 50,1 ≤ q ≤ 2n,0 ≤ s_1, s_2, …, s_≤10^8,1 ≤w_1, w_2 , …, w_≤ 10^8\)

呵呵。。。看到空間沒,別忘了開二倍!

而且,資料真的hin水。

#includeusing namespace std;

int b, c, n, r, q;

int s[200001];

bool ds(int x,int y)

int main()

for(int i=1;i<=n;i++)

sort(a+1,a+(n+1),ds);//第一次排序

for(int i=1;i<=r;i++)

else//反過來

}int l=1,j=1,k=1;//歸併排序

while(l<=b && j<=b)

else

}while(l<=b)//剩餘的數

while(j<=b)//剩餘的數

}printf("%d",a[q]);

return 0;

}

1503171912 ny 一道水題

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 今天lzq在玩一種小遊戲,但是這遊戲數有一點點的大,他乙個人玩的累,想多拉一些人進來幫幫他,你能寫乙個程式幫幫他嗎?這個遊戲是這樣的 有一行數字,如果我們把這行數字中的 5 都看成空格,那麼就得到一行用空格分割的若干非負整數 可...

nyoj525 一道水題

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 今天lzq在玩一種小遊戲,但是這遊戲數有一點點的大,他乙個人玩的累,想多拉一些人進來幫幫他,你能寫乙個程式幫幫他嗎?這個遊戲是這樣的 有一行數字,如果我們把這行數字中的 5 都看成空格,那麼就得到一行用空格分割的若干非負整數 可...

NYOJ 525 一道水題

時間限制 1000 ms 記憶體限制 65535 kb 難度 2 描述 今天lzq在玩一種小遊戲,但是這遊戲數有一點點的大,他乙個人玩的累,想多拉一些人進來幫幫他,你能寫乙個程式幫幫他嗎?這個遊戲是這樣的 有一行數字,如果我們把這行數字中的 5 都看成空格,那麼就得到一行用空格分割的若干非負整數 可...