题目: 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. declare-styleable:自定义控件的属性

    http://www.cnblogs.com/jisheng/archive/2013/01/10/2854891.html 在使用过程中, 1 TypedArray a = getContext() ...

  2. android中sharedPreferences的笔记

    haredPreferences的使用非常简单,能够轻松的存放数据和读取数据.SharedPreferences只能保存简单类型的数据,例如,String.int等.一般会将复杂类型的数据转换成Bas ...

  3. 第4条:多用类型常量,少用#define预处理指令

    定义常量的几种方式: 1.#define ANIMATION_DURAION 0.3         //定义了一个动画时长的常量, 预处理过程会把碰到的所有ANIMATION_DURAION一律替换 ...

  4. jQuery 尺寸

    通过 jQuery,很容易处理元素和浏览器窗口的尺寸. jQuery 尺寸 方法 jQuery 提供多个处理尺寸的重要方法: width() height() innerWidth() innerHe ...

  5. 让QMainWindow也表现出QDialog的exec函数的特征

    前几天在做毕业设计项目的时候,使用的PyQt4,想实现这么样一个功能: 场景描述:主窗口a(QMainWindow类型)和主窗口b(QMainWindow),b是通过a窗口中某一个按钮弹出来的. 功能 ...

  6. 弹出对话框 UIAlertController

    双选 //实例化UIAlertController var av=UIAlertController(title: "

  7. 从一个模板函数聊聊模板函数里面如何获得T的名字

    写了个小程序,遇到点问题.总结总结,学习学习 #include<vector> #include<iostream> #include<typeinfo> usin ...

  8. Java Learning:并发中的同步锁(synchronized)

    引言 最近一段时间,实验室已经倾巢出动找实习了,博主也凑合了一把,结果有悲有喜,BAT理所应当的跪了,也收到了其他的offer,总的感受是有必要夯实基础啊. 言归正传,最近在看到java多线程的时候, ...

  9. JDK源码阅读(三) Collection<T>接口,Iterable<T>接口

    package java.util; public interface Collection<E> extends Iterable<E> { //返回该集合中元素的数量 in ...

  10. word的不同章节之间添加不同的页眉

    1.点击空百处 2. 在页面布局中,找到分隔符,选择”连续“选项,即在空白处插入分隔符 特别注意:这里分隔符会出现换行现象,请选择空白处,不要影响原先布局 3. 当编辑下一个页眉时,点击“链接到前一条 ...