zoj 3261 逆向并查集+离线处理
题意:给出一些点,每个点有权值,然后有一些边,相连。无向的。然后有一些操作
链接:点我
query a.表示从a出发的能到达的所有点权值最大的点的编号(相同取编号最小,而且权值要比自己大)
destory a,b 表示删除连接a,b的边
逆向并查集。
把没有删除的边先加入并查集,一个集合内表示连通的,根结点为权值最大的点。
然后对于查询离线读入,从最后开始操作,对于删除的点,然后重新加入到并查集中,更新最值。
查询的时候便是查询根结点的值是否大于自身的值
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <map>
using namespace std; const int MAXN=;
int F[MAXN];
int p[MAXN];
int val[MAXN];//最大值的下标
int num[MAXN];//最大值
int find(int x)
{
if(F[x]==-)return x;
return F[x]=find(F[x]);
}
void bing(int u,int v)
{
int t1=find(u),t2=find(v);
if(t1!=t2)
{
F[t1]=t2;
if(num[t1]>num[t2])
{
num[t2]=num[t1];
val[t2]=val[t1];
}
else if(num[t1]==num[t2] && val[t2]>val[t1])
val[t2]=val[t1];
}
}
map<int,int>mp[MAXN];
struct Edge
{
int u,v;
}edge[];
bool used[];
struct Node
{
int op;
int u,v;
}node[];
int ans[];
char str[];
int main()
{
int n;
int Q;
int m;
int u,v;
bool first=true;
while(scanf("%d",&n)==)
{
if(first)first=false;
else printf("\n");
memset(F,-,sizeof(F));
for(int i=;i<n;i++)
{
scanf("%d",&p[i]);
val[i]=i;
num[i]=p[i];
mp[i].clear();
} scanf("%d",&m);
for(int i=;i<m;i++)
{
scanf("%d%d",&u,&v);
if(u>v)swap(u,v);
mp[u][v]=i;
edge[i].u=u;
edge[i].v=v;
used[i]=false;
}
scanf("%d",&Q);
for(int i=;i<Q;i++)
{
scanf("%s",&str);
if(str[]=='q')
{
node[i].op=;
scanf("%d",&node[i].u);
}
else
{
node[i].op=;
scanf("%d%d",&u,&v);
if(u>v)swap(u,v);
node[i].u=u;
node[i].v=v;
int tmp=mp[u][v];
used[tmp]=true;
}
}
for(int i=;i<m;i++) //没有拆的点连上
if(!used[i])
{
bing(edge[i].u,edge[i].v);
}
int cnt=;
for(int i=Q-;i>=;i--)
{
if(node[i].op==)
{
u=node[i].u;
int t1=find(u);
if(num[t1]>p[u])ans[cnt++]=val[t1];
else ans[cnt++]=-;
}
else
{
bing(node[i].u,node[i].v);
}
}
for(int i=cnt-;i>=;i--)printf("%d\n",ans[i]);
}
return ;
}
zoj 3261 逆向并查集+离线处理的更多相关文章
- ZOJ - 3261 逆向并查集
思路:很巧妙的解法.如果按照常规一边读入,一边合并并查集,删边实在没办法做. 首先读入所有的操作,把所有不会被删除的边加入并查集,然后从最后一个操作开始逆向操作,当遇到删边操作,就直接把这条边加入并查 ...
- ZOJ3261-Connections in Galaxy War-(逆向并查集+离线处理)
题意: 1.有n个星球,每个星球有一个编号(1-n)和一个能量值. 2.一开始将某些星球连通. 3.开战后有很多个操作,查询某个星球能找谁求救或者摧毁两颗星球之间的连通路径,使其不能连通.如果连通则可 ...
- ZOJ 3261 Connections in Galaxy War(逆向并查集)
参考链接: http://www.cppblog.com/yuan1028/archive/2011/02/13/139990.html http://blog.csdn.net/roney_win/ ...
- ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线
hdu 1811 Rank of Tetris Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- HDU - 4496 City 逆向并查集
思路:逆向并查集,逆向加入每一条边即可.在获取联通块数量的时候,直接判断新加入的边是否合并了两个集合,如果合并了说明联通块会减少一个,否则不变. AC代码 #include <cstdio> ...
- BZOJ5188: [Usaco2018 Jan]MooTube 并查集+离线处理
BZOJ又不给题面... Luogu的翻译看不下去... 题意简述 有一个$n$个节点的树,边有权值,定义两个节点之间的距离为两点之间的路径上的最小边权 给你$Q$个询问,问你与点$v$的距离超过$k ...
- poj 2528 Mayor's posters 线段树 || 并查集 离线处理
题目链接 题意 用不同颜色的线段覆盖数轴,问最终数轴上有多少种颜色? 注:只有最上面的线段能够被看到:即,如果有一条线段被其他的线段给完全覆盖住,则这个颜色是看不到的. 法一:线段树 按题意按顺序模拟 ...
- ACM学习历程—SNNUOJ 1110 传输网络((并查集 && 离线) || (线段树 && 时间戳))(2015陕西省大学生程序设计竞赛D题)
Description Byteland国家的网络单向传输系统可以被看成是以首都 Bytetown为中心的有向树,一开始只有Bytetown建有基站,所有其他城市的信号都是从Bytetown传输过来的 ...
- HDU_4496_逆向并查集
http://acm.hdu.edu.cn/showproblem.php?pid=4496 逆向并查集,先读取,然后从后向前join每次保存答案即可. #include<iostream> ...
随机推荐
- NYOJ 1022 合纵连横 (并查集)
题目链接 描述 乱世天下,诸侯割据.每个诸侯王都有一片自己的领土.但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法吞并那些实力弱的,让自己的领土面积不断扩大.而实力弱的诸侯王为了不让自己的领 ...
- three.js为何如此奇妙
WebGL是在浏览器中实现三维效果的一套规范,而最初使用WebGL原生的API来写3D程序是一件非常痛苦的事情,在辛苦的付出下WebGL开源框架出现了,其中three.js就是非常优秀的一个,它掩盖了 ...
- discuz2.5登录后台闪退的解决办法
今天突然发现discuz2.5论坛后台进不去,开始以为密码错了,但发现登录后也是闪退.我试着清除浏览器cookie,也换了其他浏览器也没有用,还是上网找找吧! discuz2.5进入后台闪退的原因: ...
- Coursera在线学习---第六节.构建机器学习系统
备: High bias(高偏差) 模型会欠拟合 High variance(高方差) 模型会过拟合 正则化参数λ过大造成高偏差,λ过小造成高方差 一.利用训练好的模型做数据预测时,如果效果不好 ...
- python多线程下载文件
从文件中读取图片url和名称,将url中的文件下载下来.文件中每一行包含一个url和文件名,用制表符隔开. 1.使用requests请求url并下载文件 def download(img_url, i ...
- php返回json数据函数实例_php技巧_脚本之家
本文实例讲述了php返回json数据函数的用法,分享给大家供大家参考.具体方法如下: json_encode()函数用法: echo json_encode(array('a'=>'bbbb', ...
- java中常见异常汇总(根据自己遇到的异常不定时更新)
1.java.lang.ArrayIndexOutOfBoundsException:N(数组索引越界异常.如果访问数组元素时指定的索引值小于0,或者大于等于数组的长度,编译程序不会出现任何错误,但运 ...
- 使用Jackson来实现Java对象与JSON的相互转换的教程
一.入门Jackson中有个ObjectMapper类很是实用,用于Java对象与JSON的互换.1.JAVA对象转JSON[JSON序列化] 1 2 3 4 5 6 7 8 9 10 11 12 1 ...
- AtCoder Non-decreasing(数学思维)
题目链接:https://abc081.contest.atcoder.jp/tasks/arc086_b 题目大意:有n个数,最多可以执行2*n次操作,每次可以选择将ai加到aj上,最终使得该序列满 ...
- 洛谷 P1897电梯里的爱情 题解
题目传送门 对于每个输入的第i个人,直接使用桶,但注意范围要开大一些. #include<bits/stdc++.h> using namespace std; ],x,sum,h,Max ...