ZOJ3261并查集逆向处理
题意:
给你一些点,还有一些边,每个点上都有一个权值,然后有一些询问,分为两种,
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并查集逆向处理的更多相关文章
- zoj3261 并查集离线处理
Connections in Galaxy War Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%lld & ...
- zoj 3261 Connections in Galaxy War(并查集逆向加边)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 题意:有很多颗星球,各自有武力值,星球间有一些联系通道,现 ...
- hdu 4496(并查集逆向添边)
D-City Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Subm ...
- hdu 4496 并查集 逆向 并查集删边
貌似某大犇说过 正难则反,,, 题目说要对这张图进行删边,然后判断联通块的个数,那么就可以先把所有边都删掉,之后从后往前加边,若加的边两端点不在同一个联通块中, 那么此时联通快个数少一,否则不变 #i ...
- 续并查集学习笔记——Closing the farm题解
在很多时候,并查集并不是一个完整的解题方法,而是一种思路. 通过以下题目来体会并查集逆向运用的思想. Description Farmer John and his cows are planning ...
- codeforces 722C (并查集)
题目链接:http://codeforces.com/contest/722/problem/C 题意:每次破坏一个数,求每次操作后的最大连续子串和. 思路:并查集逆向操作 #include<b ...
- ZOJ3261:Connections in Galaxy War(逆向并查集)
Connections in Galaxy War Time Limit: 3 Seconds Memory Limit: 32768 KB 题目链接:http://acm.zju.edu. ...
- 并查集专辑 (poj1182食物链,hdu3038, poj1733, poj1984, zoj3261)
并查集专题训练地址,注册登录了才能看到题目 并查集是一个树形的数据结构, 可以用来处理集合的问题, 也可以用来维护动态连通性,或者元素之间关系的传递(关系必须具有传递性才能有并查集来维护,因为并查集 ...
- ZOJ3261 Connections in Galaxy War —— 反向并查集
题目链接:https://vjudge.net/problem/ZOJ-3261 In order to strengthen the defense ability, many stars in g ...
随机推荐
- OpenGL中的坐标系统详细概括:包括Z缓冲
一: 首先就是关于几个坐标系统的概括: 局部坐标是对象相对于局部原点的坐标,也是物体起始的坐标. 下一步是将局部坐标变换为世界空间坐标,世界空间坐标是处于一个更大的空间范围的.这些坐标相对于世界的全局 ...
- C# 应用 - 使用 HttpListener 接受 Http 请求
1. 库类: \Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.dll System.Net.HttpListen ...
- ProBuilder快速原型开发技术 ---模型精细化操作
前面我们讲解了很多ProBuilder功能,但是对于制作一款复杂的模型来说,还远远不够.需要更多的对于模型细节的处理,这就是本篇文章要讲解的"模型精细化操作"技术. 关于PB对于模 ...
- linux云服务搭建Minecraft服务器
1 准备工作 以下内容全部要在root用户内完成 1.1 安装文件传输工具 为了方便传文件到服务器上,这里先装一个远程传输工具. yum -y install lrzsz 1.2 安装java Min ...
- Django之cookie 与session组件
一.会话跟踪技术 1.1 什么是会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而 ...
- windbg安装pykd记录
https://githomelab.ru/pykd/pykd 1.安装python (坑,分x86和x64,对应windbg版本) 2.安装pykd:'pip install pykd' 3.安 ...
- Java进阶专题(二十六) 将近2万字的Dubbo原理解析,彻底搞懂dubbo
前言 前面我们研究了RPC的原理,市面上有很多基于RPC思想实现的框架,比如有Dubbo.今天就从Dubbo的SPI机制.服务注册与发现源码及网络通信过程去深入剖析下Dubbo. Dubbo架构 ...
- DB性能瓶颈分析思路
在性能分析过程中,经常遇到性能瓶颈出现在SQL的情况,此类问题通常可以分为两大类场景,一是SQL自身性能差导致的慢,如索引缺失.索引失效.统计信息不准确.SQL过于复杂等:二是由于外部原因等待导致的S ...
- ELK查询命令详解总结
目录 ELK查询命令详解 倒排索引 倒排索引原理 分词器介绍及内置分词器 使用ElasticSearch API 实现CRUD 批量获取文档 使用Bulk API 实现批量操作 版本控制 什么是Map ...
- 第一个真正的 GUI 程序——Tkinter教程系列02
第一个真正的 GUI 程序--Tkinter教程系列02 前言 欢迎光临我的个人博客 chens.life Tk 系列教程: Tkinter教程系列01--引言和安装Tk 我们将编写一个英尺和米的转换 ...