題目:
思路題;
首先,這種問題應該注意到答案只跟度數有關,跟其他什麼連線方法之類的完全無關;
關注最終狀態,每個點度數都是2,所以對於原來度數不是2的需要進行處理;
也就是度數大於2的進行一次操作分成若干個2,如果是奇數那麼留下乙個1的等待合併,可以知道最終一定有偶數個度數為1的點;
然後考慮不是乙個連通塊的情況,需要把所有連通塊變成鏈,再把它們連起來;
如果之前拆分過點,那麼可以順便多拆出兩個度數為1的點,不損耗次數;
而如果原來就是乙個尤拉迴路,那麼需要多拆一次;
然後合併,答案加上 度數為1的點數/2;
鍛鍊思路和碼力啊!
**如下:
#include#include#include
using
namespace
std;
intconst maxn=150005
;int
n,m,deg[maxn],fa[maxn],ans,sum,cnt;
bool
split[maxn],odd[maxn];
int find(int x)
intmain()
//if(!y)
if(!x)x=++n;
if(!y)y=++n;
deg[x]++; deg[y]++; fa[find(x)]=find(y);
}for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++)
if(find(i)==i&&!odd[i]&°[i]&&cnt>1
)
printf("%d
",ans+sum/2
);
return0;
}
BZOJ2503 HAOI2006 均分資料
bzoj luogu 如果已經確定了乙個序列,現要求把這個序列分成m個連續段作為答案,那麼就可以用乙個顯而易見的dp dp顯然可以得到當前序列下的最優解。所以模擬退火瞎jb改一改序列每次dp一下就可以了 據說這題random shuffle可以ac include include include i...
bzoj 3230 相似子串
time limit 20 sec memory limit 128 mb submit 1767 solved 438 submit status discuss 輸入第1行,包含3個整數n,q。q代表詢問組數。第2行是字串s。接下來q行,每行兩個整數i和j。1 i j 輸出共q行,每行乙個數表示...
BZOJ 3230 相似子串
給定乙個長度為 n 的字串以及 q 組查詢,每組查詢給定 a 和 b 求在所有本質不同子串中排名第 a 和第 b 的串的最長公共字首與最長公共字尾的平方和.n,q le 1 times 10 5 字尾陣列板子題.麻麻我終於會用字尾陣列辣 本來想接著用sam的.但是發現多組查詢排名為 k 的本質不同子...