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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[欧拉路]CF1152E Neko and Flashback

發布時間:2025/7/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [欧拉路]CF1152E Neko and Flashback 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1152E - Neko and Flashback

題意:對于長為n的序列c和長為n - 1的排列p,我們可以按照如下方法得到長為n - 1的序列a,b,a',b'。

ai = min(ci, ci+1),bi = max(ci, ci+1)

a'i = ap[i],b'i = bp[i]

現在給定a'和b',求一個合法的c或者無解。

解:仔細分析性質,發現在a和b中,c除了開頭和結尾會出現1次之外,每個數都會出現兩次,且相鄰。

我們可以把c的開頭找出來,然后根據開頭確定c2,然后確定c3...最后到cn

注意到這些數可能有重復的,于是我們要試圖在中間插入一段。我一開始想的是鏈表后來發現很難寫...

仔細分析,如果把a'和b'的每個位置當成邊,數字當成點,就是求歐拉路。然后就沒了......

關于歐拉路:就暴力DFS,把每條邊都訪問一次。回溯的時候把這條邊入棧/把y入棧。

1 #include <bits/stdc++.h> 2 3 const int N = 200010; 4 5 struct Edge { 6 int nex, v, id, pre; 7 }edge[N << 1]; int tp = 1; 8 9 int X[N], xx, a[N], b[N], cnt[N], e[N], stk[N], top, deg[N]; 10 bool vis[N]; 11 12 inline void erase(int x, int i) { 13 int nex = edge[i].nex, pre = edge[i].pre; 14 if(e[x] == i && !nex) { 15 e[x] = 0; 16 } 17 else if(e[x] == i) { 18 e[x] = nex; 19 edge[nex].pre = 0; 20 return; 21 } 22 else if(!nex) { 23 edge[pre].nex = 0; 24 } 25 else { 26 edge[nex].pre = pre; 27 edge[pre].nex = nex; 28 } 29 edge[i].nex = edge[i].pre = 0; 30 return; 31 } 32 33 inline void add(int x, int y, int z) { 34 edge[++tp].v = y; 35 edge[tp].id = z; 36 edge[tp].nex = e[x]; 37 edge[e[x]].pre = tp; 38 e[x] = tp; 39 return; 40 } 41 42 void DFS(int x) { 43 for(int i = e[x]; i; i = edge[i].nex) { 44 erase(x, i); 45 int y = edge[i].v; 46 if(vis[edge[i].id]) { 47 continue; 48 } 49 vis[edge[i].id] = 1; 50 DFS(y); 51 stk[++top] = y; 52 } 53 return; 54 } 55 56 int main() { 57 58 int n; 59 scanf("%d", &n); 60 for(int i = 1; i < n; i++) { 61 scanf("%d", &a[i]); 62 X[++xx] = a[i]; 63 } 64 for(int j = 1; j < n; j++) { 65 scanf("%d", &b[j]); 66 X[++xx] = b[j]; 67 if(b[j] < a[j]) { 68 puts("-1"); 69 return 0; 70 } 71 } 72 73 std::sort(X + 1, X + xx + 1); 74 xx = std::unique(X + 1, X + xx + 1) - X - 1; 75 for(int i = 1; i < n; i++) { 76 a[i] = std::lower_bound(X + 1, X + xx + 1, a[i]) - X; 77 b[i] = std::lower_bound(X + 1, X + xx + 1, b[i]) - X; 78 add(a[i], b[i], i); 79 add(b[i], a[i], i); 80 deg[a[i]]++; 81 deg[b[i]]++; 82 } 83 int s = 0, pos = 1; 84 for(int i = 1; i <= xx; i++) { 85 if(deg[i] & 1) { 86 s++; 87 pos = i; 88 } 89 } 90 if(s != 0 && s != 2) { 91 puts("-1"); 92 return 0; 93 } 94 95 DFS(pos); 96 stk[++top] = pos; 97 if(top != n) { 98 puts("-1"); 99 return 0; 100 } 101 for(int i = top; i >= 1; i--) { 102 printf("%d ", X[stk[i]]); 103 } 104 105 return 0; 106 } AC代碼

注意復雜度,刪邊......

1 #include <bits/stdc++.h> 2 3 const int N = 200010; 4 5 struct Edge { 6 int nex, v, id; 7 }edge[N << 1]; int tp = 1; 8 9 int X[N], xx, a[N], b[N], cnt[N], e[N], stk[N], top, deg[N]; 10 bool vis[N]; 11 12 inline void add(int x, int y, int z) { 13 edge[++tp].v = y; 14 edge[tp].id = z; 15 edge[tp].nex = e[x]; 16 e[x] = tp; 17 return; 18 } 19 20 void DFS(int x) { 21 for(int i = e[x]; i; i = e[x]) { 22 e[x] = edge[i].nex; 23 int y = edge[i].v; 24 if(vis[edge[i].id]) { 25 continue; 26 } 27 vis[edge[i].id] = 1; 28 DFS(y); 29 stk[++top] = y; 30 } 31 return; 32 } 33 34 int main() { 35 36 int n; 37 scanf("%d", &n); 38 for(int i = 1; i < n; i++) { 39 scanf("%d", &a[i]); 40 X[++xx] = a[i]; 41 } 42 for(int j = 1; j < n; j++) { 43 scanf("%d", &b[j]); 44 X[++xx] = b[j]; 45 if(b[j] < a[j]) { 46 puts("-1"); 47 return 0; 48 } 49 } 50 51 std::sort(X + 1, X + xx + 1); 52 xx = std::unique(X + 1, X + xx + 1) - X - 1; 53 for(int i = 1; i < n; i++) { 54 a[i] = std::lower_bound(X + 1, X + xx + 1, a[i]) - X; 55 b[i] = std::lower_bound(X + 1, X + xx + 1, b[i]) - X; 56 add(a[i], b[i], i); 57 add(b[i], a[i], i); 58 deg[a[i]]++; 59 deg[b[i]]++; 60 } 61 int s = 0, pos = 1; 62 for(int i = 1; i <= xx; i++) { 63 if(deg[i] & 1) { 64 s++; 65 pos = i; 66 } 67 } 68 if(s != 0 && s != 2) { 69 puts("-1"); 70 return 0; 71 } 72 73 DFS(pos); 74 stk[++top] = pos; 75 if(top != n) { 76 puts("-1"); 77 return 0; 78 } 79 for(int i = top; i >= 1; i--) { 80 printf("%d ", X[stk[i]]); 81 } 82 83 return 0; 84 } 另一種刪邊方式

?

轉載于:https://www.cnblogs.com/huyufeifei/p/10958711.html

總結

以上是生活随笔為你收集整理的[欧拉路]CF1152E Neko and Flashback的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 天天天干干干 | 热久久91 | 在线美女av| 日韩在线观看视频免费 | 五月天视频网站 | 成人乱人乱一区二区三区一级视频 | 日韩视频一二三区 | 国产性xxx | 在线免费观看国产 | 2019中文字幕在线视频 | 天堂影音 | 日韩av片在线免费观看 | 少妇一级淫免费观看 | 亚洲麻豆一区二区三区 | youjizz亚洲女人 | 国产精品日韩精品欧美精品 | 黑人一区二区 | 亚洲av电影一区二区 | wwwxx国产| 天堂…中文在线最新版在线 | 亚洲AV无码成人国产精品色 | 欧美黑人性受xxxx精品 | 国产亚洲综合在线 | 色女仆影院 | 在线观看jizz | 亚洲男人网| 少妇真人直播免费视频 | 日韩精品网| 国产区高清 | 精品国产乱码久久久久久蜜柚 | 国产www| 欧美字幕| 亚洲男人天堂2018 | 一区二区成人在线观看 | 毛片福利| 国产又粗又猛又黄又爽 | 国产凹凸一区二二区 | 春色激情站 | 亚洲自拍偷拍精品视频 | 国产福利免费视频 | 国产熟女一区二区三区五月婷 | 亚洲精品国产av | www日韩在线观看 | 17c国产精品 | 成人在线视屏 | 很黄很色的视频 | 色妺妺视频网 | 夜夜看 | 爱情岛论坛永久入址在线 | 色婷婷a| 少妇精品久久久久久久久久 | 午夜影院a | 激情网站视频 | 秋霞在线观看视频 | 91桃色污 | 三级久久 | 亚洲男人天堂久久 | 动漫涩涩免费网站在线看 | 在线观看中出 | 操小妹影院 | 久久中文在线 | 综合av第一页 | 欧美性bbw | 国产农村妇女精品久久久 | 色香蕉影院 | 91福利在线播放 | 误杀1电影免费观看高清完整版 | 69视频一区二区三区 | 91久久极品少妇xxxxⅹ软件 | 红桃一区二区三区 | 亚洲性影院 | 午夜激情视频在线 | 亚洲 欧美 日韩 在线 | av色先锋 | 亚洲精品伊人 | 四虎成人影视 | 一级一片免费看 | 一区二区的视频 | 国产喷白浆一区二区三区 | 国产午夜精品一区二区三区嫩草 | 欧美激情久久久久久久 | 国产一区二区三区免费看 | 国产成人精品视频ⅴa片软件竹菊 | 日韩性xxxx | 在线免费观看一区二区 | 影音先锋中文字幕一区二区 | 天堂综合 | 亚洲一区二区三区四区av | 亚洲自拍小视频 | 韩国三级丰满少妇高潮 | 在线观看视频免费 | 雪花飘电影在线观看免费高清 | 久久久久久久久久久久久av | 日韩两性视频 | 国产av无码专区亚洲av毛片搜 | 日韩在线观看视频一区 | 又黄又湿的网站 | 中国在线观看视频高清免费 | 视频精品一区二区 |