题意:

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

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编程》03_05_Main_module

    目录 | 上一节 (3.4 模块) | 下一节 (3.6 设计讨论) 3.5 主模块 本节介绍主程序(主模块)的概念 主函数 在许多编程语言中,存在一个主函数或者主方法的概念. // c / c++ ...

  2. CNN结构演变总结(二)轻量化模型

    CNN结构演变总结(一)经典模型 导言: 上一篇介绍了经典模型中的结构演变,介绍了设计原理,作用,效果等.在本文,将对轻量化模型进行总结分析. 轻量化模型主要围绕减少计算量,减少参数,降低实际运行时间 ...

  3. python学习总结篇(2)——函数

    如其他语言一样,除了基本知识外,另外一个重要的板块就是函数了,python中也有函数. 在python中,函数的定义方式为: def   函数名( ): 下面通过几个简单的例子,看看python中的函 ...

  4. SpringMVC-04 数据处理及跳转

    SpringMVC-04 数据处理及跳转 结果跳转方式 1.ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 . 页面 : {视图解析 ...

  5. 如何报告FreeBSD 的bug?

    https://bugs.freebsd.org/bugzilla/ 注册个账号即可,请使用英语,把程序在不同程序上的运行结果列出来即可- ​​​​ 注意标记架构,如果有log还请一并附上,英语差可以 ...

  6. git的回滚与撤销【reset and revert】

    git的工作流程-- 3个区域 工作区:我们可以看到的文件内容 在操作 git add 之前的!! 缓存区:是不可见的  已经git add操作,还没git commit -m "" ...

  7. 【python+selenium的web自动化】- PageObject模式解析及案例

    如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html PO模式 ​ Page O ...

  8. CMU15-455 Lab2 - task4 Concurrency Index -并发B+树索引算法的实现

    最近在做 CMU-15-445 Database System,lab2 是需要完成一个支持并发操作的B+树,最后一部分的 Task4 是完成并发的索引这里对这部分加锁的思路和完成做一个总结,关于 B ...

  9. 密码学系列之:csrf跨站点请求伪造

    目录 简介 CSRF的特点 CSRF的历史 CSRF攻击的限制 CSRF攻击的防范 STP技术 Cookie-to-header token Double Submit Cookie SameSite ...

  10. MySQL的安装及使用

    安装MySQL 这里建议大家使用压缩版,安装快,方便.不复杂. 1.MySQL软件下载 mysql5.7 64位下载地址: https://dev.mysql.com/get/Downloads/My ...