记录编号 390570 评测结果 AAAAAAAAAA
题目名称 宝藏 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 1.689 s
提交时间 2017-04-03 13:18:31 内存使用 12.23 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<map>
  4. using namespace std;
  5. const int N=1e5+10,SIZE=1e6+10;
  6. typedef pair<int,int> pr;
  7. int n,R,C,x[N],y[N],tp[N];
  8. struct node{
  9. int v;node *next;
  10. node(int V){v=V;next=0;}
  11. };
  12. struct queue{
  13. node *head;
  14. void push(int x){
  15. node *y=new node(x);
  16. y->next=head;
  17. head=y;
  18. }
  19. };
  20. queue E[N],r[SIZE],c[SIZE];
  21. map<pr,int> M;
  22. int stack[N],top,dfn[N],low[N],fa[N],size[N],ans;
  23. bool ins[N];
  24. void tarjan(int x){
  25. static int cnt=0;
  26. dfn[x]=low[x]=++cnt;
  27. ins[stack[++top]=x]=1;
  28. for (node* i=E[x].head;i;i=i->next){
  29. int v=i->v;
  30. if (!dfn[v]) tarjan(v),low[x]=min(low[x],low[v]);else
  31. if (ins[v]) low[x]=min(low[x],dfn[v]);
  32. }
  33. if (low[x]==dfn[x]){
  34. while (stack[top]!=x){
  35. int i=stack[top--];
  36. ins[i]=0;fa[i]=x;size[x]++;
  37. }
  38. ins[stack[top--]]=0;fa[x]=x;size[x]++;
  39. }
  40. }
  41. queue go[N];
  42. int dp[N];//dp[i]表示走到i号联通块后最多访问多少节点
  43. int val(int x){
  44. if (dp[x]) return dp[x];
  45. for (node* i=go[x].head;i;i=i->next)
  46. dp[x]=max(dp[x],val(i->v));
  47. return dp[x]+=size[x];
  48. }
  49. int main()
  50. {
  51. freopen("sdoi10sotomon.in","r",stdin);
  52. freopen("sdoi10sotomon.out","w",stdout);
  53. scanf("%d%d%d",&n,&R,&C);
  54. for (int i=1;i<=n;i++){
  55. scanf("%d%d%d",&x[i],&y[i],&tp[i]);
  56. M[pr(x[i],y[i])]=i;
  57. r[x[i]].push(i);
  58. c[y[i]].push(i);
  59. }
  60. for (int i=1;i<=n;i++){
  61. if (tp[i]==1){
  62. for (node* j=r[x[i]].head;j;j=j->next)
  63. E[i].push(j->v);
  64. }
  65. if (tp[i]==2){
  66. for (node* j=c[y[i]].head;j;j=j->next)
  67. E[i].push(j->v);
  68. }
  69. if (tp[i]==3){
  70. for (int a=-1;a<=1;a++)
  71. for (int b=-1;b<=1;b++){
  72. pr now(x[i]+a,y[i]+b);
  73. if (M.count(now)) E[i].push(M[now]);
  74. }
  75. }
  76. }
  77. for (int i=1;i<=n;i++)
  78. if (!dfn[i]) tarjan(i);
  79. for (int i=1;i<=n;i++)
  80. for (node* j=E[i].head;j;j=j->next){
  81. int v=fa[j->v];
  82. if (fa[i]!=v) go[fa[i]].push(v);
  83. }
  84. for (int i=1;i<=n;i++) ans=max(ans,val(i));
  85. printf("%d\n",ans);
  86. return 0;
  87. }