题目: 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] 玻璃球游戏 带权并查集,逆序处理的更多相关文章

  1. CDOJ 1070 秋实大哥打游戏 带权并查集

    链接 F - 秋实大哥打游戏 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu Submit ...

  2. 洛谷P5092 [USACO2004OPEN]Cube Stacking 方块游戏 (带权并查集)

    题目描述 约翰和贝茜在玩一个方块游戏.编号为 1\ldots n 1-n 的 n n ( 1 \leq n \leq 30000 1≤n≤30000 )个方块正放在地上,每个构成一个立方柱. 游戏开始 ...

  3. AcWing 239.奇偶游戏 (带权并查集/种类并查集)

    题意:你和朋友玩游戏,有个一\(01\)序列,你每次给出一个区间,朋友会回答这个区间中的\(1\)的个数是奇数还是偶数,但是你亲爱的朋友可能在撒谎,问在哪个询问你能确定你的朋友在撒谎,输出回合数. 题 ...

  4. bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3376 题目大意: 编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方 ...

  5. 【BZOJ 3376】[Usaco2004 Open]Cube Stacking 方块游戏 带权并查集

    这道题一开始以为是平衡树结果发现复杂度过不去,然后发现我们一直合并而且只是记录到最低的距离,那么就是带权并查集了,带权并查集的权一般是到根的距离,因为不算根要好打,不过还有一些其他的,具体的具体打. ...

  6. BZOJ 3376 [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)

    题解 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #in ...

  7. 2015 UESTC 数据结构专题H题 秋实大哥打游戏 带权并查集

    秋实大哥打游戏 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/contest/show/59 Descr ...

  8. 初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏

    算是挺基础的东西 Description     约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱.    游戏开始后,约翰会给贝茜发出P(1≤P ...

  9. AcWing:239. 奇偶游戏(前缀和 + 离散化 + 带权并查集 + 异或性质 or 扩展域并查集 + 离散化)

    小A和小B在玩一个游戏. 首先,小A写了一个由0和1组成的序列S,长度为N. 然后,小B向小A提出了M个问题. 在每个问题中,小B指定两个数 l 和 r,小A回答 S[l~r] 中有奇数个1还是偶数个 ...

随机推荐

  1. Spring处理id相同的bean

    http://www.360doc.com/content/13/1018/05/41237_322247510.shtml(应该可以解决) http://www.2cto.com/kf/201601 ...

  2. PoshyTip jQuery 文本提示插件的使用

    PoshyTip 是JQuery中一款文本提示插件,在Jsp页面使用相当方便,插件内包含了很多外观样式,可以作为FormTooltips使用. 插件包下载地址:http://vadikom.com/f ...

  3. jsp页面 使用c 标签的 varStatus 属性和 index 解决一行显示多少个 然后进行自动换行

    jsp页面显示,一行有三条记录,自动换行 <c:forEach items="${slist}" var="s" varStatus="stat ...

  4. 数据库基本概念-oracle介绍

    甲骨文公司,全称甲骨文股份有限公司是全球最大的企业软件公司,总部位于美国加利福尼亚州的红木滩.甲骨文是继Microsoft及IBM后,全球收入第三多的软件公司.甲骨文公司1989年正式进入中国市场.重 ...

  5. iPhone分辨率

    分辨率和像素 1.iPhone5           4"     分辨率320x568,像素640x1136,@2x 2.iPhone6           4.7"  分辨率3 ...

  6. 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 ...

  7. 练习2 F题 - 平方和与立方和

      Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u   Description 给定一 ...

  8. https WebAPi

    前言 话说又来需求了,之前对于在SelfHost中需要嵌套页面并操作为非正常需求,这回来正常需求了,客户端现在加了https,老大过来说WebAPi访问不了了,这是什么情况,我去试了试,还真是这个情况 ...

  9. iOS应用如何支持IPV6-b

    果然是苹果打个哈欠,iOS行业内就得起一次风暴呀.自从5月初Apple明文规定所有开发者在6月1号以后提交新版本需要支持IPV6-Only的网络,大家便开始热火朝天的研究如何支持IPV6,以及应用中哪 ...

  10. Arduino语言学习记录(持续更新)

    几天前某宝买了一套,这几天没工夫.今天开始学学这个“玩具”. 1.Arduino的变量数据类型: 数据类型  数据类型 RAM 范围 void keyword N/A N/A boolean 1 by ...