noip2016 蚯蚓 佇列

2022-02-15 16:12:06 字數 1690 閱讀 9891

傳送門

樣例1:

3 7 1 1 3 1

3 3 2

樣例2:

3 7 1 1 3 2

3 3 2

樣例3:

3 7 1 1 3 9

3 3 2

樣例1:

3 4 4 4 5 5 6

6 6 6 5 5 4 4 3 2 2

樣例2:

4 4 5

6 5 4 3 2

樣例3:

//空行

很顯然是一道優先佇列的題0_0

我們每次拿出最大的乙隻蚯蚓切割再扔到堆裡(第一問)

然後將堆中的東西依次取出(第二問)

那怎麼將堆中蚯蚓每次加上q呢?

可以設乙個變數表示當前蚯蚓已經被加了多少,出隊時加上就行(入隊時記得減去)

那切割後的蚯蚓不增加q怎麼辦?那就入隊時先-q就行了

然後這樣\(o((n+m)log(n+m))\)就應該可以水過很多分了~

然後說正解:其實正解也是跟上面一樣的步驟只不過證明了乙個單調性,省去log(n+m)的時間

證明:後分解出的⌊px⌋一定小於先分解出的⌊px⌋ (x-⌊px⌋同理)

考慮反證法若\(xi*p+(j-i)*q<=(xj+(j-i)*q)*p\)

則有:\(xi*p+(j-1)*q<=xj*p+(j-i)*q*p\)

因為\(xi>xj\)且\(0該式顯然不成立

說明⌊px⌋單調遞減成立

有了單調性我們就可以用三個佇列模仿優先佇列一樣操作

時間複雜度:\(o(nlogn+m)\)

//by menteur_hxy

#include#include#include#include#include#define f(i,a,b) for(register int i=(a);i<=(b);i++)

using namespace std;

int read()

while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();

return x*f;

}const int inf=0x7fffffff;

const int n=1e5+10,m=7e6+10;

int n,m,q,u,v,t,reg;

int q[3][m],qt[3],qf[3];

bool cmp(int x,int y)

int max()

int main()

putchar('\n');

f(i,1,n+m)

return 0;

}

noip2016 蚯蚓 佇列

傳送門 樣例1 3 7 1 1 3 1 3 3 2 樣例2 3 7 1 1 3 2 3 3 2 樣例3 3 7 1 1 3 9 3 3 2 樣例1 3 4 4 4 5 5 6 6 6 6 5 5 4 4 3 2 2 樣例2 4 4 5 6 5 4 3 2 樣例3 空行 很顯然是一道優先佇列的題0 0...

NOIp2016 蚯蚓 佇列

link 這道題是個 zz 題 我們考慮如何得部分分,即十分 zz 的 theta m n log m n 窩萌發現這個複雜度似乎可以接受,但是會爆是真的,所以每當這個時候我們就需要思考問題內部的單調性。我們發現其實對於兩條蚯蚓 a 和 b 設它們的長度為 l a 和 l b 假設他們滿足 l a ...

noip2016 蚯蚓 單調佇列

去年提高組的day2t2,很容易有種讓人看到就會想到用堆的做法,但是堆的時間複雜度顯然是不夠的 雖然可以拿到85分,暴力打得好的話 所以就像之前做那道合併果子一樣的,想到了單調佇列的做法。可以把原來的蚯蚓按照從大到小的排序放在第乙個佇列裡面,然後每一次切蚯蚓,把第一部分放在第二個佇列中,第二部分放第...