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 ...
随机推荐
- Map集合的遍历方式以及TreeMap集合保存自定义对象实现比较的Comparable和Comparator两种方式
Map集合的特点 1.Map集合中保存的都是键值对,键和值是一一对应的 2.一个映射不能包含重复的值 3.每个键最多只能映射到一个值上 Map接口和Collection接口的不同 Map是双列集合的根 ...
- Apache DolphinScheduler 使用文档(7/8):系统参数及自定义参数
本文章经授权转载,原文链接: https://blog.csdn.net/MiaoSO/article/details/104770720 目录 7. 参数 7.1 系统参数 7.2 时间自定义参数 ...
- Find-Vulnerability 自动化探测扫描工具简介
Fvuln 简介 F-vuln(全称:Find-Vulnerability)是一款自动化探测扫描工具,主要适用于日常安全服务.渗透测试人员和RedTeam红队人员使用 它集合的功能包括: 存活IP探测 ...
- NOI P序列题 (二分)
题面 题解 --WQS二分 想到这个这题就完了. 赛时没想到这个你就完了. 时间复杂度 O ( n log a ) O(n\log a) O(nloga) 不难发现这题有凸性,可以WQS二分. 我 ...
- [NOI2021] 密码箱 (平衡树,连分数,Stern-Brocot 树,矩阵)
题面 记忆犹新 题解 f f f 函数值给得非常明显,一看就给人一种熟悉感--这不是连分数吗? 众所周知,连分数有个递推公式,即 p i = a i p i − 1 + p i − 2 q i = a ...
- JZOJ3542冒泡排序
题面 下面是一段实现冒泡排序算法的C++代码: for (int i=1;i<=n-1;i++) for (int j=1;j<=n-i ;j++) if(a[j]>a[j+1] ...
- C#基础_XML文件介绍
XML简介 XML 被设计用来传输和存储数据. HTML 被设计用来显示数据. 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语 ...
- 【python】一些python用法规律笔记
作为本科用了多年MATLAB的工科生,学起来python有些似曾相识但也有些不习惯的地方. 在这里总结一下,慢慢整理,希望能巩固python语法 一.前闭后开 这个是和MATLAB很大不同.不论是ra ...
- Linux安装Jenkins及配置svn使用
目录 1. 下载 2. 创建文件夹 3. 安装 4. 修改端口,不用这步 5. 安装插件提速 6. 启动 7. 页面访问 8. 新建用户 9. 安装Subversion插件 10. 安装maven插件 ...
- Python自学教程12-类和对象怎么用
Python是一门现代化的编程语言,也是一门面向对象的编程语言. 现代编程语言几乎都支持面向对象编程,面向对象编程是最有效的软件编写方法之一.你可以用类和对象来表示现实当中的任何的事物和行为. 编写类 ...