记录编号 |
330895 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[焦作一中2012] 玻璃球游戏 |
最终得分 |
100 |
用户昵称 |
哒哒哒哒哒! |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.223 s |
提交时间 |
2016-10-26 21:32:19 |
内存使用 |
5.19 MiB |
显示代码纯文本
- #include <queue>
- #include <iostream>
- #include <cstdlib>
- #include <cstring>
- #include <cstdio>
- using namespace std;
- #define ll long long
- int read(){
- int x=0,f=1;char ch=getchar();
- while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
- while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
- return x*f;
- }
- const int maxn=301000;
- int fa[maxn],to[maxn],query[maxn],ans[maxn],len;
- bool stop[maxn],del[maxn],cir[maxn];
-
- int find(int x){
- int r=x;
- while(r!=fa[r]) r=fa[r];
- while(x!=fa[x]){
- cir[x]=cir[r];
- fa[x]=r,x=fa[x];
- }
- return fa[x];
- }
- void unioon(int a,int b){
- int ra=find(a),rb=find(b);
- if(ra==rb) cir[ra]=cir[rb]=1;
- fa[ra]=rb;
- }
- int main(){
- freopen("marbles.in","r",stdin);freopen("marbles.out","w",stdout);
- int n=read();
- for(int i=1;i<=n;i++){
- to[i]=read();if(!to[i]) stop[i]=1;
- }
- for(int i=1;i<=n;i++)fa[i]=i;
- int m=read();
- for(int i=1;i<=m;i++){
- int op=read(),x=read();query[i]=x;
- if(op==2) del[x]=1,query[i]=-x;
- }
- for(int i=1;i<=n;i++)if(!del[i]&&to[i])unioon(i,to[i]);
- for(int i=m;i>=1;i--){
- if(query[i]>0){
- int rx=find(query[i]);
- if(cir[rx]) ans[++len]=-1;
- else ans[++len]=rx;
- }else{
- int y=-query[i];
- unioon(y,to[y]);
- }
- }
- for(int i=len;i>=1;i--){
- if(ans[i]==-1)printf("CIKLUS\n");
- else printf("%d\n",ans[i]);
- }
- fclose(stdin);fclose(stdout);
- return 0;
- }
-