题意:

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

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. 【转载】关于grad_tensors的解惑

    转载:https://www.cnblogs.com/marsggbo/p/11549631.html 平常都是无脑使用backward,每次看到别人的代码里使用诸如autograd.grad这种方法 ...

  2. Linux下基础命令

      (1)ls(查看列表) (2)ls  -l(查看列出文件详细信息) (3)ls  -al (查看全部列出文件详细信息) (4)ls  -dl(查看目录信息) (5)pwd(查看当前工作的目录)   ...

  3. jdk 集合大家族之Collection

    jdk 集合大家族之Collection 前言:   此处的集合指的是java集合框架中的实现了Collection接口相关的类.所以主要为List Set 和 Queue 其他章节会专门介绍Map相 ...

  4. ASP.NET .Core 集成 React SPA 应用

    AgileConfig的UI使用react重写快完成了.上次搞定了基于jwt的登录模式(AntDesign Pro + .NET Core 实现基于JWT的登录认证),但是还有点问题.现在使用reac ...

  5. gtk+2.0中函数set_widget_font_size()函数在编译时未定义的解决办法

    自己写一个头文件即可,代码如下: 在.c文件中包含该头文件即可

  6. 【Azure 服务总线】详解Azure Service Bus SDK中接收消息时设置的maxConcurrentCalls,prefetchCount参数

    (Azure Service Bus服务总线的两大类消息处理方式: 队列Queue和主题Topic) 问题描述 使用Service Bus作为企业消息代理,当有大量的数据堆积再Queue或Topic中 ...

  7. P1089_津津的储蓄计划(JAVA语言)

    package 顺序与分支; /* * 题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱, 津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄, ...

  8. 《逆向工程核心原理》——DLL注入与卸载

    利用CreateRemoteThread #include <iostream> #include <tchar.h> #include <Windows.h> # ...

  9. ASP.Net Core中处理异常的几种方法

    本文将介绍在ASP.Net Core中处理异常的几种方法 1使用开发人员异常页面(The developer exception page) 2配置HTTP错误代码页 Configuring stat ...

  10. [GDKOI2021] 普及组 Day2 总结

    [ G D K O I 2021 ] 普 及 组 D a y 2 总 结 [GDKOI2021] 普及组 Day2 总结 [GDKOI2021]普及组Day2总结 时间安排和昨天的GDKOI2021 ...