题意

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;
}

最新文章

  1. 国内优秀的Android资源
  2. [转]浏览器渲染机制——一定要放在body底部的js引用
  3. Jenkins学习七:Jenkins的授权和访问控制
  4. urllib3 ConnectionPools
  5. Part 10 Stored procedures in sql server
  6. HTML中的&lt;select&gt;标签如何设置默认选中的选项
  7. totolink的n200r路由在卓越网和京东网的价钱
  8. java实现xml-rpc客户端和服务端
  9. foundation 框架 NSString常用总结(二)
  10. php判断页面是电脑登录还是手机登录
  11. dbus 和 policykit 实例篇(python) ()转
  12. django开发中利用 缓存文件 进行页面缓存
  13. 2、公司部门的组成 - CEO之公司管理经验谈
  14. BZOJ 4568: [Scoi2016]幸运数字 [线性基 倍增]
  15. 数据库 MYSQL操作(一)
  16. [HAOI2008]硬币购物
  17. 【笔记】基于Python的数字图像处理
  18. pyqt5 -——菜单和工具栏
  19. CMake系列之四:多个源文件-多个目录
  20. git bash字体设置

热门文章

  1. JVM内存模型和结构详解(五大模型图解)
  2. ApacheCon 2020 参会指南
  3. ArkUI 条件渲染
  4. HTML(下)
  5. HDFS的读写流程——宏观与微观
  6. Python小游戏——外星人入侵(保姆级教程)第一章 03设置飞船图片 04创建Ship类
  7. 第九十七篇:CSS的选择器及优先级
  8. 第三十九篇:Vue3 watch(ref和reactive的监视)
  9. Linux软件包常见的几种下载、安装方法
  10. MySQL 不同隔离级别,都使用了什么锁?