ZOJ 3261 Connections in Galaxy War (逆向+带权并查集)
题意:有N个星球,每个星球有自己的武力值。星球之间有M条无向边,连通的两个点可以相互呼叫支援,前提是对方的武力值要大于自己。当武力值最大的伙伴有多个时,选择编号最小的。有Q次操作,destroy为切断连接两点的边,query为查询某星球能不能向它人呼叫支援。
还是需要离线逆向并查集求解。思路和HDU 4496很相似,但是此处不一定是把所有边都删去,所以需要删边的情况建立出最终的状态。因为N可以到1e4,所以可以用map嵌套map的方式记录过程中被删去的边,最后再根据删除情况建立状态。
在合并时需要维护自己能够申请到的支援的武力最大值,以及其编号。
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<map>
using namespace std;
typedef long long LL;
const int maxn = 2e4+;
const int INF= 0x3f3f3f3f;
struct Edge{
int u,v;
}E[maxn];
struct Query{
int op,a,b;
LL ans;
}p[maxn*];
LL w[maxn];
LL dist[maxn];
int fa[maxn];
int maxid[maxn];
inline int Find(int x) {return fa[x]==x ?x: fa[x]=Find(fa[x]);}
//void init(int N){ for(int i=0;i<N;++i) fa[i]=i,dist[i]=w[i],maxid[i]=i;}
void Union(int a,int b){
a = Find(a),b = Find(b);
if(a!=b){
fa[a] = b;
if(dist[b]<dist[a] || dist[b]==dist[a] && maxid[b]>maxid[a]){
dist[b]=dist[a];
maxid[b]= maxid[a];
}
}
} map<int,map<int,int> > tag; int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int T,N,M,Q,u,v,tmp,K,cas=;
char op[];
int mk = ;
while(scanf("%d",&N)==){
if(mk) printf("\n");
mk = ;
for(int i=;i<N;++i) {
scanf("%lld",&w[i]);
fa[i]=maxid[i]=i;
dist[i]=w[i];
}
tag.clear();
scanf("%d",&M);
for(int i=;i<=M;++i){
scanf("%d%d",&u,&v);
E[i].u =u , E[i].v=v;
}
scanf("%d",&Q);
for(int i=;i<=Q;++i){
scanf("%s%d",op,&p[i].a);
if(op[]=='d') {
p[i].op=;
scanf("%d",&p[i].b);
tag[p[i].a][p[i].b]=tag[p[i].b][p[i].a]=; //被删边的标记
}
else p[i].op = ; //0删边,1查询
}
//因为并不是把边全删完,建立最终状态
for(int i=;i<=M;++i){
if(tag[E[i].u][E[i].v]) continue; //这条边不在
else Union(E[i].u,E[i].v);
} for(int i=Q;i>=;--i){
if(!p[i].op) Union(p[i].a,p[i].b);
else{
u = Find(p[i].a);
if(dist[u]>w[p[i].a]) p[i].ans=maxid[u];
else p[i].ans= -;
}
}
for(int i=;i<=Q;++i){
if(p[i].op) printf("%lld\n",p[i].ans);
}
}
return ;
}
ZOJ 3261 Connections in Galaxy War (逆向+带权并查集)的更多相关文章
- ZOJ 3261 Connections in Galaxy War(逆向并查集)
参考链接: http://www.cppblog.com/yuan1028/archive/2011/02/13/139990.html http://blog.csdn.net/roney_win/ ...
- zoj 3261 Connections in Galaxy War
点击打开链接zoj 3261 思路: 带权并查集 分析: 1 题目说的是有n个星球0~n-1,每个星球都有一个战斗值.n个星球之间有一些联系,并且n个星球之间会有互相伤害 2 根本没有思路的题,看了网 ...
- 洛谷 P1197 BZOJ 1015 [JSOI2008]星球大战 (ZOJ 3261 Connections in Galaxy War)
这两道题长得差不多,都有分裂集合的操作,都是先将所有操作离线,然后从最后一步开始倒着模拟,这样一来,分裂就变成合并,也就是从打击以后最终的零散状态,一步步合并,回到最开始所有星球都被连为一个整体的状态 ...
- zoj 3261 Connections in Galaxy War(并查集逆向加边)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 题意:有很多颗星球,各自有武力值,星球间有一些联系通道,现 ...
- ZOJ 3261 - Connections in Galaxy War ,并查集删边
In order to strengthen the defense ability, many stars in galaxy allied together and built many bidi ...
- 题解报告:zoj 3261 Connections in Galaxy War(离线并查集)
Description In order to strengthen the defense ability, many stars in galaxy allied together and bui ...
- ZOJ - 3261 Connections in Galaxy War(并查集删边)
https://cn.vjudge.net/problem/ZOJ-3261 题意 银河系各大星球之间有不同的能量值, 并且他们之间互相有通道连接起来,可以用来传递信息,这样一旦有星球被怪兽攻击,便可 ...
- 洛谷OJ P1196 银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
- Lightoj1009 Back to Underworld(带权并查集)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Back to Underworld Time Limit:4000MS ...
随机推荐
- 关键字final 分别修饰一个类,一个方法,一个变量,各起什么作用
关键字final 分别修饰一个类,一个方法,一个变量,各起什么作用 解答:final修饰类是不能被继承 fianl修饰方法不能在子类中被覆盖 final修饰变量,称为常量,初始化以后不能改变值.
- 【Cloud Foundry】Cloud Foundry学习(四)——Service
在阅读的过程中有不论什么问题,欢迎一起交流 邮箱:1494713801@qq.com QQ:1494713801 Services:Cloud Foundry的Service模块从源码控制上看就 ...
- jquery代码规范让代码越来越好看
最近学了jQuery,感觉这个jQuery是真的挺不错的,果然像他说的那样,少些多做!刚一入手感觉真是不错.但是写多了,就会发现这个代码一行居然能写那么长.而且可读性还不好. 有幸自己买了一本锋利的 ...
- 拦截asp.net输出流并进行处理的方法
本文实例主要实现对已经生成了HTML的页面做一些输出到客户端之前的处理. 方法的实现原理是:把Response的输出重定向到自定义的容器内,也就是我们的StringBuilder对象里,在HTML所有 ...
- WebSocket入门教程(五)-- WebSocket实例:简单多人聊天室
from:https://blog.csdn.net/u010136741/article/details/51612594 [总目录] WebSocket入门教程--大纲 [实例简介] ...
- 阿里面试经历JAVA总结
为记录阿里的电面经历,特与大家分享,岗位是JAVA研发工程师. 一面主要问题如下: 1)首先自我介绍 2)数据结构算法的基本问题,如排序算法,二叉树遍历,后序遍历非递归,图的最短路径问题 3)对一个数 ...
- boost::interprocess::managed_shared_memory(2)(std::string)
#include <iostream> #include <boost/interprocess/managed_shared_memory.hpp> #include < ...
- 编写高质量代码--改善python程序的建议(七)
原文发表在我的博客主页,转载请注明出处! 建议三十四:掌握字符串的基本用法 编程有两件事,一件是处理数值,另一件是处理字符串,在商业应用编程来说,处理字符串的代码超过八成,所以需要重点掌握. 首先有个 ...
- IntelliJ中的main函数和System.out.println()快捷输入方式
转自:https://blog.csdn.net/assassinsshadow/article/details/73557375 main快捷输入 psvm System.out.println() ...
- 关于Z序的总结
//转自:http://blog.csdn.net/flowshell/article/details/4797917 Z 序:一个重叠窗口的堆,每个窗口在Z 序中 都有唯一一个位置.一个窗口的Z 序 ...