记录编号 248650 评测结果 AAAAAAAAAA
题目名称 黑心买卖 最终得分 100
用户昵称 Gravatar/k 是否通过 通过
代码语言 C++ 运行时间 1.645 s
提交时间 2016-04-10 18:05:03 内存使用 8.95 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<vector>
  4. using namespace std;
  5. int f[200010],n,m;
  6. struct u
  7. {
  8. int b;
  9. int x;
  10. }c[1000010];
  11. int h[200010];
  12. bool b[200010];
  13. int l;
  14. int in[200010];
  15. int sum;
  16. int s[200010];
  17. int gf(int a)
  18. {
  19. if(f[a]==a)
  20. return a;
  21. f[a]=gf(f[a]);
  22. return f[a];
  23. }
  24. inline void gjj(int a,int b)
  25. {
  26. a=gf(a),b=gf(b);
  27. f[a]=b;
  28. s[b]+=s[a];
  29. }
  30. inline int gj(int a,int b)
  31. {
  32. c[++l].b=b;
  33. c[l].x=h[a];
  34. h[a]=l;
  35. }
  36. int main()
  37. {
  38. freopen("closing.in","r",stdin);
  39. freopen("closing.out","w",stdout);
  40. scanf("%d%d",&n,&m);
  41. for(int i=1;i<=m;i++)
  42. {
  43. int aa,bb;
  44. scanf("%d%d",&aa,&bb);
  45. gj(aa,bb);
  46. gj(bb,aa);
  47. }
  48. for(int i=1;i<=n;i++)
  49. {
  50. scanf("%d",&in[i]);
  51. f[i]=i;
  52. }
  53. for(int j=n;j>=1;j--)
  54. {
  55. sum++;
  56. int k=in[j];
  57. s[k]=1;
  58. for(int i=h[k];i;i=c[i].x)
  59. {
  60. int u=c[i].b;
  61. if(s[u])
  62. if(gf(k)!=gf(u))
  63. {
  64. //printf("O");
  65. gjj(k,u);
  66. }
  67. }
  68. //printf("%d\n",s[1]);
  69. if(sum==s[gf(k)])
  70. b[j]=1;
  71. }
  72. for(int i=1;i<=n;i++)
  73. if(b[i])
  74. puts("YES");
  75. else
  76. puts("NO");
  77. getchar();
  78. getchar();
  79. }