题意:

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-(逆向并查集+离线处理)的更多相关文章

  1. ZOJ3261:Connections in Galaxy War(逆向并查集)

    Connections in Galaxy War Time Limit: 3 Seconds      Memory Limit: 32768 KB 题目链接:http://acm.zju.edu. ...

  2. Connections in Galaxy War (逆向并查集)题解

    Connections in Galaxy War In order to strengthen the defense ability, many stars in galaxy allied to ...

  3. Connections in Galaxy War(逆向并查集)

    Connections in Galaxy War http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3563 Time Limit ...

  4. ZOJ 3261 Connections in Galaxy War(逆向并查集)

    参考链接: http://www.cppblog.com/yuan1028/archive/2011/02/13/139990.html http://blog.csdn.net/roney_win/ ...

  5. ZOJ3261 Connections in Galaxy War —— 反向并查集

    题目链接:https://vjudge.net/problem/ZOJ-3261 In order to strengthen the defense ability, many stars in g ...

  6. zoj 3261 Connections in Galaxy War(并查集逆向加边)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261 题意:有很多颗星球,各自有武力值,星球间有一些联系通道,现 ...

  7. ZOJ 3261 - Connections in Galaxy War ,并查集删边

    In order to strengthen the defense ability, many stars in galaxy allied together and built many bidi ...

  8. ZOJ - 3261 Connections in Galaxy War(并查集删边)

    https://cn.vjudge.net/problem/ZOJ-3261 题意 银河系各大星球之间有不同的能量值, 并且他们之间互相有通道连接起来,可以用来传递信息,这样一旦有星球被怪兽攻击,便可 ...

  9. ZOJ 3261 Connections in Galaxy War (逆向+带权并查集)

    题意:有N个星球,每个星球有自己的武力值.星球之间有M条无向边,连通的两个点可以相互呼叫支援,前提是对方的武力值要大于自己.当武力值最大的伙伴有多个时,选择编号最小的.有Q次操作,destroy为切断 ...

随机推荐

  1. json字符串手动拼接

    return "xxx{" + "xxx='" + xxx+ '\'' + ", ggg='" + ggg+ '\'' + ", ...

  2. CSS3移动端vw+rem不依赖JS实现响应式布局

    1.前言 (1)vw/vh介绍 在使用之前,我们先简单了解一下什么是vw和rem以及它们的作用,vw是css3出现的一个新单位,它是"view width"缩写,定义为把当前屏幕分 ...

  3. DDR3(1):IP核调取

    本系列整理一下基于 Xilinx A7 芯片的 DDR3 的使用,此处采用的 DDR3 IP核为软核,即采用 FPGA 逻辑单元.寄存器.查找表等搭建出来 IP核.从 IP 核的调取开始,接着读写测试 ...

  4. 【题解】Editor [HDU4699]

    [题解]Editor [HDU4699] 传送: \(Editor\) \([HDU4699]\) [题目描述] 有一个维护整数序列的强大编辑器,初始状态为空,下面提供五种不同的操作,给出的总操作次数 ...

  5. 认清楚服务器的真正身份--深入ARP工作原理

    我们知道IP地址是ISP分配给我们的,IP不能作为服务器的唯一的身份,那么服务器真正的身份是什么呢?MAC IP地址直接的通信在底层要转换到MAC直接的通信,那他们如何通信的呢? 1.简介 出场人物: ...

  6. DOS常见命名整理

    Dos命令 1.打开终端的方式 (1).window+R / 点击开始栏,输入cmd,然后回车 (2).在某个文件夹下打开终端 按住shift+右击,有个在此处打开命令窗口 2.修改终端背景和文字颜色 ...

  7. idea中从代码自动定位到左侧类结构位置

    标题的意思表达的不是很清楚,下面是这个设置的方法: 图中红圈中就是设置的位置,把鼠标悬浮在上面,可以看到这个设置的名称是Autoscroll from source, 它的作用是,你在代码中点击一个方 ...

  8. 31、splice()用法

    改变数组,向数组中添加/删除元素: eg: 1.删除元素: let arr=['bob','lily','bike','sam']; arr.splice(2,1) console.log(arr) ...

  9. JavaScript 书写位置

    类似于 CSS 样式,JavaScript 也有三种不同位置的书写方式. 1.写在行内 <input type="button" value="按钮" o ...

  10. 使用代码获得Hybris Commerce里显示的产品图片

    使用下面这个API去取Hybris Commerce系统里产品主数据的明细信息: https://:9002/rest/v2/electronics/products/300938?fields=FU ...