首页 > 其他分享 >Codeforces 1682 D Circular Spanning Tree

Codeforces 1682 D Circular Spanning Tree

时间:2022-10-23 12:33:47浏览次数:53  
标签:cnt 奇数 int Tree Codeforces 偶数 1682 ans Spanning

题意

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

标签:cnt,奇数,int,Tree,Codeforces,偶数,1682,ans,Spanning
From: https://www.cnblogs.com/4VDP/p/16818342.html

相关文章

  • loj3885. 「eJOI2022」Bounded Spanning Tree
    草稿:非树边\(u,v,[l,r]\)把\(u,v\)路径上所有边上界与\(r-1\)取个\(\min\)。剩下的边左端点排序后贪心,每次取右端点最小的一个元素。开始只考虑树边。当前加入一......
  • java基础HashSet 集合TreeSet集合
           ......
  • Seq2Path: Generating Sentiment Tuples as Paths of a Tree
    Seq2Path:GeneratingSentimentTuplesasPathsofaTreeSeq2Path:生成情感元组作为树的路径AuthorInformation:YueMao,YiShen,JingchaoYang,XiaoyingZhu,Lon......
  • Layui 之TreeTable(树形数据表格),适用于权限、部门等
    TreeTable.js下载链接:​​https://pan.baidu.com/s/1lLBge_4MSSViLztwTnPfkA​​提取码:whj3一、效果图 二、前端代码{includefile='common/header'}<divclass="layui-fl......
  • Codeforces1695 D1.+D2 Tree Queries
    题意给一个n个点的无向图,其中有一个隐藏点X,可以进行一组询问S来确定S是n个节点中的哪个点。S包括k个询问节点。询问返回的值也为k个值,每个值为X点到每个询问节点的最短路......
  • gin框架(1)- 路由原理:trie和radix tree
    1.前言本篇是对gin框架源码解析的第一篇,主要讲述gin的路由httprouter的原理:radixtree(压缩字典树)。2.Trie(字典树)在讲述radixtree之前,不得不简单提到radixtree......
  • Sourcetree 提交顺序
    总结:一共5个步骤1.首先获取git主分支的代码。2.暂存所需要上传的代码。3.拉取代码(如发生文件冲突先暂不处理)。4.提交代码,然后再次拉取代码(不显示冲突跳下一步)。如果......
  • B. Apple Tree 暴力 + 数学
    ​​http://codeforces.com/problemset/problem/348/B​​注意到如果顶点的数值确定了,那么它分下去的个数也就确定了,那么可以暴力枚举顶点的数值。顶点的数值是和LCM相隔的,L......
  • 史上最简单的JAVA集合(List)转树(Tree)方法
    /***将数据转换为树型结构**@paramsourcessources*@return{@linkList<DemoData>}*/publicstaticList<DemoData>transToTree(List<D......
  • Layui+treetable树实现 权限菜单多选单选
    HTML代码 所需文件我也一并上传链接:https://pan.baidu.com/s/1bAB2Pf5Dp5BDqEsMyrmWow?pwd=6666提取码:6666  效果图  需要注意的是这个不用多维数组但是要......