折騰了一下午的一道題
算是徹底明白了莫隊的本質
這題難點在於怎麼構造o(1)轉移
選擇用兩個陣列 乙個v陣列 記錄出現次數為i次的數有多少個 乙個num陣列 記錄i這個數出現的次數
這樣就可以實現o(1)轉移
其實這樣構造有乙個地方不好處理 如何o(1)處理出當前詢問的答案
後來造了一些資料發現直接用while去遍歷v陣列 每一次的期望複雜度都很低 說白了就是這個while的複雜度就是o(1)
這樣一來這題就解決了 只是有乙個細節需要注意
為了防止re或者迷之錯誤 所以把r的移動放在最前面 這也是初學者(我)寫莫隊很容易忽視的問題
**如下
#includeusing namespace std;
const int maxn=1e5+5;
struct node
q[maxn];
int cntq;
struct change
c[maxn];
int time;
int unit;
int b[maxn];
int a[maxn],now[maxn],mp[2*maxn],cnt;
int ans[maxn];
int num[2*maxn];
int v[2*maxn];
bool cmp(node a,node b)
int id=1;
for(int i=1;i<=m;i++);}
else if(op==2)
;now[x]=y;}}
sort(mp+1,mp+1+cnt);
cnt=unique(mp+1,mp+1+cnt)-mp-1;
for(int i=1;i<=time;i++)
for(int i=1;i<=n;i++)
a[i]=lower_bound(mp+1,mp+1+cnt,a[i])-mp;
sort(q+1,q+1+cntq,cmp);
int l=1,r=0,t=0;
for(int i=1;i<=cntq;i++)
while(r>q[i].r)
while(tq[i].t)
a[c[t].pos]=c[t].old;
t--;
}int id=1;
while(v[id]) id++;
ans[q[i].id]=id;
}for(int i=1;i<=cntq;i++)
cout
}
codeforces 940D 比賽總結
這次比賽總體還行,但是並沒發揮到極致 a題速度正常題解 b題這個題先是沒注意時間複雜度,tle了,好不容易優化了沒多測幾組就交了,很開心的wa了,查了一邊發現沒特判k,改好後有草率地交了,又wa了,於是隨便把int改成了long long但不敢相信是這個地方錯了,於是呆看了幾十分鐘,白白浪費了時間,...
codeforces 1194F 組合數學
傳送門 你有n個事件,你需要按照1 n的順序完成這些事件,每個事件需要 t i 的時間完成,你現在一共有t的時間去做這些事情,每做一件事情的時候,你有0.5的概率花費 t i 的時間完成他,也有0.5的概率花費 t i 1 的時間去完成他,如果在做這個事件的時候時間花完了,你就相當於沒有做成這個事件...
codeforces 1114F 線段樹練習
這是一道用線段樹維區間值的一道題,題意很簡單,就是對於給定的乙個序列,初始時每個數的值不大於300,然後有兩中操作,乙個是對區間 l,r 的每個數乘上以個數x,乙個是詢問區間的乘積的尤拉函式值,首先對於第乙個操作顯然可以用線段樹的延遲更新來完成,對於第二個操作,我最先沒考慮資料,就想著直接維護區間的...