• CF1152E Neko and Flashback——欧拉路径


    RemoteJudge
    第一次见到欧拉路径的题
    注意到(b)(c)的构造方法很特殊,即对于一个位置(经过(p)作用后)(i),若两个数分别为(b_i)(c_i),那么在(a)(b_i)(c_i)相邻
    其实(p)并没有什么用
    从每一个(b_i)(c_i)连边,那么问题转化为是否存在一条长度为(n)的欧拉路径,直接(dfs)就行了
    几个(-1)的情况:
    1.存在(i),使得(b_i> c_i)
    2.不存在欧拉路径
    3.求出来的路径长度不为(n)
    上代码:

    //
    //                            _ooOoo_
    //                           o8888888o
    //                           88" . "88
    //                           (| -_- |)
    //                           O  =  /O
    //                        ____/`---'\____
    //                      .'  \|     |//  `.
    //                     /  \|||  :  |||//  
    //                    /  _||||| -:- |||||-  
    //                    |   | \  -  /// |   |
    //                    | \_|  ''---/''  |   |
    //                      .-\__  `-`  ___/-. /
    //                  ___`. .'  /--.--  `. . __
    //               ."" '<  `.___\_<|>_/___.'  >'"".
    //              | | :  `- \`.;` _ /`;.`/ - ` : | |
    //                 `-.   \_ __ /__ _/   .-` /  /
    //         ======`-.____`-.___\_____/___.-`____.-'======
    //                            `=---='
    //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    //                     佛祖保佑      全是BUG
    #include <algorithm>
    #include  <iostream>
    #include   <cstdlib>
    #include   <cstring>
    #include    <cstdio>
    #include    <string>
    #include    <vector>
    #include     <cmath>
    #include     <ctime>
    #include     <queue>
    #include       <map>
    #include       <set>
    
    using namespace std;
    
    #define ull unsigned long long
    #define pii pair<int, int>
    #define uint unsigned int
    #define mii map<int, int>
    #define lbd lower_bound
    #define ubd upper_bound
    #define ll long long
    #define mp make_pair
    #define pb push_back
    #define re register
    #define il inline
    
    #define N 100000
    
    int n, m, tot;
    mii id;
    multiset<int> to[2*N+5];
    int ans[10*N+5], tp, d[2*N+5], cnt, p[10*N+5];
    int b[N+5], c[N+5], val[2*N+5];
    
    void dfs(int u) {
      for(auto i = to[u].begin(); i != to[u].end(); i = to[u].begin()) {
        auto v = *i;
        to[u].erase(i), to[v].erase(to[v].lbd(u));
        dfs(v);
      }
      ans[++tp] = u;
    }
    
    int main() {
      scanf("%d", &n);
      for(int i = 1; i < n; ++i) {
        scanf("%d", &b[i]);
        if(!id.count(b[i])) id[b[i]] = ++tot, val[tot] = b[i];
      }
      for(int i = 1; i < n; ++i) {
        scanf("%d", &c[i]);
        if(b[i] > c[i]) {
          printf("-1
    ");
          return 0;
        }
        if(!id.count(c[i])) id[c[i]] = ++tot, val[tot] = c[i];
        to[id[c[i]]].insert(id[b[i]]), to[id[b[i]]].insert(id[c[i]]);
        d[id[c[i]]]++, d[id[b[i]]]++;
      }
      for(int i = 1; i <= tot; ++i) if(d[i]&1) p[++cnt] = i;
      if(cnt != 0 && cnt != 2) printf("-1
    ");
      else {
        if(cnt == 0) dfs(1);
        else dfs(p[1]);
        if(tp != n) printf("-1
    ");
        else {
          while(tp) printf("%d ", val[ans[tp--]]);
          printf("
    ");
        }
      }
      return 0;
    }
    
  • 相关阅读:
    Android应用开发提高系列(1)——《Practical Java 中文版》读书笔记(上)
    Android开发指南(35) —— Toast Notifications
    Android开发指南(37) —— Data Backup
    Android开发指南(36) —— Search
    [转]闲话操作系统1
    [从架构到设计]第二回:对象的旅行对象和人,两个世界,一样情怀
    [Thinking]从赢在中国,思考博客园的商业化
    [你必须知道的.NET]目录导航
    070809
    [CLR团队公告]CLR基础研究团队纲领
  • 原文地址:https://www.cnblogs.com/dummyummy/p/10770876.html
Copyright © 2020-2023  润新知