Cogs 1070. [焦作一中2012] 玻璃球游戏 带权并查集,逆序处理
题目: http://cojs.tk/cogs/problem/problem.php?pid=1070
1070. [焦作一中2012] 玻璃球游戏
★ 输入文件:marbles.in
输出文件:marbles.out
简单对比
时间限制:1 s 内存限制:128 MB
【问题描述】
小x的业余生活中,有一项是玩滚玻璃球游戏。
某天,小x想到了一种很无趣的玩法,当然,这种玩法就是为了玩看题的你们。
小x首先建立了一个单向轨道,这个单向轨道可以抽象成一个有向图,每个顶点的出度都是1,也就是由每个点出发,只有一条边连向其他的点。
小x的游戏最初规则是这样的:让玻璃球从某一个点出发,沿着有向边的方向,移动到它的下一个顶点,如果还能移动,就继续移动,直到没有相邻的边,当然会存在在一个环里不停运动的情况。
为了增加难度,小x决定将游戏规则增强,他会提出一系列问题,让你回答:
1) 格式:1 X.查询玻璃球由编号为X的点出发,最终在哪个点停下来,如果能停下来,输出最后的点的编号,如果停不下来,输出”CIKLUS”.
2) 格式:2 X.删除由X出发的那条有向边。
【输入】
第一行包含一个正整数N(1<=N<=300000),表示图的顶点数。
第二行包含由空格隔开N个正整数,第i个数表示从i顶点可以通过出边到达的定点编号,0表示该点没有出边。
接下来的一行包含1个整数Q(1<=Q<=300000),表示询问的次数。
再接下来Q行,每行表示一次查询,格式如题目描述。
【输出】
对于第1类询问,输出玻璃球停止时所在顶点编号,每行1个,按照查询的顺序输出。如果玻璃球无法停止,输出”CIKLUS”即可.
【输入输出样例1】
marbles.in |
marbles.out |
3 2 3 1 7 1 1 1 2 2 1 1 2 1 1 2 2 1 2 |
CIKLUS CIKLUS 1 1 2 |
【输入输出样例2】
marbles.in |
marbles.out |
5 0 3 5 3 4 6 1 1 1 2 2 4 1 2 2 3 1 2 |
1 CIKLUS 4 3 |
【数据范围】
40% 数据保证 N<=100, Q<=1000
题解:
摘自liu_runda:
先处理完所有删边操作,再逆序处理所有操作(原来的删边处理时改为添边)。
维护一个带权并查集(所谓的权就是会不会走到环路)。
最后一个点用递归find()会爆栈,改迭代find()就可以了。
#include<bits/stdc++.h>
using namespace std;
#define MAXN 300010
#define MAXQ 300010
int end[MAXN],fh[MAXQ],x[MAXQ],ans[MAXQ],father[MAXN];
bool del[MAXN],circle[MAXN];
int read()
{
int s=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
return s*fh;
}
inline int Findfather(int o)
{
if(o==father[o])return father[o];
else
{
father[o]=Findfather(father[o]);
circle[o]=circle[father[o]];
return father[o];
}
}
inline void ak(int aa,int bb)
{
int a1=Findfather(aa);
int b1=Findfather(bb);
if(a1!=b1)father[a1]=b1;
else
{
circle[a1]=true;circle[b1]=true;
}
}
int main()
{
freopen("marbles.in","r",stdin);
freopen("marbles.out","w",stdout);
int i,N,Q,lans,xx;
N=read();
for(i=;i<=N;i++)end[i]=read(),father[i]=i;
Q=read();
for(i=;i<=Q;i++)
{
fh[i]=read();x[i]=read();
}
memset(del,false,sizeof(del));
for(i=;i<=Q;i++)
{
if(fh[i]==)del[x[i]]=true;
}
memset(circle,false,sizeof(circle));
for(i=;i<=N;i++)
{
if(del[i]==false&&end[i]!=)ak(i,end[i]);
}
lans=;
for(i=Q;i>=;i--)
{
if(fh[i]==)
{
xx=Findfather(x[i]);
if(circle[x[i]]==true)ans[++lans]=-;
else ans[++lans]=Findfather(x[i]);
}
else
{
ak(x[i],end[x[i]]);
}
}
for(i=lans;i>=;i--)
{
if(ans[i]!=-)printf("%d\n",ans[i]);
else printf("CIKLUS\n");
}
fclose(stdin);
fclose(stdout);
return ;
}
Cogs 1070. [焦作一中2012] 玻璃球游戏 带权并查集,逆序处理的更多相关文章
- CDOJ 1070 秋实大哥打游戏 带权并查集
链接 F - 秋实大哥打游戏 Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%lld & %llu Submit ...
- 洛谷P5092 [USACO2004OPEN]Cube Stacking 方块游戏 (带权并查集)
题目描述 约翰和贝茜在玩一个方块游戏.编号为 1\ldots n 1-n 的 n n ( 1 \leq n \leq 30000 1≤n≤30000 )个方块正放在地上,每个构成一个立方柱. 游戏开始 ...
- AcWing 239.奇偶游戏 (带权并查集/种类并查集)
题意:你和朋友玩游戏,有个一\(01\)序列,你每次给出一个区间,朋友会回答这个区间中的\(1\)的个数是奇数还是偶数,但是你亲爱的朋友可能在撒谎,问在哪个询问你能确定你的朋友在撒谎,输出回合数. 题 ...
- bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3376 题目大意: 编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方 ...
- 【BZOJ 3376】[Usaco2004 Open]Cube Stacking 方块游戏 带权并查集
这道题一开始以为是平衡树结果发现复杂度过不去,然后发现我们一直合并而且只是记录到最低的距离,那么就是带权并查集了,带权并查集的权一般是到根的距离,因为不算根要好打,不过还有一些其他的,具体的具体打. ...
- BZOJ 3376 [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)
题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #in ...
- 2015 UESTC 数据结构专题H题 秋实大哥打游戏 带权并查集
秋实大哥打游戏 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Descr ...
- 初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏
算是挺基础的东西 Description 约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱. 游戏开始后,约翰会给贝茜发出P(1≤P ...
- AcWing:239. 奇偶游戏(前缀和 + 离散化 + 带权并查集 + 异或性质 or 扩展域并查集 + 离散化)
小A和小B在玩一个游戏. 首先,小A写了一个由0和1组成的序列S,长度为N. 然后,小B向小A提出了M个问题. 在每个问题中,小B指定两个数 l 和 r,小A回答 S[l~r] 中有奇数个1还是偶数个 ...
随机推荐
- Spring处理id相同的bean
http://www.360doc.com/content/13/1018/05/41237_322247510.shtml(应该可以解决) http://www.2cto.com/kf/201601 ...
- PoshyTip jQuery 文本提示插件的使用
PoshyTip 是JQuery中一款文本提示插件,在Jsp页面使用相当方便,插件内包含了很多外观样式,可以作为FormTooltips使用. 插件包下载地址:http://vadikom.com/f ...
- jsp页面 使用c 标签的 varStatus 属性和 index 解决一行显示多少个 然后进行自动换行
jsp页面显示,一行有三条记录,自动换行 <c:forEach items="${slist}" var="s" varStatus="stat ...
- 数据库基本概念-oracle介绍
甲骨文公司,全称甲骨文股份有限公司是全球最大的企业软件公司,总部位于美国加利福尼亚州的红木滩.甲骨文是继Microsoft及IBM后,全球收入第三多的软件公司.甲骨文公司1989年正式进入中国市场.重 ...
- iPhone分辨率
分辨率和像素 1.iPhone5 4" 分辨率320x568,像素640x1136,@2x 2.iPhone6 4.7" 分辨率3 ...
- Hadoop, Python, and NoSQL lead the pack for big data jobs
Hadoop, Python, and NoSQL lead the pack for big data jobs Rise in cloud-based analytics could incr ...
- 练习2 F题 - 平方和与立方和
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 给定一 ...
- https WebAPi
前言 话说又来需求了,之前对于在SelfHost中需要嵌套页面并操作为非正常需求,这回来正常需求了,客户端现在加了https,老大过来说WebAPi访问不了了,这是什么情况,我去试了试,还真是这个情况 ...
- iOS应用如何支持IPV6-b
果然是苹果打个哈欠,iOS行业内就得起一次风暴呀.自从5月初Apple明文规定所有开发者在6月1号以后提交新版本需要支持IPV6-Only的网络,大家便开始热火朝天的研究如何支持IPV6,以及应用中哪 ...
- Arduino语言学习记录(持续更新)
几天前某宝买了一套,这几天没工夫.今天开始学学这个“玩具”. 1.Arduino的变量数据类型: 数据类型 数据类型 RAM 范围 void keyword N/A N/A boolean 1 by ...