题目: 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. Oracle学习【语句查询】

    基本查询语句any和all不能单独使用,必须和比较符一起使用>any 大于最小的例如:select * from emp where sal >any(1000,2000);<any ...

  2. cocos2d-x系列 Mac下配置cocos2d-x开发环境(android和ios)

    一.下载cocos2d-x http://cocos2d-x.org/projects/cocos2d-x/wiki/Download cocos2d-x-2.1.4.zip @ June.18, 2 ...

  3. java_设计模式_组合模式_Composite Pattern(2016-08-12)

    概念: 组合模式(Composite Pattern)将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 有时候又叫做部分-整体模式,它使我们树 ...

  4. MFC可编辑的ListCtrl

    近期由于项目的要求,需要一个可以编辑的列表控件,由于MFC提供的列表控件只支持第一行可编辑,无法满足项目需求,故只能自己动手重写一个列表控件.重写列表控件的思想为:当点击列表的某行某列时,在此处创建一 ...

  5. PHP临时文件session的分级存储与定期删除

    在Windows上PHP默认的Session服务端文件存放在C:\WINDOWS\Temp下,如果说并发访问很大或者 session建立太多,目录下就会存在大量类似sess_xxxxxx的sessio ...

  6. Less小记

    Less除了在引用的时候link和script有顺序之外,在编译过程中,less中的代码顺序也会造成对样式的重置.

  7. Discuz论坛下载与安装

    Part1 Discuz下载 百度“discuz下载” 2. 找到下图这里 3. 选择你需要的版本,这里我选了X3.1版 4. 选择UTF-8简体下载 这是我下载好的文件 Part2 Discuz安装 ...

  8. 转:Ext GridPanel根据条件显示复选框

    Ext GridPanel实现复选框选择框: var selectModel = new Ext.grid.CheckboxSelectionModel({ singleSelect : false ...

  9. [CSS]background背景

    css背景样式 序号  中文说明  标记语法  1  背景颜色  {background-color:数值}  2  背景图片  {background-image: url('imgpath/img ...

  10. Android App的生命周期是什么

    怎么说呢 看Android一般指的是 Activity的生命周期, 关于app的生命周期, 有明白的大神请告诉我 上面这张图是 网上搜到的一张关于app生命周期的图, 在我看来, 其实就是一个Acti ...