傳送門
樣例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分,暴力打得好的話 所以就像之前做那道合併果子一樣的,想到了單調佇列的做法。可以把原來的蚯蚓按照從大到小的排序放在第乙個佇列裡面,然後每一次切蚯蚓,把第一部分放在第二個佇列中,第二部分放第...