這題確實妙,考場想了很久,沒想出來
\(n\)個變數,\(q\)個操作:\(1\)操作加入乙個觀測者,給出其觀測的\(k\)個變數(\(k\leq3\)),和整數\(t\),當其觀測的\(k\)個數變化值之和大於\(t\)時,停止觀測。 \(2\)操作給出正整數\(i, x\), 將第\(i\)個變數加上\(x\)。
題解是這麼說的:把每個人的\(t\)分成\(k\)份均攤到\(k\)個變數(每個\(t/k\)), 假如每個變數的變化值都小於\(t/k\),那麼總的變化值顯然不到\(t\)。如果其中乙個大於等於\(t/k\),那就把放進去的\(k\)個取出來,檢查這個是否已經觀察完了,如果沒有就把還需要的變化值重新放回去,這時候需要的變化值至少是原來的\(\frac 23\),每個觀察者重複次數不超過\(\log_ t\), 複雜度正確。
過於炫酷,以至於很難理解為什麼能夠想到:首先我們容易想到的是,需要用堆來維護,比如說k=1的情況下,你給每乙個變數開乙個堆, 這樣你可以從需要變化量最小的開始check。但是如果\(k\)大於\(1\), 那麼你每次修改的時候就麻煩了,因為\(k=1\)你可以給整個堆加某個數,隨便處理一下,但是\(k\neq1\)的時候就要同時修改不同堆的某些元素,無法實現。
問題在於,你每次修改乙個堆裡的元素,還要同時修改其他元素,
------------恢復內容開始------------
# 變數觀測
這題確實妙,考場想了很久,沒想出來
\(n\)個變數,\(q\)個操作:\(1\)操作加入乙個觀測者,給出其觀測的\(k\)個變數(\(k\leq3\)),和整數\(t\),當其觀測的\(k\)個數變化值之和大於\(t\)時,停止觀測。 \(2\)操作給出正整數\(i, x\), 將第\(i\)個變數加上\(x\)。
題解是這麼說的:把每個人的\(t\)分成\(k\)份均攤到\(k\)個變數(每個\(t/k\)), 假如每個變數的變化值都小於\(t/k\),那麼總的變化值顯然不到\(t\)。如果其中乙個大於等於\(t/k\),那就把放進去的\(k\)個取出來,檢查這個是否已經觀察完了,如果沒有就把還需要的變化值重新放回去,這時候需要的變化值至少是原來的\(\frac 23\),每個觀察者重複次數不超過\(\log_ t\), 複雜度正確。
過於炫酷,以至於很難理解為什麼能夠想到:首先我們容易想到的是,需要用堆來維護,比如說k=1的情況下,你給每乙個變數開乙個堆, 這樣你可以從需要變化量最小的開始check。但是如果\(k\)大於\(1\), 那麼你每次修改的時候就麻煩了,因為\(k=1\)你可以給整個堆加某個數,隨便處理一下,但是\(k\neq1\)的時候就要同時修改不同堆的某些元素,無法實現。
以下內容純粹口胡
問題在於,你每次修改乙個堆裡的元素,還要同時修改其他元素,所以要想到能否把元素拆開下放到這幾個堆裡,獨立去做,這裡是可以想到的。 另一種理解方式是:這裡實際上是一種延遲觸發機制,由於\(t\)很大,我們每次check顯然不優,需要一定延遲機制,但同時要保證答案正確。
暫略
#include #include #include #include #include #include #define int long long
using namespace std;
int read()
struct point
}lp;
const int n = 3e5+600;
int n, q, lst=0, cnt=0, qcnt=0;
int a[n], query[n][5];
mapdel;
priority_queues[n];
vectorans;
int getsum(int id)
void push(int id)
}int check(int id)
return 0;
}void clear(int id)
signed main()
push(cnt);
}elseelse
s[t].pop();
clear(t);
}printf("%lld", lst = ans.size());
sort(ans.begin(), ans.end());
for(auto x : ans)printf("\n");}}
return 0;
}
YbtOJ 變數觀測 鴿籠原理
有 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 le...
LeetCode每日一題 找出缺失的觀測資料
現有乙份 n m 次投擲單個 六面 骰子的觀測資料,骰子的每個面從1到6編號。觀測資料中缺失了 n 份,你手上只拿到剩餘 m 次投擲的資料。幸好你有之前計算過的這 n m次投擲資料的 平均值 給你乙個長度為 m 的整數陣列 rolls 其中 rolls i 是第i次觀測的值。同時給你兩個整數 mea...
const 修飾的變數真的不能改嗎?
我們在學校學習c的時候,我們的老師經常都會跟我們說 如果乙個變數用了const來修飾的話,我們就不能改變這個變數的值。但是事實是這樣嗎?當然不是。在c專家程式設計裡面有提到,用const來修飾的變數如果已經初始話了,就不能再給這個 變數直接賦值,但是我們可以用到其他的方法來改變它的值。只要不用這個變...