聯賽模擬測試5 序列 主席樹

2022-01-10 17:00:45 字數 1367 閱讀 6762

對於每乙個位置,我們開一棵權值線段樹,記錄這個位置上的每乙個取值對答案的貢獻

對於每一次詢問,對它有貢獻的點是區間\([l,r]\)中大於等於\(x\)的數

因此我們考慮差分,在\(l\)的位置\(+1\),在\(r+1\)的位置\(-1\)

轉換到具體的點上,就是當點的座標恰好為\(l\),在\(x\)的位置\(+1\)

恰好為\(r+1\),在\(x\)的位置\(-1\)

修改時減去舊的貢獻加上新的貢獻即可

#include#include#include#includeinline int read()

while(ch>='0' && ch<='9')

return x*fh;

}const int maxn=1e5+5;

int n,m,q,cnt,a[maxn],rt[maxn],latans;

std::vectorjll[maxn],jlr[maxn];

struct trrtr[maxn*40];

int ad(int da,int lat,int l,int r,int wz,int val)

int mids=(l+r)>>1;

if(wz<=mids) tr[da].lc=ad(tr[da].lc,tr[lat].lc,l,mids,wz,val);

else tr[da].rc=ad(tr[da].rc,tr[lat].rc,mids+1,r,wz,val);

tr[da].w=tr[tr[da].lc].w+tr[tr[da].rc].w;

return da;

}int cx(int da,int l,int r,int x,int y)

int mids=(l+r)>>1;

if(y<=mids) return cx(tr[da].lc,l,mids,x,y);

else if(x>mids) return cx(tr[da].rc,mids+1,r,x,y);

return cx(tr[da].lc,l,mids,x,y)+cx(tr[da].rc,mids+1,r,x,y);

}int main()

for(int i=1;i<=m;i++)

for(int i=1;i<=n+1;i++)

for(int j=0;j

if(i<=n) latans+=cx(rt[i],1,n,1,a[i]);

} printf("%d\n",latans);

for(int i=1;i<=q;i++)

return 0;

}

2018 10 08 NOIP模擬 序列(主席樹)

傳送門 t2防ak題?其實也不是很難 考試時sb了 直接變形一下求出區間長度在 l2 r2 l2,r2 l2,r2 之間,中位數 l1 1 le l1 1 l1 1的區間數,和區間長度在 l2 r2 l2,r2 l2,r2 之間,中位數 r1 le r1 r1的區間數就行了。繼續變變形,乙個區間的中...

校內模擬 子串(SAM)(LCT)(主席樹)

考慮怎麼算答案。首先本質不同子串個數大概就是幾種做法,字尾陣列,字尾自動機,暴力 然後字尾自動機。眾所周知,並沒有區間字尾自動機這種扯淡的資料結構。換乙個思路,我們並不直接統計,而是對於前面每乙個重複出現的字串,打上 1標記。仔細想一想即可得到本題正解。怎麼得到重複字串,顯然是sam跳fail鏈,每...

4 序列交換 全國模擬(四)

程式設計題 序列交換 時間限制 1秒 空間限制 32768k 牛牛有乙個長度為n的整數序列s,羊羊要在牛牛的序列中選擇不同的兩個位置,然後交換這兩個位置上的元素。現在需要求出羊羊交換後可以得到的不同的序列個數。注意被交換的兩元素值可能相同 如序列,輸出1.羊羊必須交換僅有的兩個元素,得到序列。羊羊必...