记录编号 313669 评测结果 AAAAAAAAAA
题目名称 宝藏 最终得分 100
用户昵称 GravatarSOBER GOOD BOY 是否通过 通过
代码语言 C++ 运行时间 0.953 s
提交时间 2016-10-01 19:06:56 内存使用 122.22 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<stack>


using namespace std;

typedef long long LL;

stack<int> q;             

const int maxn=100000+100;

const int mv[8][2]={{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1}};

int T,N,M,len1,len2,tim=0,cnt=0;

int head1[maxn],f[maxn],head2[maxn],dfn[maxn],low[maxn],belong[maxn],data[maxn];
        
bool flag[maxn];
                             
LL get(int i,int j)
{
    return ((LL)i-1)*(LL)N+(LL)j;
}

struct node
{
    int x,y,type;
    LL num;
    int pos;   
}A[maxn],B[maxn];

struct edge
{int to,next;
}e1[maxn*100],e2[maxn*50];

void ADD1(int x,int y)
{len1++;e1[len1].to=y,e1[len1].next=head1[x];head1[x]=len1;}

void ADD2(int x,int y)
{len2++;e2[len2].to=y,e2[len2].next=head2[x];head2[x]=len2;}

bool compnum(node a,node b)
{
     return a.num<b.num;
};

void tar(int x)
{
     //printf(" %d\n",x);
     //puts("OK");
     dfn[x]=low[x]=++tim;
     q.push(x);flag[x]=1;
     for(int t,i=head1[x];i;i=e1[i].next)
     {
      t=e1[i].to;
      if(!dfn[t])
      {
                 tar(t);
                 low[x]=min(low[x],low[t]);         
      }
      else if(flag[t])
      {
           low[x]=min(low[x],dfn[t]);
      }
     }
     if(low[x]==dfn[x])
      {
               cnt++;
               while(q.top()!=x)
               {
                  belong[q.top()]=cnt;
                  data[cnt]++;
                  flag[q.top()]=0;
                  q.pop();
               }
                  belong[q.top()]=cnt;
                  data[cnt]++;
                  flag[q.top()]=0;
                  q.pop();
               //puts("OK");
                /*flag[q.top()]=0;
                belong[q.top()]=cnt;
                data[cnt]++;
                q.pop();*/   
      }
}

int dp(int x)
{
    
    if(f[x])return f[x];
    f[x]=data[x];
    for(int t,i=head2[x];i;i=e2[i].next)
    {
            t=e2[i].to;
            f[x]=max(f[x],data[x]+dp(t));
    }
    return f[x];
}

int main()
{
    freopen("sdoi10sotomon.in","r",stdin);
    freopen("sdoi10sotomon.out","w",stdout);
    scanf("%d%d%d",&T,&N,&M);
    for(int i=1;i<=T;i++)
    {
     scanf("%d%d%d",&A[i].x,&A[i].y,&A[i].type);
     B[i].x=A[i].x,B[i].y=A[i].y,B[i].type=A[i].type;
     A[i].num=get(A[i].x,A[i].y);
     B[i].num=get(A[i].y,A[i].x);
     A[i].pos=B[i].pos=i;
     
    }     
    sort(A+1,A+T+1,compnum);
    sort(B+1,B+T+1,compnum);
    for(int i=1;i<=T;i++)
    {
            if(A[i].type==1)
            {
             int ha=i-1;
             while(A[ha].x==A[i].x&&ha)
             {ADD1(A[i].pos,A[ha].pos);ha--;}
             ha=i+1;
             while(A[ha].x==A[i].x&&ha<=T)
             {ADD1(A[i].pos,A[ha].pos);ha++;}
            }       
            if(B[i].type==2)
            {
             int ha=i-1;
             while(B[ha].y==B[i].y&&ha)
             {ADD1(B[i].pos,B[ha].pos);ha--;}
             ha=i+1;
             while(B[ha].y==B[i].y&&ha<=T)
             {ADD1(B[i].pos,B[ha].pos);ha++;}              
            }
            if(A[i].type==3)
            {
                for(int xx,yy,j=0;j<8;j++)
                {
                 xx=A[i].x+mv[j][0],yy=A[i].y+mv[j][1];
                 LL haha=get(xx,yy);
                 if(xx>0&&xx<=N&&yy>0&&yy<=M)
                 {
                 int l=1,r=T;
                 while(l<=r)
                 {
                    int mid=(l+r)>>1;
                    if(A[mid].num<haha)
                    l=mid+1;
                    else r=mid-1;        
                 }
                 if(A[l].num==haha)
                 ADD1(A[i].pos,A[l].pos);
                 }
                }  
            }                                   
    }         
    for(int i=1;i<=T;i++)if(!dfn[i])tar(i);
    for(int ha=1;ha<=T;ha++)
    {
           for(int t,i=head1[ha];i;i=e1[i].next)
           {
             t=e1[i].to;
             if(belong[t]!=belong[ha])
             ADD2(belong[ha],belong[t]);      
           } 
    }  
    //puts("OK");
    //printf("++ %d\n",cnt);
    int Ans=0;
    for(int i=1;i<=cnt;i++)
    {Ans=max(Ans,dp(i));}
     printf("%d",Ans);
     
     fclose(stdin);
     fclose(stdout);                                     
    return 0;
}