欧拉路径

神题啊神题!这道题的突破口就是后两个数组每个元素是一一对应的。

也就是说,对于一个p的排列,b'和c'取得每一个元素的下标在p中都是一样的。

根据b和c数组的性质可以得出,b[i] <= c[i]。

这也是我们输出-1的一个判断方法。

再来看b和c两个数组,他们是由原数组相邻两个数分别取min和max构造出来的,很容易看出b'和c'同一个位置的两个数一定在原数组中相邻。

我们可以根据这个相邻关系建图,a若与b在原数组中相邻,就连一条无向边,那么最后我们要构造的合法数组即为该无向图的一条欧拉路径。

因为数据比较大,所以我们要先离散化,再考虑有重边,我们可以用multiset来存图,跑过的边直接删除就行了。

#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
#define full(a, b) memset(a, b, sizeof a)
using namespace std;
typedef long long ll;
inline int lowbit(int x){ return x & (-x); }
inline int read(){int X = 0, w = 0; char ch = 0;while(!isdigit(ch)) { w |= ch == '-'; ch = getchar(); }while(isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();return w ? -X : X;
}
inline int gcd(int a, int b){ return a % b ? gcd(b, a % b) : b; }
inline int lcm(int a, int b){ return a / gcd(a, b) * b; }
template<typename T>
inline T max(T x, T y, T z){ return max(max(x, y), z); }
template<typename T>
inline T min(T x, T y, T z){ return min(min(x, y), z); }
template<typename A, typename B, typename C>
inline A fpow(A x, B p, C lyd){A ans = 1;for(; p; p >>= 1, x = 1LL * x * x % lyd)if(p & 1)ans = 1LL * x * ans % lyd;return ans;
}
const int N = 200005;
int n, k, b[N], c[N], p[N], d[N];
vector<int> rd;
multiset<int> g[N];void dfs(int s){for(auto it = g[s].begin(); it != g[s].end(); it = g[s].begin()){int u = *it;g[s].erase(it), g[u].erase(g[u].lower_bound(s));dfs(u);}rd.push_back(s);
}int main(){ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);n = read();for(int i = 1; i < n; i ++) b[i] = read(), p[++k] = b[i];for(int i = 1; i < n; i ++) c[i] = read(), p[++k] = c[i];for(int i = 1; i < n; i ++){if(b[i] > c[i]){printf("-1\n");return 0;}}sort(p + 1, p + k + 1);k = (int)(unique(p + 1, p + k + 1) - p - 1);for(int i = 1; i < n; i ++){b[i] = (int)(lower_bound(p + 1, p + k + 1, b[i]) - p);c[i] = (int)(lower_bound(p + 1, p + k + 1, c[i]) - p);}for(int i = 1; i < n; i ++){g[b[i]].insert(c[i]), g[c[i]].insert(b[i]);d[b[i]] ++, d[c[i]] ++;}int t = 0;for(int i = 1; i <= k; i ++){if(d[i] & 1) t ++;}if(t != 0 && t != 2){cout << "-1" << endl;return 0;}bool odd = false;for(int i = 1; i <= k; i ++){if(d[i] & 1){odd = true, dfs(i);break;}}if(!odd) dfs(1);if(rd.size() != n) cout << "-1" << endl;else{for(int i = rd.size() - 1; i >= 0; i --){cout << p[rd[i]];if(i != 0) cout << " ";}puts("");}return 0;
}

转载于:https://www.cnblogs.com/onionQAQ/p/10820877.html

Codeforces Round #554 Div.2 E - Neko and Flashback相关推荐

  1. Codeforces Round #554 (Div. 2) 1152A - Neko Finds Grapes

    学了这么久,来打一次CF看看自己学的怎么样吧 too young too simple 1152A - Neko Finds Grapes 题目链接:"https://codeforces. ...

  2. Codeforces Round #554 (Div. 2) C. Neko does Maths (简单推导)

    题目:http://codeforces.com/contest/1152/problem/C 题意:给你a,b, 你可以找任意一个k     算出a+k,b+k的最小公倍数,让最小公倍数尽量小,求出 ...

  3. Codeforces Round #554 (Div. 2) C. Neko does Maths (数论 GCD(a,b) = GCD(a,b-a))

    传送门 •题意 给出两个正整数 a,b: 求解 k ,使得 LCM(a+k,b+k) 最小,如果有多个 k 使得 LCM() 最小,输出最小的k: •思路 时隔很久,又重新做这个题 温故果然可以知新❤ ...

  4. Codeforces Round #554 (Div. 2) A. Neko Finds Grapes

    原题地址 这道题还是很水的,但是自己有点小傻...一开始纯暴力一发直接TLE....然后开始找规律,发现只要使第一行的奇数与第二行的偶数判断大小就行,同理第一行的偶数与第二行的奇数判断大小. 其他也就 ...

  5. A. Neko Finds Grapes-奇偶的性质及运用-Codeforces Round #554 (Div. 2)

    Neko Finds Grapes time limit per test 2 seconds memory limit per test 256 megabytes 题目链接https://code ...

  6. CodeForces Round #554 Div.2

    A. Neko Finds Grapes 代码: #include <bits/stdc++.h> using namespace std;const int maxn = 1e5 + 1 ...

  7. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  8. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  9. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

最新文章

  1. BZOJ 2190: [SDOI2008]仪仗队
  2. 关于GCN,我有三种写法
  3. ES关于文档的基本操作
  4. 透过【百度地图API】分析双闭包问题
  5. 电子设计竞赛作品设计步骤
  6. 应用密码学:协议、算法与C源程序(学习第二章)
  7. GMSK信号调制公式与matlab代码
  8. 17.JAVA对象的进阶
  9. 恢复文件默认打开方式
  10. Java面试--堆和栈的概念和区别
  11. mysql日期返回周一_MYSQL如何获得指定日期所在周周一的日期?
  12. 创建学生、课程、老师、学生成绩表
  13. 【超详细】对比10种优化函数BGD、SGD、mini-batch GD、Momentum、NAG、Adagrad、RMSProp、Adadelta、Adam、AMSgrad
  14. 海思USB2.0、USB3.0 Device UVC规格热插拔会不识别
  15. 2021年安徽省大数据与人工智能竞赛人工智能现场赛2和3题
  16. 【读书】如何改善拖延——《拖延心理学》
  17. js 手机端禁用返回键
  18. 读书2 ---《动物庄园》
  19. 不交“人脉”交朋友:新荣耀的底气与新机
  20. 三种近场通信的特点及未来分析与预测

热门文章

  1. java原子操作cas_java并发编程系列二:原子操作/CAS
  2. ios不行安卓可以 微信签名_王者荣耀安卓、iOS互通来了!现在可以互看好友资料...
  3. 计算机和公文写作买什么资料,公文写作和计算机应用笔试和复习大纲资料.doc...
  4. 五年级数学上册用计算机探索规律,人教版小学五年级数学上册《用计算器探索规律》课后反思...
  5. hdfs数据节点分发什么协议_分布式文件系统HDFS解析
  6. HP Z840 工作站配sSAS Raid 安装 Ubuntu 16.04 系统
  7. github图---小章鱼图标
  8. 10分钟看懂浏览器的渲染过程及优化
  9. My97 DatePicker获取自定义日期的前一天
  10. 异步下载圆形进度条显示进度