题意:给出一些点,每个点有权值,然后有一些边,相连。无向的。然后有一些操作

链接:点我

query a.表示从a出发的能到达的所有点权值最大的点的编号(相同取编号最小,而且权值要比自己大)

destory a,b 表示删除连接a,b的边

逆向并查集。

把没有删除的边先加入并查集,一个集合内表示连通的,根结点为权值最大的点。

然后对于查询离线读入,从最后开始操作,对于删除的点,然后重新加入到并查集中,更新最值。

查询的时候便是查询根结点的值是否大于自身的值

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <algorithm>
  4 #include <iostream>
  5 #include <map>
  6 using namespace std;
  7
  8 const int MAXN=10010;
  9 int F[MAXN];
 10 int p[MAXN];
 11 int val[MAXN];//最大值的下标
 12 int num[MAXN];//最大值
 13 int find(int x)
 14 {
 15     if(F[x]==-1)return x;
 16     return F[x]=find(F[x]);
 17 }
 18 void bing(int u,int v)
 19 {
 20     int t1=find(u),t2=find(v);
 21     if(t1!=t2)
 22     {
 23         F[t1]=t2;
 24         if(num[t1]>num[t2])
 25         {
 26             num[t2]=num[t1];
 27             val[t2]=val[t1];
 28         }
 29         else if(num[t1]==num[t2] && val[t2]>val[t1])
 30             val[t2]=val[t1];
 31     }
 32 }
 33 map<int,int>mp[MAXN];
 34 struct Edge
 35 {
 36     int u,v;
 37 }edge[20010];
 38 bool used[20010];
 39 struct Node
 40 {
 41     int op;
 42     int u,v;
 43 }node[50010];
 44 int ans[50010];
 45 char str[20];
 46 int main()
 47 {
 48     int n;
 49     int Q;
 50     int m;
 51     int u,v;
 52     bool first=true;
 53     while(scanf("%d",&n)==1)
 54     {
 55         if(first)first=false;
 56         else printf("\n");
 57         memset(F,-1,sizeof(F));
 58         for(int i=0;i<n;i++)
 59         {
 60             scanf("%d",&p[i]);
 61             val[i]=i;
 62             num[i]=p[i];
 63             mp[i].clear();
 64         }
 65
 66         scanf("%d",&m);
 67         for(int i=0;i<m;i++)
 68         {
 69             scanf("%d%d",&u,&v);
 70             if(u>v)swap(u,v);
 71             mp[u][v]=i;
 72             edge[i].u=u;
 73             edge[i].v=v;
 74             used[i]=false;
 75         }
 76         scanf("%d",&Q);
 77         for(int i=0;i<Q;i++)
 78         {
 79             scanf("%s",&str);
 80             if(str[0]=='q')
 81             {
 82                 node[i].op=0;
 83                 scanf("%d",&node[i].u);
 84             }
 85             else
 86             {
 87                 node[i].op=1;
 88                 scanf("%d%d",&u,&v);
 89                 if(u>v)swap(u,v);
 90                 node[i].u=u;
 91                 node[i].v=v;
 92                 int tmp=mp[u][v];
 93                 used[tmp]=true;
 94             }
 95         }
 96         for(int i=0;i<m;i++)    //没有拆的点连上
 97           if(!used[i])
 98           {
 99               bing(edge[i].u,edge[i].v);
100           }
101         int cnt=0;
102         for(int i=Q-1;i>=0;i--)
103         {
104             if(node[i].op==0)
105             {
106                 u=node[i].u;
107                 int t1=find(u);
108                 if(num[t1]>p[u])ans[cnt++]=val[t1];
109                 else ans[cnt++]=-1;
110             }
111             else
112             {
113                 bing(node[i].u,node[i].v);
114             }
115         }
116         for(int i=cnt-1;i>=0;i--)printf("%d\n",ans[i]);
117     }
118     return 0;
119 }

转载于:https://www.cnblogs.com/cnblogs321114287/p/4487753.html

zoj 3261 逆向并查集+离线处理相关推荐

  1. LC-1697. 检查边长度限制的路径是否存在(并查集+离线)

    1697. 检查边长度限制的路径是否存在 难度困难109 给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] = [ui, vi, disi] 表示点 ui 和点 v ...

  2. [逆向并查集+STLmap存图奇法] Connections in Galaxy War ZOJ - 3261

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 这题 感谢bo同学大力帮助...告诉我 奇技淫巧 虽然思路蛮顺的 题 ...

  3. HDU 2586 How far away ? LCA ---tanjar+并查集 离线算法

    tanjar算法离线求LCA的思想主要是利用并查集的思想. 求距离的话就是d[start[i]]+end[en[i]]-2*d[lca[i]]; 首先从根节点dfs,在深度遍历的回溯的过程中不断的更新 ...

  4. 中石油训练赛 - 奎奎画画(思维+并查集+离线处理)

    题目描述 "为你写诗,为你静止,为你做不可能的事",爱情是一种怪事,它让奎奎开始学习画画.奎奎认为一张画的艺术价值等于画上的白色联通块个数(当一个格子和它上下左右四个方向上的某个相 ...

  5. CodeForces - 722C Destroying Array(倒着并查集+离线处理)

    题目链接:点击查看 题目大意:给出一个数列a,现在给出操作b,每次操作都会删除掉数列a中指定位置的数,问每次删除后,最大连续字段和是多少 题目分析:一开始看到最大连续字段和,以为是要用dp,又看了一下 ...

  6. 【BZOJ】1015 [JSOI2008]星球大战starwar(并查集+离线处理)

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的 机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通 ...

  7. 2022-12-14 LeetcCode 1697.检查边长度限制的路径是否存在【并查集+离线思想】

    传送门: 1697. 检查边长度限制的路径是否存在 题目: 给你一个 n 个点组成的无向图边集 edgeList ,其中 edgeList[i] = [ui, vi, disi] 表示点 ui 和点 ...

  8. Codeforces Round #836 (Div. 2) E.Tick, Tock(在线:带权并查集/离线:dfs判环)

    题目 n*m(1<=n,m<=2e5,n*m<=2e5)的网格图, 有一些格子内已经放入了闹钟,当前时刻在[0,h)(1<=h<=1e9)之间 还有一些位置没有放闹钟,输 ...

  9. zoj 3761(并查集+搜索)

    题意:在一个平面上,有若干个球,给出球的坐标,每次可以将一个球朝另一个球打过去(只有上下左右),碰到下一个球之后原先的球停下来,然后被撞的球朝这个方向移动,直到有一个球再也撞不到下一个球后,这个球飞出 ...

  10. hdu 4496 并查集 逆向 并查集删边

    貌似某大犇说过 正难则反,,, 题目说要对这张图进行删边,然后判断联通块的个数,那么就可以先把所有边都删掉,之后从后往前加边,若加的边两端点不在同一个联通块中, 那么此时联通快个数少一,否则不变 1 ...

最新文章

  1. 设计模式---5(建造者模式的概念及其实现,建造者模式的角色与职责,建造者模式和工厂模式的区别)
  2. Python 编码规范(Google) (一)
  3. 力扣——LCP 37. 最小矩形面积(困难)
  4. 使用surface初体验
  5. jsp页面显示富文本框内容
  6. 计算机网络复习题大全(各种题型)
  7. c语言荷兰国旗问题算法,荷兰国旗问题
  8. Windows 安装 Oracle Java JDK
  9. 模糊粗糙集及数据降维
  10. 电脑上有什么好用的卸载软件?--geek 卸载神器
  11. 常见的监控项目组网方案技术系统图,一文了解清楚!
  12. To https://gitee.com/xxxx/gittest.git解决方案
  13. Windows系统拦截广告弹窗
  14. 微信拼好货商城团购研究转
  15. 渭南师范计算机学院男女比例,全国高校男女比例大揭秘!去这些大学怕是要单身四年了...
  16. hiredis的异步处理
  17. Macbook pro M1基本环境配置
  18. Ad hoc网络路由协议概述3——按需路由协议(1)DSR协议(Dynamic source routing protocol)
  19. [Read] XXH00129《视觉SLAM 十四讲》第10讲和第11讲
  20. VMware虚拟机安装macos Big Sur 11.4 (20F71)教程镜像CDR/ISO下载

热门文章

  1. ASP.NET 自定义DataTable数据
  2. Java容器类研究8:HashMap
  3. Spring容器启动后注入service到Servlet并自动执行
  4. zookeeper 可以干什么
  5. UIApplication
  6. Android文件资源(raw/data/asset)的存取
  7. 使用Rust库bindgen之Hello World(附代码)
  8. 二元信号探测的误检概率推导与其matlab验证
  9. [2018.08.08 T1] 签到题
  10. BZOJ3517 翻硬币