题意:

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

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. python flask框架详解

    Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务.本文参考自Flask官方文档, 英文不好的同学也可以参考中文文档 1.安装flask pi ...

  2. Java 面向对象 01

    面向对象·一级 面向对象思想概述 * A:面向过程思想概述     * 第一步     * 第二步 * B:面向对象思想概述     * 找对象(第一步,第二步) * C:举例     * 买煎饼果子 ...

  3. div中如何让文本元素、img元素水平居中且垂直居中

    一.文本元素在div中的水平居中且垂直居中方法 html代码 <div id="box"> <p>文本元素</p> </div> c ...

  4. [POJ2828] Buy Tickets(待续)

    [POJ2828] Buy Tickets(待续) 题目大意:多组测试,每组给出\(n\)条信息\((a,b)\),表示\(b\)前面有\(a\)个人,顺序靠后的信息优先级高 Solution.1 由 ...

  5. git提交本地文件到远程仓库及参与的项目仓库

    1.git提交本地文件到组织 1.先再组织中建立个用于存放文件的仓库建然后复制仓库地址: 2.进入要上传的文件的根目录下右击 git Bash 进入git控制台,我要上传的文件如下: 3.进入后: 1 ...

  6. django 自带的用户系统

    首先,我要说明一下,下面内容不是必须品,如果各位大神喜欢手写也是可以的,你也可以选择自带的功能来缩减你的代码量,提高效率! 第一步 系统配置用户表 首先,在models中创建用户表,导包 from d ...

  7. 全网最详细的Linux命令系列-cp命令

    cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是 ...

  8. ELK查询命令详解总结

    目录 ELK查询命令详解 倒排索引 倒排索引原理 分词器介绍及内置分词器 使用ElasticSearch API 实现CRUD 批量获取文档 使用Bulk API 实现批量操作 版本控制 什么是Map ...

  9. 盘点 Django 展示可视化图表的多种方式(建议收藏)

    1. 前言 大家好,我是安果! 使用 Django 进行 Web 开发时,经常有需要展示图表的需求,以此来丰富网页的数据展示 常见方案包含:Highcharts.Matplotlib.Echarts. ...

  10. 【C/C++】面向对象开发的优缺点

    原创文章,转发请注明出处. 面向对象开发的优缺点 面向对象开发 是相对于 面向过程开发 的一种改进思路. 由于流水线式的面相过程开发非常直接,高效.在面对一些简单项目时,只需要几百行,甚至是几十行代码 ...