记录编号 330895 评测结果 AAAAAAAAAA
题目名称 [焦作一中2012] 玻璃球游戏 最终得分 100
用户昵称 Gravatar哒哒哒哒哒! 是否通过 通过
代码语言 C++ 运行时间 1.223 s
提交时间 2016-10-26 21:32:19 内存使用 5.19 MiB
显示代码纯文本
  1. #include <queue>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cstdio>
  6. using namespace std;
  7. #define ll long long
  8. int read(){
  9. int x=0,f=1;char ch=getchar();
  10. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  11. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  12. return x*f;
  13. }
  14. const int maxn=301000;
  15. int fa[maxn],to[maxn],query[maxn],ans[maxn],len;
  16. bool stop[maxn],del[maxn],cir[maxn];
  17.  
  18. int find(int x){
  19. int r=x;
  20. while(r!=fa[r]) r=fa[r];
  21. while(x!=fa[x]){
  22. cir[x]=cir[r];
  23. fa[x]=r,x=fa[x];
  24. }
  25. return fa[x];
  26. }
  27. void unioon(int a,int b){
  28. int ra=find(a),rb=find(b);
  29. if(ra==rb) cir[ra]=cir[rb]=1;
  30. fa[ra]=rb;
  31. }
  32. int main(){
  33. freopen("marbles.in","r",stdin);freopen("marbles.out","w",stdout);
  34. int n=read();
  35. for(int i=1;i<=n;i++){
  36. to[i]=read();if(!to[i]) stop[i]=1;
  37. }
  38. for(int i=1;i<=n;i++)fa[i]=i;
  39. int m=read();
  40. for(int i=1;i<=m;i++){
  41. int op=read(),x=read();query[i]=x;
  42. if(op==2) del[x]=1,query[i]=-x;
  43. }
  44. for(int i=1;i<=n;i++)if(!del[i]&&to[i])unioon(i,to[i]);
  45. for(int i=m;i>=1;i--){
  46. if(query[i]>0){
  47. int rx=find(query[i]);
  48. if(cir[rx]) ans[++len]=-1;
  49. else ans[++len]=rx;
  50. }else{
  51. int y=-query[i];
  52. unioon(y,to[y]);
  53. }
  54. }
  55. for(int i=len;i>=1;i--){
  56. if(ans[i]==-1)printf("CIKLUS\n");
  57. else printf("%d\n",ans[i]);
  58. }
  59. fclose(stdin);fclose(stdout);
  60. return 0;
  61. }