這個名次已經是倒數了
感覺整場考試不是很在狀態,正解想不到,暴力分也沒有打滿
其實前兩道題仔細推一下還是能想出來的
\(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 看...