codeforces 940F 離散化 帶修莫隊

2021-08-29 07:46:03 字數 1290 閱讀 2798

折騰了一下午的一道題

算是徹底明白了莫隊的本質

這題難點在於怎麼構造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,乙個是詢問區間的乘積的尤拉函式值,首先對於第乙個操作顯然可以用線段樹的延遲更新來完成,對於第二個操作,我最先沒考慮資料,就想著直接維護區間的...