題目大意:
給你n個不同長度蚯蚓,每秒從裡面取出最長的砍下u/v變成兩隻,又把剩下的加長q。
問你在m之前的t,2t,3t...的時間上,砍的蚯蚓長度,
以及m秒後剩下所有的蚯蚓長度。
思路:很容易想到用乙個堆來解決,然而這樣時間複雜度是o((m+n)log(m+n))的,過不去。
所以複雜度得是線性的。
考慮把原來的堆改成三個單調佇列。
每個蚯蚓切成兩半總會有乙個長的、乙個短的。
我們有q1維護原來的蚯蚓,q2維護砍下來長的一截蚯蚓,q3維護砍下來短的一截蚯蚓。
不考慮蚯蚓的生長,我們只需要每次砍完蚯蚓扔進去就可以了。
算長度只要把每個單位時間內增加的長度乘以時間加到蚯蚓上面就可以了。
注意中間結果開long long,不然只有70分。
1 #include2 #include3 #include4 #include5 #include6 typedef longlong
int64;
7 inline int
getint()
14const
int n=100000;15
inta[n];
16 std::queueq1,q2,q3;
17 inline int
getmax()
23if(q1.empty()&&q3.empty())
28if(q2.empty()&&q3.empty())
33if
(q1.empty())
39const
int ret=q3.front();
40q3.pop();
41return
ret;42}
43if
(q2.empty())
49const
int ret=q3.front();
50q3.pop();
51return
ret;52}
53if
(q3.empty())
59const
int ret=q2.front();
60q2.pop();
61return
ret;62}
63if(q1.front()>=q2.front()&&q1.front()>=q3.front())
68if(q2.front()>=q1.front()&&q2.front()>=q3.front())
73if(q3.front()>=q1.front()&&q3.front()>=q2.front())
78return0;
79}80int
main()
85 std::sort(&a[0],&a[n],std::greater());
86for(register int i=0;i)
89for(register int i=1;i<=m;i++)
95 putchar('\n'
);96
for(register int i=1;!q1.empty()||!q2.empty()||!q3.empty();i++)
100return0;
101 }
NOIP2016提高組 蚯蚓
搬來的。題目大意 每一輪有若干個正整數,每一輪會選出最大的乙個 設其為 x 並將 x 用兩個數取代之,乙個是 x p 乙個是x x p 其中 p 為乙個取值範圍為 0,1 的實數,而其餘的數都會加上乙個非負整數 q。一開始有 n 個數,要進行 m 輪操作,問每輪操 作刪掉的數和最後剩下的數。f1 n...
NOIP2016提高組 蚯蚓
首先考慮暴力 每次都是拿最長的蚯蚓,容易想到用堆。每次除拿出來的以外所有的蚯蚓都增長,容易想到用乙個懶惰標記來記錄所有的蚯蚓增長了多少。取最大的元素出來後加上標記的值,放元素進去的時候減去標記的值。這時已經可以騙到60分了。假設某一次取出來的元素長度為x,當前標記的值為inc,切完以後放進去的就是 ...
Noip 2016 提高組第二試 蚯蚓
蛐蛐國裡現在共有n只蚯蚓 n為正整數 每只蚯蚓擁有長度,我們設第i只蚯蚓的長度為a i i 1,2,n 並保證所有的長度都是非負整數 即 可能存在長度為0的蚯蚓 每一秒,神刀手會在所有的蚯蚓中,準確地找到最長的那乙隻將其切成兩半。神刀手切開蚯蚓的位置由常數p決定,設這只蚯蚓長度為x,神刀手會將其切成...