ZOJ3261-Connections in Galaxy War-(逆向并查集+离线处理)
题意:
1.有n个星球,每个星球有一个编号(1-n)和一个能量值。
2.一开始将某些星球连通。
3.开战后有很多个操作,查询某个星球能找谁求救或者摧毁两颗星球之间的连通路径,使其不能连通。如果连通则可以相互求救,求救的对象要求能量比自己大并且在连通的星球中能量最大,如果能量最大的星球有多个,则找编号小的。
解题:
1.用并查集连通星球,把能量大的作为根节点,如果能量相同则把编号小的作为根节点,方便查询求救对象。
2.并查集没有断开的操作,把末态作为起始状态逆推。保存一开始的连通路径和开战后摧毁的连通路径,战争结束的状态作为起始状态,不连通被摧毁的连通路径。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std; int n,m,x,y,q;
int par[];///父亲
map<int,bool>mp;
int ans[];
struct star
{
int id;///编号
int val;///能量值
};star s[]; struct edge
{
int x;
int y;
};edge e[]; struct query
{
char s[];
int x,y; };query que[]; int find(int a)
{
if( par[a]==a )
return a;
return par[a]=find(par[a]);
} void unit(int a,int b)
{
int aa=find(a);
int bb=find(b);
if(aa!=bb)
{
if( s[aa].val==s[bb].val )///相同能量值
{
if( s[aa].id<s[bb].id )///编号小的做根节点
par[bb]=aa;
else
par[aa]=bb;
}
else if( s[aa].val<s[bb].val )///能量值大的作为根节点
par[aa]=bb;
else
par[bb]=aa;
}
} int main()
{
bool first=true;
while(scanf("%d",&n)!=EOF)///行星数量
{
if(first)///第一次进来变为false,以后每次都要打印空行
first=false;
else printf("\n");
mp.clear();
memset(ans,inf,sizeof(ans));
for(int i=;i<n;i++)///能量值
{
scanf("%d",&s[i].val);
s[i].id=i;
par[i]=i;
}
scanf("%d",&m);///连通边
for(int i=;i<m;i++)
{
scanf("%d%d",&x,&y);
if(x>y)///保证x<y
swap(x,y);
e[i].x=x;
e[i].y=y;///存连通边
mp[ x*+y ]=false;///没被毁掉
}
scanf("%d",&q);///查询
for(int i=;i<q;i++)
{
getchar();
scanf("%s",que[i].s);
if(que[i].s[]=='q')
scanf("%d",&que[i].x);
else
{
scanf("%d %d",&x,&y);
if(x>y)///保证x<y
swap(x,y);
que[i].x=x;
que[i].y=y;
mp[ x*+y ]=true;///被毁掉
}
}
///离线处理
for(int i=;i<m;i++)///把没被毁掉的边的末态作为起始态,逆推
{
x=e[i].x;
y=e[i].y;
if( !mp[ x*+y ] )
unit(x,y);
}
///逆推,保存对应的答案
for(int i=q-;i>=;i--)
{
if( que[i].s[]=='q' )
{
x=find(que[i].x);///连通星球中 能量最大的 根星球
if( s[x].val>s[ que[i].x ].val )
ans[i]=s[x].id;
else
ans[i]=-;
}
else
unit( que[i].x,que[i].y );
}
///顺序输出答案
for(int i=;i<q;i++)
{
if(ans[i]!=inf)
printf("%d\n",ans[i]);
}
}
return ;
}
ZOJ3261-Connections in Galaxy War-(逆向并查集+离线处理)的更多相关文章
- ZOJ3261:Connections in Galaxy War(逆向并查集)
Connections in Galaxy War Time Limit: 3 Seconds Memory Limit: 32768 KB 题目链接:http://acm.zju.edu. ...
- Connections in Galaxy War (逆向并查集)题解
Connections in Galaxy War In order to strengthen the defense ability, many stars in galaxy allied to ...
- Connections in Galaxy War(逆向并查集)
Connections in Galaxy War http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3563 Time Limit ...
- ZOJ 3261 Connections in Galaxy War(逆向并查集)
参考链接: http://www.cppblog.com/yuan1028/archive/2011/02/13/139990.html http://blog.csdn.net/roney_win/ ...
- ZOJ3261 Connections in Galaxy War —— 反向并查集
题目链接:https://vjudge.net/problem/ZOJ-3261 In order to strengthen the defense ability, many stars in g ...
- 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(并查集删边)
https://cn.vjudge.net/problem/ZOJ-3261 题意 银河系各大星球之间有不同的能量值, 并且他们之间互相有通道连接起来,可以用来传递信息,这样一旦有星球被怪兽攻击,便可 ...
- ZOJ 3261 Connections in Galaxy War (逆向+带权并查集)
题意:有N个星球,每个星球有自己的武力值.星球之间有M条无向边,连通的两个点可以相互呼叫支援,前提是对方的武力值要大于自己.当武力值最大的伙伴有多个时,选择编号最小的.有Q次操作,destroy为切断 ...
随机推荐
- 遍历 HashSet 的方法
遍历 HashSet 的方法 import java.util.HashSet; import java.util.Iterator; import java.util.Set; public cla ...
- Grafana邮件报警
一.概述 报警是Grafana的一项革命性功能,它让Grafana从一个数据可视化工具变成一个真正的任务监控工具.报警规则可以使用现有的图表控制面板设置,阈值可以通过拖拉右边的线控制,非常简单.Gra ...
- golang 学习笔记 -- 类型
int 和 uint的实际宽度会根据计算架构不同而不同,386下4个字节, amd64下8个字节 byte可看做uint8的别名类型 rune可看做int32的别名类型,专用于存储Unicode编码的 ...
- SpringBootSecurity学习(25)前后端分离版之OAuth2.0 令牌中继
增加Eureka 前面介绍的项目都是授权服务和资源服务单独两个,这样在资源服务中的 check_token 地址都是写死的地址 : 下面我们把eureka加上,这样就可以直接用服务名了.eureka服 ...
- Prometheus监控学习笔记之容器监控Grafana模块
0x00 概述 Grafana 是一个开源的,可以用于大规模指标数据的可视化项目,甚至还能对指标进行报警.基于友好的 Apache License 2.0 开源协议,目前是prometheus监控展示 ...
- 踏入OpenGL大门 —— VS2015开发环境配置 (详细图文)
转自: https://www.jianshu.com/p/68c314fa9fea?from=groupmessage 眼睛熊 ---------------- 本文 ------------- ...
- tomcat端口修改后在Eclipse中启动无效问题解决
原文:https://blog.csdn.net/yangyiqian/article/details/40262039 问题:在conf目录修改了server.xml配置中的节点 <Conn ...
- Java自学-接口与继承 默认方法
默认方法 步骤 1 : 什么是默认方法 默认方法是JDK8新特性,指的是接口也可以提供具体方法了,而不像以前,只能提供抽象方法 Mortal 这个接口,增加了一个默认方法 revive,这个方法有实现 ...
- uni-app结合PHP实现单用户登陆
单用户登陆,即在一个应用中,同一个用户只能在线登陆一个,一个用户登陆,在其他设备上会被即时挤下线,确认后清空登陆该设备上的登陆装填并退回到登陆界面. uni-app是目前能通过使用vue.js框架只需 ...
- Spring MVC 上传、下载、显示图片
目录 1. 准备工作 1.1 数据库表准备 1.2 实体类 User 和 Mapper(DAO) 1.3 pom.xml 依赖包 1.4 SSM 框架的整合配置 2. 控制器 UserControll ...