题意:

      给你一些点,还有一些边,每个点上都有一个权值,然后有一些询问,分为两种,

query a 询问与a直接或者间接想连的点中最大权值的是那个点,输出那个点,如果那个点的权值小于等于a的权值,那么就输出-1,还有另一种操作就是destroy a b意思是删除a b的关系。

思路:

      比较基础的并查集题目,看到删边,很容易想到逆向离线处理,先把最终的状态建立出来,然后对于询问逆向处理,正向是删边,那么逆向肯定是加边了,更新最优的话也是比较简单的并查集小变种(也就是平时说的带权并查集),一开始wa了好几次,原因是没有注意一点,就是最大值相等的要编号小的点,这个注意下,别的没啥,具体细节看代码。


#include<map>
#include<stdio.h>
#include<string.h> #define N_node 10000 + 50
#define N_edge 20000 + 50
#define N_q 50000 + 50 using namespace std; typedef struct
{
int a ,b;
}EDGE; typedef struct
{
int key ,a ,b ,ans;
}QQ; int mer[N_node] ,num[N_node];
int _max[N_node] ,maxid[N_node];
map<int ,map<int ,int> >mark;
EDGE E[N_edge];
QQ Q[N_q]; int finds(int x)
{
x == mer[x] ? x : mer[x] = finds(mer[x]);
} int main ()
{
int n ,m ,q ,i;
char str[10];
int mk = 0;
while(~scanf("%d" ,&n))
{
if(mk) printf("\n");
mk = 1;
for(i = 1 ;i <= n ;i ++)
scanf("%d" ,&num[i]);
scanf("%d" ,&m);
for(i = 1 ;i <= m ;i ++)
{
scanf("%d %d" ,&E[i].a ,&E[i].b);
E[i].a ++ ,E[i].b ++;
}
scanf("%d" ,&q);
mark.clear();
for(i = 1 ;i <= q ;i ++)
{
scanf("%s" ,str);
if(str[0] == 'q')
{
scanf("%d" ,&Q[i].a);
Q[i].key = 1;
Q[i].a ++;
}
else
{
scanf("%d %d" ,&Q[i].a ,&Q[i].b) ,Q[i].key = 2;
Q[i].a ++ ,Q[i].b ++;
mark[Q[i].a][Q[i].b] = mark[Q[i].b][Q[i].a] = 1;
} }
for(i = 1 ;i <= n ;i ++)
maxid[i] = mer[i] = i ,_max[i] = num[i];
for(i = 1 ;i <= m ;i ++)
{
if(mark[E[i].a][E[i].b]) continue;
int x = finds(E[i].a);
int y = finds(E[i].b);
if(x != y)
{
mer[x] = y;
if(_max[y] < _max[x] || _max[y] == _max[x] && maxid[y] > maxid[x])
{
_max[y] = _max[x];
maxid[y] = maxid[x];
}
}
}
for(i = q ;i >= 1 ;i --)
{
if(Q[i].key == 1)
{
int x = finds(Q[i].a);
if(_max[x] > num[Q[i].a]) Q[i].ans = maxid[x] - 1;
else Q[i].ans = -1;
}
else
{
int x = finds(Q[i].a);
int y = finds(Q[i].b);
if(x != y)
{
mer[x] = y;
if(_max[y] < _max[x] || _max[y] == _max[x] && maxid[y] > maxid[x])
{
_max[y] = _max[x];
maxid[y] = maxid[x];
}
}
}
}
for(i = 1 ;i <= q ;i ++)
if(Q[i].key == 1) printf("%d\n" ,Q[i].ans); }
return 0;
}

ZOJ3261并查集逆向处理的更多相关文章

  1. zoj3261 并查集离线处理

    Connections in Galaxy War Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%lld & ...

  2. zoj 3261 Connections in Galaxy War(并查集逆向加边)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 题意:有很多颗星球,各自有武力值,星球间有一些联系通道,现 ...

  3. hdu 4496(并查集逆向添边)

    D-City Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...

  4. hdu 4496 并查集 逆向 并查集删边

    貌似某大犇说过 正难则反,,, 题目说要对这张图进行删边,然后判断联通块的个数,那么就可以先把所有边都删掉,之后从后往前加边,若加的边两端点不在同一个联通块中, 那么此时联通快个数少一,否则不变 #i ...

  5. 续并查集学习笔记——Closing the farm题解

    在很多时候,并查集并不是一个完整的解题方法,而是一种思路. 通过以下题目来体会并查集逆向运用的思想. Description Farmer John and his cows are planning ...

  6. codeforces 722C (并查集)

    题目链接:http://codeforces.com/contest/722/problem/C 题意:每次破坏一个数,求每次操作后的最大连续子串和. 思路:并查集逆向操作 #include<b ...

  7. ZOJ3261:Connections in Galaxy War(逆向并查集)

    Connections in Galaxy War Time Limit: 3 Seconds      Memory Limit: 32768 KB 题目链接:http://acm.zju.edu. ...

  8. 并查集专辑 (poj1182食物链,hdu3038, poj1733, poj1984, zoj3261)

    并查集专题训练地址,注册登录了才能看到题目 并查集是一个树形的数据结构,  可以用来处理集合的问题, 也可以用来维护动态连通性,或者元素之间关系的传递(关系必须具有传递性才能有并查集来维护,因为并查集 ...

  9. ZOJ3261 Connections in Galaxy War —— 反向并查集

    题目链接:https://vjudge.net/problem/ZOJ-3261 In order to strengthen the defense ability, many stars in g ...

随机推荐

  1. Flask-SQLAlchemy使用

    Flask-SQLAlchemy 使用起来非常有趣,对于基本应用十分容易使用,并且对于大型项目易于扩展. 官方文档:https://flask-sqlalchemy.palletsprojects.c ...

  2. Celery:小试牛刀

    Celery是如何工作的? Celery 由于 其分布式体系结构,在某种程度上可能难以理解.下图是典型Django-Celery设置的高级示意图(FROM O'REILLY): 当请求到达时,您可以在 ...

  3. django框架如何解决跨域问题

    跨域问题的由来 由于浏览器具有同源策略的限制. 限制:在发送Ajax请求时,如果当前浏览器的URL是a.com,页面中向b.com发送Ajax请求,请求可以正常访问,但数据回到浏览器时,浏览器会阻止. ...

  4. python 画图中文显示问题

    在python文件当前目录下添加simsun.ttc(资源网上下载即可,有很多) 代码如下: plt.title("标题", fontproperties='SimHei', si ...

  5. HiveHA机制源码分析

    hive让大数据飞了起来,不再需要专人写MR.平常我们都可以用基于thrift的任意语言来调用hive. 不过爱恨各半,hive的thrift不稳定也是出了名的.很容易就出问题,让人无计可施.唯一的办 ...

  6. 2020-2021 ACM-ICPC, Asia Seoul Regional Contest

    C. Dessert Café: 题意: 给你一个N个节点的树,树上有m个房子,问树上有几个节点是在两个房子之间的. 思路:我们发现只要是该节点的子树里包括了所有节点或者只有一个节点,那么这个结点肯定 ...

  7. Stone Game, Why are you always there? HDU - 2999

    题目链接:https://vjudge.net/problem/HDU-2999 题意:有N堆石头,两个人交替取,每次只能取连续的k个石子,最后没有石子取得人输. 思路:如果我们每次取靠边的k个,那么 ...

  8. 10、Spring教程之整合MyBatis

    1.步骤 1.导入相关jar包 junit <dependency> <groupId>junit</groupId> <artifactId>juni ...

  9. 《Selenium自动化测试实战:基于Python》之 Selenium IDE插件的安装与使用

    第3章  Selenium IDE插件的安装与使用 京东:https://item.jd.com/13123910.html 当当:http://product.dangdang.com/292045 ...

  10. 关于生产环境改用G1垃圾收集器的思考

    背景 由于我们的业务量非常大,响应延迟要求高.目前沿用的老的ParNew+CMS已经不能支撑业务的需求.平均一台机器在1个月内有1次秒级别的stop the world.对系统来说是个巨大的隐患.所以 ...