去年提高組的day2t2,很容易有種讓人看到就會想到用堆的做法,但是堆的時間複雜度顯然是不夠的(雖然可以拿到85分,暴力打得好的話),所以就像之前做那道合併果子一樣的,想到了單調佇列的做法。
可以把原來的蚯蚓按照從大到小的排序放在第乙個佇列裡面,然後每一次切蚯蚓,把第一部分放在第二個佇列中,第二部分放第三個佇列中,佇列便會滿足單調性,可以簡單的證明一下:現在先假設三個佇列都是滿足單調遞減的性質,設上一秒取出的最大的元素為a,現在取出的最大的元素為b,必滿足b-q現在加到後面的元素為b*p和b-b*p,而此時其餘的長度又增加了q,所以因為b-qb*q,a-a*p+q>b-b*q,所以總是滿足單調性的。
#include#include#include#include#include#include#define ll long long
using namespace std;
const int maxn=1e7+10;
const ll inf=0x7fffffffffffffff;
int n,u,v,t;
ll m,q;
ll a[maxn];
long double p;
queues[3];
bool cmp(ll a,ll b)
void read(ll &x)
x=num;
}ll find()
else if(len1>=len2 && len1>=len0)
else
} int main()
cout<
NOIP2016 蚯蚓 佇列 單調性優化
傳送門 努力刷完noip提高組題目ing 50 60分演算法 直接用堆 優先佇列模擬 100分演算法 觀察題目,發現其中隱含的單調性。設兩條蚯蚓長度為a,b a,ba,b,其中a ba b a b。則a aa被切掉時長度分別為pa,1 p a pa,1 p a pa,1 p a,過t秒之後長度為pa...
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 蚯蚓 佇列
傳送門 樣例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...