有\(n\)個數字開始都是\(0\),要求有\(q\)次操作。
新建乙個觀測員,觀測其中的\(k\)個數,當這\(k\)個數從此刻開始變化量不小於\(t\)時觀測結束。
將第\(i\)個數加\(v\),並輸出此時觀測結束的觀測員編號。
\(1\leq n,q\leq 2\times 10^5,1\leq k\leq 3,1\leq t,v\leq 10^6\)
考慮從\(k\)入手,根據鴿籠原理,乙個觀測員觀測結束當且僅當存在它觀測的乙個數字\(a\geq \lceil\frac\rceil\),注意到此時已經至少填充了\(\lceil\frac\rceil\)。
所以我們可以對於每個它觀測的數字以\(\lceil\frac\rceil\)為界,當到倒打這個界時,我們直接重新根據現在的數字再來一次,也就是把\(t\)剩餘的部分再分成\(k\)份丟回去。
一直這樣做知道合法為止,此時每次會至少令\(t=\fract\),所以這樣的次數應該為\(\log_}t\)。
用個\(set\)維護就好了,時間複雜度:\(o(q\log_}tk\log q)\)
#include#include#include#include#include#include#define ll long long
#define mp(x,y) make_pair(x,y)
using namespace std;
const ll n=2e5+10;
ll n,m,cnt,a[n],t[n];
vectorans,q[n],c[n];
set>s[n];
void update(ll x)
printf("%lld",las=ans.size());
sort(ans.begin(),ans.end());
for(ll i=0;iprintf(" %lld",ans[i]);
putchar('\n');
} }return 0;
}
改題 變數觀測
這題確實妙,考場想了很久,沒想出來 n 個變數,q 個操作 1 操作加入乙個觀測者,給出其觀測的 k 個變數 k leq3 和整數 t 當其觀測的 k 個數變化值之和大於 t 時,停止觀測。2 操作給出正整數 i,x 將第 i 個變數加上 x 題解是這麼說的 把每個人的 t 分成 k 份均攤到 k ...
poj 3370 鴿籠原理知識小結
中學就聽說過抽屜原理,可惜一直沒機會見識,現在這題有鴿籠原理的結論,但其實知不知道鴿籠原理都可以做 先總結一下鴿籠原理 有n 1件或n 1件以上的物品要放到n個抽屜中,那麼至少有乙個抽屜裡有兩個或兩個以上物品。如果你知道這個結論 a1,a2,a3.am是正整數序列,至少存在整數k和r,1 k 證明比...
鴿籠原理 HDU1205吃糖果
problem description hoho,終於從speakless手上贏走了所有的糖果,是gardon吃糖果時有個特殊的癖好,就是不喜歡將一樣的糖果放在一起吃,喜歡先吃一種,下一次吃另一種,這樣 可是gardon不知道是否存在一種吃糖果的順序使得他能把所有糖果都吃完?請你寫個程式幫忙計算一下...