SCU2016-06 Q题并查集 + set
来源:互联网 发布:网络视频电话软件 编辑:程序博客网 时间:2024/05/20 00:14
题意:给你一些交换规则,然后求任意使用这些交换规则后,排列的字典序最大。
分析:
很容易想到贪心的满足前面的为最大的贪心。
然后对于这些交换规则建图,任意一个联通分量里的元素是可以互换的。
我们把这个联通分量的所有值加入一个set,然后从联通分量重靠前的数开始在set末尾取即可。
求联通分量用并查集即可。
心得:
并查集可以直接给连通分量标号。
二元互换关系很容易写成无向图中的边建图。
/****/#include <iostream>#include <cstdio>#include <set>using namespace std;const int maxn = 1e6 + 7;int A[maxn], par[maxn], rnk[maxn];int find(int x) { if (x == par[x]) return x; return par[x] = find(par[x]);}void unite(int x, int y) { x = find(x), y = find(y); if (x == y) return; if (rnk[x] < rnk[y]) par[x] = y; else { par[y] = x; if (rnk[x] == rnk[y]) rnk[x]++; }}set<int> st[maxn];int main(void) { // freopen("in.txt", "r", stdin); int n, m; scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) scanf("%d", &A[i]); for (int i = 0; i < n; i++) par[i] = i; for (int i = 0; i < m; i++) { int x, y; scanf("%d%d", &x, &y); unite(x - 1, y - 1); } for (int i = 0; i < n; i++) { st[find(i)].insert(A[i]); } for (int i = 0; i < n; i++) { int p = find(i); printf("%d ", *--st[p].end()); st[p].erase(--st[p].end()); } puts(""); return 0;}
0 0
- SCU2016-06 Q题并查集 + set
- SCU2016-01 C题 并查集维护
- SCU2016-01 D题 并查集判断连通
- SCU2016-02 Q题区间dp入门
- SCU2016-02 Q题区间dp
- 【并查集】集合 set
- zoj3261(并查集+set)
- Disjoint-Set并查集
- 并查集(disjoint-set forests)
- 并查集(union-set)
- 并查集 (Disjoint Set)
- 并查集(Union-Find Set)
- 并查集(disjoint set)结构介绍
- zoj3641 Information Sharing 并查集+set
- zoj 3641 并查集+set
- Disjoint set(并查集) data structure
- 并查集(Disjoint Set)
- 并查集 Union-Find-Set
- 优雅编程之这样写测试用例,你就”正常“了!
- Android Studio 2.0 发布
- [原创]AndroidMVP模式之:通过注解绑定Presenter
- 超出的字用省略号来代替
- 填坑法---快速搞定快速排序算法
- SCU2016-06 Q题并查集 + set
- stl学习(一)优先队列
- 不用加减乘除做加法 C++
- Android应用基础知识
- 【干货】移动APP安全测试要点解析
- 阿里巴巴开源项目 Druid 负责人温少访谈
- 使用新手MDK时候,有关警告:last line of file ends without a newline解决办法
- scala:牛顿迭代法求平方根
- 算法的计算