Codeforces 1682 D Circular Spanning Tree
题意
1-n排列,构成一个圆;1-n每个点有个值0或者1,0代表点的度为偶数,1代表点的度为计数;询问能否构成一棵树,树的连边在圆内不会相交,在圆边上可以相交,可以则输出方案。

提示
1. 首先考虑什么时候无解,显然,奇数点个数是偶数,并且>=2
2. 由奇数点个数为偶数可以发现,它们可以连到同一个偶数点上(并非直接连)
3. 剩下的偶数点可以直接顺时针串联,直到连到最近的一个奇数点上
4. 相当于每个奇数点后面有一条偶数链,或者没有偶数链只有一个奇点(这都是一样的,因为链最后一个点都只剩下一个需要连的点),直接把链的最后一个点连在一起就好了
代码
#include<bits/stdc++.h>
using namespace std;
char s[200005];
void run() {
int n;
cin >> n;
cin >> s;
int ans = 0;
for (int i = 0; s[i] != '\0'; i++) {
ans += s[i] - '0';
}
if (ans % 2 || ans == 0) {
puts("NO");
return;
} else {
puts("YES");
}
int cnt = n - ans;
if (cnt == 0) {
for (int i = 2; i <= n; i++) {
cout << 1 << ' ' << i << '\n';
}
return;
}
vector<vector<int>> vec;
for (int i = 1; i <= n; i++) {
if (s[i - 1] == '1') {
vector<int> res;
res.emplace_back(i);
for (int j = i + 1; j <= n; j++) {
if (s[j - 1] == '0')res.emplace_back(j);
else {
i = j - 1;
break;
}
}
vec.emplace_back(res);
}
}
for (int i = 1; i <= n; i++) {
if (s[i - 1] == '0') {
vec.back().emplace_back(i);
} else
break;
}
int root = 1;
for (auto k: vec) {
for (int i = 1; i < k.size(); i++) {
cout << k[i-1] << ' ' << k[i] << '\n';
}
}
for (int i = 0; i < vec.size(); i++) {
if (vec[i].size() > 1) {
root = i;
}
}
for (int i = 0; i < vec.size(); i++) {
if (i == root)continue;
cout << vec[root].back() << ' ' << vec[i].back() << '\n';
}
}
int main() {
int t;
cin >> t;
while (t--)
run();
return 0;
}
Codeforces 1682 D Circular Spanning Tree的更多相关文章
- Codeforces Edu3 E. Minimum spanning tree for each edge
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- 【19.27%】【codeforces 618D】Hamiltonian Spanning Tree
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- CF1682D Circular Spanning Tree
题意: 构造题,节点1~n顺时针排列成圆形,告诉你每个点度数奇偶性,让你构造一棵树,树边不相交. 思路: 因为每条边给总度数贡献2,因此如果度数为1的点有奇数个,直接输出no.显然0个度数为1的,也输 ...
- Codeforces Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA链上最大值
E. Minimum spanning tree for each edge 题目连接: http://www.codeforces.com/contest/609/problem/E Descrip ...
- Codeforces Educational Codeforces Round 3 E. Minimum spanning tree for each edge 树上倍增
E. Minimum spanning tree for each edge 题目连接: http://www.codeforces.com/contest/609/problem/E Descrip ...
- Educational Codeforces Round 3 E. Minimum spanning tree for each edge LCA/(树链剖分+数据结构) + MST
E. Minimum spanning tree for each edge Connected undirected weighted graph without self-loops and ...
- CF# Educational Codeforces Round 3 E. Minimum spanning tree for each edge
E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...
- [Educational Round 3][Codeforces 609E. Minimum spanning tree for each edge]
这题本来是想放在educational round 3的题解里的,但觉得很有意思就单独拿出来写了 题目链接:609E - Minimum spanning tree for each edge 题目大 ...
- Educational Codeforces Round 3 E. Minimum spanning tree for each edge 最小生成树+树链剖分+线段树
E. Minimum spanning tree for each edge time limit per test 2 seconds memory limit per test 256 megab ...
随机推荐
- Linux 09 Vim
参考源 https://www.bilibili.com/video/BV187411y7hF?spm_id_from=333.999.0.0 版本 本文章基于 CentOS 7.6 概述 Vi Vi ...
- JavaScript 异步编程(二):Promise
PromiseState Promise 有一个 [[PromiseState]] 属性,表示当前的状态,状态有 pending 和 fulfill 以及 reject. 从第一个 Promise 开 ...
- P7727 风暴之眼 Eye of the Storm (树形 DP)
谨 以 此 文 表 达 笔 者 个 人 观 点 , 如 有 冒 犯 官 解 , 可 在 评 论 区 诉 说 _{^{_{谨以此文表达笔者个人观点,如有冒犯官解,可在评论区诉说}}} 谨以此文表达笔者个 ...
- 完全解析Array.apply(null, { length: 1000 })
Array.apply(null, { length: 1000 }) 点击打开视频讲解更加详细 在阅读VueJS教程时有这么段demo code: render: function (createE ...
- Springboot shiro JWT集成总结
SpringBoot Shiro JWT 1.建表 DDL.sql CREATE TABLE `t_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, ` ...
- 《!--suppress ALL --> 在Android XML 文件中的用途是什么?
<!--suppress ALL --> 在Android XML 文件中的用途是什么? 警告一次又一次地出现在谷歌地图的 XML 文件中,但是当我使用时,所有警告都被禁用.那么压制所有评 ...
- day37-IO流04
JavaIO流04 4.常用的类03 4.4节点流和处理流02 4.4.5对象处理流-ObjectInputStream和ObjectOutputStream 1.序列化和反序列化 例子1: 看一个需 ...
- Java 函数式编程
由 JS 转 Java,写惯了 React,习惯了函数式,因此转 Java 时也是先学函数式. 语法糖「Syntactic Sugar」 起初,Java 的函数式看起来是匿名类的一个语法糖. Stre ...
- HashMap不安全后果及ConcurrentHashMap线程安全原理
Java集合HashMap不安全后果及ConcurrentHashMap 原理 目录 HashMap JDK7 HashMap链表循环造成死循环 HashMap数据丢失 JDK7 Concurrent ...
- 对比es6class类和构造函数
构造函数 在原来class 类这个语法糖没有出来之前 我们一般会把方法挂在prototype 上 为了防止过多的开辟内存 1 // 构造函数------------------------------ ...