20240724總結

hhhhhua發表於2024-07-24

上午模擬賽100+50+0+0.
T3本來能拿更高的分數,但是預處理放到裡面了。

T1\((kruskal+lca)\)

最小瓶頸生成樹/最短路。
其實仔細想想,讓他們之間最大邊最短,其實就是最短的代價連通。據此得到解決。

T2

構造序列a:

\[i\&1 :a[i] = i + 1 / 2 \]

\[i \% 2 == 0:a[i] = n + 1 - i / 2 \]

現在有\(q<=1e5\)次詢問:有多少區間的和=s?

觀察性質咯。
這個序列可以寫成

觀察區間和->相鄰和?

\[i\&1 :a[i] + a[i + 1] = n + 1 \]

\[i \% 2 == 0:a[i] + a[i + 1] = n + 2 \]

據此分類討論。

具體來說:
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),基本認為正確。
天才!他說要是他寫合併就現在站不到這裡了。