ZOJ - 3261 逆向并查集
思路:很巧妙的解法。如果按照常规一边读入,一边合并并查集,删边实在没办法做。
首先读入所有的操作,把所有不会被删除的边加入并查集,然后从最后一个操作开始逆向操作,当遇到删边操作,就直接把这条边加入并查集。可以用一个栈保存答案。
注意:当有两个power相同的时候,选择编号更小的。输出之间有空行。
AC代码
#include <cstdio> #include <cmath> #include <cctype> #include <algorithm> #include <cstring> #include <utility> #include <string> #include <iostream> #include <map> #include <set> #include <vector> #include <queue> #include <stack> using namespace std; #pragma comment(linker, "/STACK:1024000000,1024000000") #define eps 1e-10 #define inf 0x3f3f3f3f #define PI pair<int, int> typedef long long LL; const int maxn = 1e4 + 5; int p[maxn], a[maxn]; struct node{ int x, y; }b[maxn<<1]; struct oper{ char s[20]; int x, y; }q[maxn*5]; int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); } void unionset(int x, int y) { int rx = find(x), ry = find(y); if(a[rx] == a[ry]) { //当二者的值相同 if(rx < ry) p[ry] = rx; else p[rx] = ry; } else if(a[rx] < a[ry]) { p[rx] = ry; } else p[ry] = rx; } int main() { int n, m, kase = 0; while(scanf("%d", &n) == 1) { if(kase++) printf("\n"); for(int i = 0; i <= n; ++i) p[i] = i; for(int i = 0; i < n; ++i) scanf("%d", &a[i]); scanf("%d", &m); int x, y; for(int i = 1; i <= m; ++i) { scanf("%d%d", &b[i].x, &b[i].y); if(b[i].x > b[i].y) swap(b[i].x, b[i].y); } int Q; scanf("%d", &Q); getchar(); map<PI, int>ha; char s[30]; for(int i = 1; i <= Q; ++i) { fgets(s, sizeof(s), stdin); if(s[0] == 'd') { sscanf(s, "%s%d%d", &q[i].s, &q[i].x, &q[i].y); if(q[i].x > q[i].y) swap(q[i].x, q[i].y); PI pi = make_pair(q[i].x, q[i].y); ha[pi] = 1; //printf("%s %d %d\n", q[i].s, q[i].x, q[i].y); } else { sscanf(s, "%s%d", &q[i].s, &q[i].x); //printf("%s %d\n", q[i].s, q[i].x); } } //建立并查集 for(int i = 1; i <= m; ++i) { if(!ha.count(make_pair(b[i].x, b[i].y))) { unionset(b[i].x, b[i].y); } } //逆向 stack<int>ans; for(int i = Q; i > 0; --i) { if(q[i].s[0] == 'q') { int r = find(q[i].x); if(a[r] <= a[q[i].x]) ans.push(-1); else ans.push(r); } else unionset(q[i].x, q[i].y); } while(!ans.empty()) { printf("%d\n", ans.top()); ans.pop(); } } return 0; }
如有不当之处欢迎指出!
ZOJ - 3261 逆向并查集的更多相关文章
- zoj 3261 逆向并查集+离线处理
题意:给出一些点,每个点有权值,然后有一些边,相连.无向的.然后有一些操作 链接:点我 query a.表示从a出发的能到达的所有点权值最大的点的编号(相同取编号最小,而且权值要比自己大) desto ...
- ZOJ 3261 Connections in Galaxy War(逆向并查集)
参考链接: http://www.cppblog.com/yuan1028/archive/2011/02/13/139990.html http://blog.csdn.net/roney_win/ ...
- HDU - 4496 City 逆向并查集
思路:逆向并查集,逆向加入每一条边即可.在获取联通块数量的时候,直接判断新加入的边是否合并了两个集合,如果合并了说明联通块会减少一个,否则不变. AC代码 #include <cstdio> ...
- HDU_4496_逆向并查集
http://acm.hdu.edu.cn/showproblem.php?pid=4496 逆向并查集,先读取,然后从后向前join每次保存答案即可. #include<iostream> ...
- 逆向并查集 hrbust 1913
#include<iostream> //由于拆除并查集的方法太难或者没有#include<cstdio> //可以先将所有没有拆的桥连接 再逆向操作 断开变成连接 反向输出# ...
- Connections in Galaxy War (逆向并查集)题解
Connections in Galaxy War In order to strengthen the defense ability, many stars in galaxy allied to ...
- ZOJ3261:Connections in Galaxy War(逆向并查集)
Connections in Galaxy War Time Limit: 3 Seconds Memory Limit: 32768 KB 题目链接:http://acm.zju.edu. ...
- BZOJ 1016 星球大战starwar(逆向-并查集)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1015 题意:给出一个图.每次删掉一个点,求删掉之后连通块个数. 思路:正着做不好做,我们 ...
- HDU 4496 D-City(逆向并查集)
http://acm.hdu.edu.cn/showproblem.php?pid=4496 题意: 给出n个顶点m条边的图,每次选择一条边删去,求每次删边后的连通块个数. 思路: 离线处理删边,从后 ...
随机推荐
- Servlet--超链接,表单提交,重定向,转发4种情况的路径
实际编码中我们经常写路径,写路径既可以写相对路径,也可以写绝对路径.我2年以前我就养成了习惯,只要是写路径我从来都是写绝对路径,因为万一将来我们的项目的目录发生变化,原来要是写相对路径的话就会有路径依 ...
- Halcon一日一练:创建三通道图像
首先理解一个什么是三通道图像: 三通道图像就是彩色图像,我们之前黑白相机或黑白电视机都是彩用的灰阶图像,即单通道图像,一般是2的8次方个灰阶,即256个灰阶.彩色图像采用RGB,红绿蓝三个通道来合成彩 ...
- 学会配置nginx
一.作为一名开发人员,大家可能经常会用到服务器,但是一般线上的服务器可能都是公司公用的,而且线上的服务器一般也不是能随随便便给个人用的,所以部署本地服务器看来是一遍必不可少的事情和能力呀,所以,ngi ...
- Python之Django rest_Framework补充
一.什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移" ...
- 07_Python变量内存地址、小数据池
一.变量在内存中的地址 变量:用来标识(identify)一块内存区域.为了方便表示内存,我们操作变量实质上是在操作变量指向的那块内存单元.编译器负责分配.我们可以使用Python内建函数id()来获 ...
- 在IAR下移植CC2650 contiki工程
与Instant Contiki相比,在Windows的IAR下开发可以在线仿真,下载也更方便,因此我想把BLEach的工程移植到IAR下.弄了好几天总算编译并且下载成功了,参考了[这篇TI的wiki ...
- 节点操作,节点属性的操作及DOM event事件
##1. 节点操作 createElement(标签名) 创建一个指定名称的元素 someone.appendChild(new_node) 追加一个子节点(作为最后的子节点) someone.ins ...
- ABP 数据迁移
我主要是在项目部署的时候.当添加一个租户的时候.那么租户是有一个单独的数据库.而我的并没有用多租户单数据库. 因此我的模块里面有一个领域事件 当租户添加时将生前表生成到对应的数据库中.如果那位网友有更 ...
- jdk环境变量配置及配置原因
windows下: 一.设置环境变量 变量名:JAVA_HOME 变量值:D:\Program Files\Java\jdk1.6.0 (即jdk安装的位置) 变量名:Path (这个变量名已在系 ...
- jboss7.1.1相关error及解决办法
问题1: 报错提示: 公司的网站系统使用的中间是jboss7.1.1 Final,由于有些数据和服务测试环境不具备,免不了要在测试环境调试些jsp页面,发现从jboss社区里下载的jboss应用有个问 ...