上午模擬賽100+50+0+0.
T3本來能拿更高的分數,但是預處理放到裡面了。
T1\((kruskal+lca)\)
最小瓶頸生成樹/最短路。
其實仔細想想,讓他們之間最大邊最短,其實就是最短的代價連通。據此得到解決。
T2
構造序列a:
現在有\(q<=1e5\)次詢問:有多少區間的和=s?
觀察性質咯。
這個序列可以寫成
觀察區間和->相鄰和?
據此分類討論。
具體來說:
l奇,r偶。塊是固定的=s/(n + 1),也就是問有多少個間隔為這個的組。
l偶r奇同理。用剛剛的圖看來是斜線。
lr同奇偶。我們取出模數,則模數其實就是ar。則取出模數下標(直接根據上面取),判斷l=r-bk是否合法即可。
T3:
觀察popcount()的性質。
這個性質。
接下來如何做?看60分給予我們啟發:可以先不用管上界。
接下來考慮列舉popcount=i,然後把i-1,i+1固定,接下來就變成了一個組合數問題。預處理組合數,over。帶上上界呢?也很簡單,如果r此位為1,令此位為0算答案,繼續遞迴,這樣就變成了logn個無限制數,over。
T4:
套了層博弈論殼子。
g:我感覺至多一部分是博弈,用來表達某種約束(充要條件)。
->必勝?(每個數選的個數)c1^c2..!=0
->如果帶上bob,異或和>m才行,否則失敗。
->表達限制:sigma aici<=k,ci異或 >m,
->異或按位獨立,按位DP,
f[pos,i, lmt, cnt, op] = f[位數, 第幾個數, 頂到下界,剩餘錢數(單位是2^pos),當前填了奇/偶個1],轉移就行。
動態開點
用來最佳化空間複雜度,有些情況我們必須開大,比如
詢問要多少,我就開多少。
具體來說如何做?
動態開點就是首先不能用堆式編號,然後額外處理下當前節點為空情況,其他一樣。
Node中記錄lson,rson。modify時記錄當前區間,特殊處理!u,開引用u,over
老師程式碼。
#define mid ((l+r)>>1)
void ins(int &x,int l,int r,int p){
if(!x) x=++tot;
if(l==r){
tr[x].siz=1;
tr[x].sum=p;
tr[x].pf=1ll*p*p;
return;
}
if(p<=mid) ins(tr[x].ls,l,mid,p);
else ins(tr[x].rs,mid+1,r,p);
pushup(x);
}
線段樹合併
例題T6:
->不考慮修改,好像可以線段樹二分(考慮
->修改呢?我們想要快速維護合併子樹資訊,這就可以線段樹合併了。
線段樹二分。
void up(int u){
s[u]=s[ch[u][0]]+s[ch[u][1]];
}
void add(int &u,int l,int r,int v){
if(!u) u=++node;
if(l==r){s[u]++;return;}
int mid=(l+r)>>1;
if(v<=mid) add(ch[u][0],l,mid,v);
else add(ch[u][1],mid+1,r,v);
up(u);
}
int query_kth(int u,int l,int r,int k){
if(l==r) return l;
int mid=(l+r)>>1;
if(k<=s[ch[u][0]]) return query_kth(ch[u][0],l,mid,k);
return query_kth(ch[u][1],mid+1,r,k-s[ch[u][0]]);
}
void merge(int &a,int b,int l,int r){
if(!a){a=b;return;}
if(!b) return;
if(l==r){s[a]+=s[b];return;}
int mid=(l+r)>>1;
merge(ch[a][0],ch[b][0],l,mid);
merge(ch[a][1],ch[b][1],mid+1,r);
up(a);
}
T7:
幾乎是裸板。
->子樹與自己維護資訊相同,需要快速合併,且子樹資訊可以使用線段樹
->線段樹合併
T8:
->樹上路徑修改
->樹上差分行不行?
->迅速維護子樹資訊,考慮線段樹合併維護計數器咯
or
->樹上路徑修改
->樹鏈剖分!
->這樣就要寫樹套樹了,就根本沒有可寫性了。
->區間加,差分唄,查的時候查字首。
->修改總早於查詢,最後查的時候從小到大線段樹維護。
T9:
->式子挺有特點,推式子唄。
->考慮ai總作為大數貢獻,則線段樹需要維護個數,權和。
->維護子樹資訊,線段樹合併。
->咋合併?合併時左對左/右對右遞迴,左對右呢?一塊計算式子,over。
T10(**攢著:
![]
(https://img2024.cnblogs.com/blog/3203093/202407/3203093-20240724214010106-1404433267.png)
T11
此題注意連結串列模擬deque,當年掛了一車人MLE。
->其他都是線段樹合併裸板,2有意思,咋辦呢?
->又不能合併,就仿照思想,一塊遞迴就行了,因為個數>1/2。
->老師fxj當年做法:
區間隨機選點30次,選不到的機率1/(2^30),基本認為正確。
天才!他說要是他寫合併就現在站不到這裡了。