省選測試9

2022-01-10 15:02:03 字數 3187 閱讀 1401

這個名次已經是倒數了

感覺整場考試不是很在狀態,正解想不到,暴力分也沒有打滿

其實前兩道題仔細推一下還是能想出來的

\(t1\ 2-sat\) 有一段時間沒有打了

優化建圖的方式和之前的某道題挺像的,但是當時那道題沒改

這次算是補了乙個鍋

\(t2\) 的資料範圍折半列舉也不難想,實現時注意一下細節就行了

\(t3\) 有一定的思維量

對於每乙個字串,我們把它拆成兩個狀態

乙個代表問號處填 \(0\) 的方案,乙個代表問號處填 \(1\) 的方案

對於每乙個字串,列舉其它會與它產生衝突的字串,向其反狀態連邊

然後跑乙個 \(2-sat\) 就行了

這樣建圖的複雜度是 \(n^2\) 的

上述做法問題在於邊數太多,因此我們考慮先列舉問號,然後把所有可能串建成一棵 \(trie\)

在 \(trie\) 樹上,我們只需要由當前的節點向其反狀態的所有祖先和兒子連邊

具體的做法是多開兩條鏈來輔助我們進行連邊優化

就是圖中右面的節點兩邊的邊

鏈上反映的就是 \(trie\) 上的父子關係

在兩條鏈上又都有多個節點,和我們需要連邊的節點連在一起

那麼我們連邊時就可以這樣連

最終建出來的圖就是這個樣子的

圖是嫖ljh巨佬的

還有乙個問題就是 \(trie\) 樹上乙個節點可能包含多個不同的字串

我們需要強行規定乙個父子關係

#include#include#include#include#define rg register

const int maxn=4e6+5;

int n,len[maxn],h[maxn],tot=1,cnt=1,tr[maxn][2];

struct asdb[maxn];

void ad(rg int aa,rg int bb)

int dfn[maxn],dfnc,low[maxn],shuyu[maxn],scc,sta[maxn],tp,wz[maxn];

void tar(rg int now) else if(!shuyu[u])

} if(dfn[now]==low[now]) }}

char s[maxn];

std::vectorg[maxn];

std::vectornode[maxn];

int fa[maxn];

void insert(rg int id,rg int op)

int getdown(rg int id)

void solvezx(rg int id)

void solvech(rg int id)

void build(rg int da,rg int fa)

rg int cs=mmax^zt;

for(rg int i=0;i&v1,std::vector&v2,rg long long val)

if(v1[i]+v2[tail]==val) }}

int main()

} mmax=(1首先容易想到二分答案

因此現在的問題是選取乙個葉子遍歷順序

使得中間葉子間距離都 \(\leq mid\)

由於每條樹邊最多經過兩次,所以這是乙個 \(dfs\)

每棵子樹都是一進一出

對於有兒子的節點,它要在兩個兒子的進出中分別選擇乙個進行合併更新答案,剩餘兩個加上邊權後上傳

設進出中較大的乙個為 \(a\),設較小的乙個為 \(b\),左兒子為 \(lc\),右兒子為 \(rc\)

如果 \(lc.a+rc.a \leq lim\),肯定要把較大的在當前節點合併,然後把較小的上傳

如果 \(lc.a+rc.b > lim\) 並且 \(lc.b+rc.a>lim\),此時只能把較大的兩個上傳,把較小的兩個合併

對於其它的情況,我們分類討論能不能上傳 \(lc.a+rc.b\) 和 \(lc.b+rc.a\) 即可

如果乙個答案的 \(a\) 和 \(b\) 比另乙個答案的 \(a\) 和 \(b\) 都大,這個答案肯定是沒有用的,直接把它排除就行了

最終的狀態數不會很多,大概是 \(nlogn\) 級別的

#include#include#include#include#define rg register

inline int read()

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

return x*fh;

}const int maxn=1e6+5;

int h[maxn],tot=1,n,fa[maxn],lim,tag,lc[maxn],rc[maxn],w[maxn];

struct asdb[maxn];

void ad(rg int aa,rg int bb)

void dfs(rg int now)

}struct node

node(rg int aa,rg int bb)

};std::vectorg[maxn];

bool cmp(rg node aa,rg node bb)

solve(lc[now]);

solve(rc[now]);

for(rg int i=0;i=lim && g[lc[now]][i].b+g[rc[now]][j].a>=lim)

} else

} }if(g[now].size()==0)

std::sort(g[now].begin(),g[now].end(),cmp);

tmp.clear();

for(rg int i=0;i>1;

if(jud(mids)) r=mids-1;

else l=mids+1;

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

return 0;

}

省選測試9

咕咕咕咕咕.給出一些山頂的座標 x i,y i 每在乙個山頂,你將會找到當前能夠看到的最高的山頂 乙個山頂 p 能看到另乙個山頂 q 當且僅當它們的連線 p,q 只與 p,q 相交 爬到最高的山頂後你會停下來,要計算對於每個山頂,如果從這裡開始爬,會爬過幾個山頂.重複經過算多次 y 座標相同的情況下...

省選模擬9 題解

直接將 varphi i j 展開為 varphi i varphi j frac 於是可以套用莫比烏斯反演。最終的式子大概是 sum limits f t sum limits sum limits varphi i t varphi j t dis p p 然後我的思路就偏了。為了統計 dis ...

省選測試21

設 f i 為上一次參加的比賽是第 i 場的最大愉悅值 則 f i max f i f j frac a i j 對於隨機的資料,把列舉的範圍卡到 3000 即可 容易發現,如果沒有 a j leq a i 的限制,那麼就是乙個裸的斜率優化 dp 把 f i frac frac 看做 y 把 i 看...