日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

题解 [CF1682D] Circular Spanning Tree

發(fā)布時(shí)間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 题解 [CF1682D] Circular Spanning Tree 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Codeforces link

Luogu link

題解 CF1682D

Part 0. 無(wú)解情況

首先考慮無(wú)解情況。

首先,若 sss1\texttt{1}1 的個(gè)數(shù)是奇數(shù),肯定無(wú)解。

其次,樹(shù)肯定是有葉子的,而葉子的度數(shù)肯定是 111,所以若 sss 中沒(méi)有任何一個(gè) 1\texttt{1}1,也無(wú)解。

其余情況都有解。


Part 1. 含有偶數(shù)度數(shù)節(jié)點(diǎn)的情況

我們可以把序列拆分成若干個(gè) [0,0,...,0,1][\texttt0,\texttt0,...,\texttt0,\texttt1][0,0,...,0,1] 的子序列(單獨(dú)的 1\texttt11 也可以作為一個(gè)子序列)。注意這是個(gè)環(huán),所以序列首尾相接。然后任意挑出一個(gè)位于某個(gè)子序列首的 0\texttt00 作為根。接下來(lái):

  • 每個(gè)序列連成一條鏈;
  • 每個(gè)序列的第一個(gè)元素接上根節(jié)點(diǎn)。

因?yàn)?1\texttt11 有偶數(shù)個(gè),所以鏈也有偶數(shù)條,從而根節(jié)點(diǎn)的度數(shù)也是偶數(shù),符合題意。


Part 2. 不含有偶數(shù)度數(shù)節(jié)點(diǎn)的情況

任意挑一個(gè)節(jié)點(diǎn)為根,構(gòu)造菊花圖即可。

//CF1682D #include <cstdio>const int N = 2e5 + 10; int t, n; char s[N];int main(){scanf("%d", &t);while(t--){scanf("%d%s", &n, s+1);int cnt = 0;for(int i = 1; i <= n; ++ i){if(s[i] == '1'){++ cnt;}}if(cnt == 0 || cnt & 1){puts("NO");continue;}puts("YES");if(cnt == n){for(int i = 2; i <= n; ++ i){printf("1 %d\n", i);}continue;}int st = 0;if(s[n] == '1' && s[1] == '0'){st = 1;} else {for(int i = 1; i <= n; ++ i){if(!st && s[i] == '0' && s[i-1] == '1'){st = i;}}}#define pre(i) (i==1 ? n : i-1)#define nxt(i) (i==n ? 1 : i+1)bool flg = true;for(int i = st+1; flg || i < st; ++ i){if(i == n+1){i = 1;if(st == 1) break;flg = false;}if(pre(i) == st || s[pre(i)] == '1'){printf("%d %d\n", i, st);}if(s[i] == '0'){printf("%d %d\n", i, nxt(i));}}}return 0; }

總結(jié)

以上是生活随笔為你收集整理的题解 [CF1682D] Circular Spanning Tree的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。