雜題訓練之十

2022-01-29 08:39:41 字數 2683 閱讀 3501

分析:

考慮固定左端點l,列舉它

剩下的任務就是找到最小的r,使之[l,r]能夠出現b的子串行

這樣n-r+1也就滿足,ans累加

**是反著來的,效果是一樣的

學到了

分析:

博弈論先考慮終止狀態:(切記不要死迴圈的想)

先手只剩一條邊時,先手必敗

後手只剩兩條邊時,先手必勝

然後發現本題唯一和博弈論沾邊的就是度數的奇偶性(關鍵是找對立面)

1是奇數,擴充套件開去就是,先手面臨奇數的時候一定是必敗的

為什麼?因為奇數刪了一條邊會變成偶數,後手就又刪去一條邊使得它又變成奇數

而如果先手面臨的是偶數,那麼再怎麼都不會遇到最後為1的情況

此時後手就會想盡辦法讓你的狀態變為奇數,可是他無能為力啊

吐槽:

為什麼過了大樣例卻wa了

分析:

此題的關鍵在於考慮每個元素的貢獻,而不是考慮乙個區間的貢獻

題解:

分析:本題的關鍵在如何判斷兩條路徑不會相交

還有就是可以不用差分,直接容斥一下就好

code by std:

#include#define ll long long

using namespace std;

const int n=3005;

int n,p,q,cnte,head[n];

ll f[n][n],g[n][n],fp[n],fq[n],gp[n],gq[n],sump,sumq;

ll ans;

struct edgee[n<<1];

void add(int a,int b);

head[a]=cnte;

}void dfs1(int x,int fa)

}void dfs2(int x,int fa)

}int main()

dfs1(1,0);dfs2(1,0);

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

ans=sump*sumq;

for(int i=1;i<=n;++i)ans-=fp[i]*fq[i]+fp[i]*gq[i]+fq[i]*gp[i];

printf("%lld",ans<<2);

return 0;

}

雜題訓練之十一

題目大意 詢問樹上a到b,c到d的兩條路徑是否相交 分析 我們容易發現,如果相交,記 x lca a,b y lca c,d 則必有x在cd路徑上或y在ab路徑上 關鍵就在於如何判斷它在路徑上 複習 結合如何判斷乙個點 x 是否在一條最短路上 起點 s 終點 t 各跑一次最短路 為了處理dis 如果...

雜題訓練之九

昨天和大佬們一起複習了堆 見此題不錯,於是寫一篇題解 題目大意 求長度在 l,r 的範圍的子串和前k大和 分析 考慮暴力一點,把所有滿足條件的字串加入乙個堆中 取的前k次就是前k大 發現這樣不太好 這樣的瓶頸在於要考慮所以字串 包括那些不太有用的 具體實現 對於區間 l,r 題目要求使得字串和最大,...

雜題訓練之五

奇數和偶數顯然是獨立的,我們只考慮其中一種即可。如果沒有要求字典序最小的話,則顯然相對位置不變的方案是最優的 那麼我們可以直接得到一種合法方案以及最小代價。我們用xi表示第i個數是往左,往右還是不變,那麼按xi 分段後顯然每一段是獨立的,否則代價一定大了。那麼我們考慮 xi 相同的一段。如果他們都是...