目录
- 题目链接
- 题解
- 代码
题目链接
AGC016D - XOR Replace
题解
可以发现一次操作相当于一次置换
对于每个a上的位置映射到b对应
可以找到置换群中的 所有轮换
一个k个元素的轮换需要k+1步完成
那么答案就是边数+轮换数-1
-1的话发现当最一个数为缺少的数时不需吧最后一步换回来
代码
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include<map> #include<cstdio> #include<algorithm> #define gc getchar() #define pc putchar inline int read() { int x = 0,f = 1; char c = gc; while(c < '0' || c > '9')c = gc; while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = gc; return x * f; } void print(int x) { if(x < 0) { pc('-'); x = -x; } if(x >= 10) print(x / 10); pc(x % 10 + '0'); } const int maxn = 1000007; int a[maxn],b[maxn],c[maxn],d[maxn]; int n; std::map<int,int>f; int fa[maxn]; int find(int x) { if(fa[x] != x) fa[x] = find(fa[x]); return fa[x]; } int main() { n = read(); for(int i = 1;i <= n;++ i) a[i] = read(); for(int i = 1;i <= n;++ i) b[i] = read(); int t = 0; for(int i = 1;i <= n;++ i) t ^= a[i]; a[n + 1] = t; t = 0; for(int i = 1;i <= n;++ i) t ^= b[i]; b[++ n] = t; for(int i = 1;i <= n;++ i) c[i] = a[i],d[i] = b[i]; std::sort(c + 1,c + n + 1); std::sort(d + 1,d + n + 1); for(int i = 1;i <= n;++ i) { if(c[i] != d[i]) { puts("-1"); return 0; } } int tot = 0; int ans = 0; for(int i = 1;i <= n;++ i) { if(a[i] != b[i] || i == n) { if(i < n) ans ++; if(!f[a[i]])f[a[i]] = ++tot; if(!f[b[i]])f[b[i]] = ++tot; } } if(!ans) { pc('0'); return 0; } for(int i = 1;i <= tot;++ i) fa[i] = i; for(int i = 1;i <= n;++ i) { if(a[i] != b[i]) fa[find(f[a[i]])] = find(f[b[i]]); } for(int i = 1;i <= tot;++ i) if(fa[i] == i) ans ++; print(ans - 1); return 0; }
转载于:https://www.cnblogs.com/sssy/p/9874786.html
最后
以上就是轻松纸鹤最近收集整理的关于AGC016D - XOR Replace 置换/轮换题目链接题解代码的全部内容,更多相关AGC016D内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复