记录编号 594780 评测结果 AAAAAAAAAA
题目名称 宝藏 最终得分 100
用户昵称 Gravatar小金 是否通过 通过
代码语言 C++ 运行时间 0.893 s
提交时间 2024-10-05 10:03:07 内存使用 27.62 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=2500000;
int n,r,c,v[N],h[N],ne[N],tot;
bool b[N],b1[N];
int v1[N],h1[N],ne1[N],cnt1,s[N],tot1;
int size[N],fa[N],dp[N],q[N];
int dx[8]={0,1,1,1,0,-1,-1,-1};
int dy[8]={1,1,0,-1,-1,-1,0,1};
int v2[N],h2[N],ne2[N],tot2,ind[N],fro[N];
struct gz{
    int x,y,type,id;
    long long z;
}a[200000];
long long count(long long x,long long y)
{
    return (x-1)*c+y;
}
void add1(int x,int y)
{
    tot++;
    v[tot]=y;
    fro[tot]=x;
    ne[tot]=h[x];
    h[x]=tot;
}
void add2(int x,int y)
{
    tot1++;
    v1[tot1]=y;
    ne1[tot1]=h1[x];
    h1[x]=tot1;
}
void add3(int x,int y)
{
    ind[y]++;
    tot2++;
    v2[tot2]=y;
    ne2[tot2]=h2[x];
    h2[x]=tot2;
}
bool cmp(gz a,gz b)
{
    return ((long long)(a.x-1)*c+a.y)<((long long)(b.x-1)*c+b.y);
}
int ef(long long x)
{
    int l=1,r=n;
    while(l<r-1)
    {
        int mid=(l+r)/2;
        if(a[mid].z<=x) l=mid;
        else r=mid-1;
    }
    if(a[r].z==x) return r;
    if(a[l].z==x) return l;
    return 0;
}
void dfs(int x)
{
    b[x]=1;
    int ptr=h[x];
    while(ptr)
    {
        int y=v[ptr];
        if(b[y]!=1)
        {
            dfs(y);
        }
        ptr=ne[ptr];
    }
    s[0]++;
    s[s[0]]=x;
}
void dfs1(int x,int fat)
{
    b1[x]=1;
    fa[x]=fat;
    int ptr=h1[x];
    while(ptr)
    {
        int y=v1[ptr];
        if(b1[y]==0)
        {
            dfs1(y,fat);
        }
        ptr=ne1[ptr];
    }
}
int main()
{
    freopen("hzsotomon.in","r",stdin);
    freopen("hzsotomon.out","w",stdout);
    scanf("%d%d%d",&n,&r,&c);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].type);
        a[i].z=count(a[i].x,a[i].y);
        a[i].id=i;
        add1(n+a[i].x,i);
        add2(i,n+a[i].x);
        add1(n+r+a[i].y,i);
        add2(i,n+r+a[i].y);
        if(a[i].type==1)
        {
            add1(i,n+a[i].x);
            add2(n+a[i].x,i);
        }
        if(a[i].type==2)
        {
            add1(i,n+r+a[i].y);
            add2(n+r+a[i].y,i);
        }
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        if(a[i].type==3)
        {
            for(int j=0;j<=7;j++)
            {
                long long x=a[i].x+dx[j];
                long long y=a[i].y+dy[j];
                int k=ef(count(x,y));
                if(k!=0)
                {
                    add1(a[i].id,a[k].id);
                    add2(a[k].id,a[i].id);
                }
            }
        }
    }
    n=n+r+c;
    for(int i=1;i<=n;i++)
    {
        if(b[i]==0) dfs(i);
    }
    for(int i=s[0];i>=1;i--)
    {
        if(b1[s[i]]==0) dfs1(s[i],s[i]);
    }
    for(int i=1;i<=n-r-c;i++)
    {
        size[fa[i]]++;
    }
    for(int i=1;i<=tot;i++)
    {
        int x=v[i];
        int y=fro[i];
        if(fa[x]!=fa[y]) add3(fa[y],fa[x]);
    }
    int h=1,t=0;
    for(int i=1;i<=n;i++)
    {
        if(fa[i]==i&&ind[i]==0)
        {
            dp[i]=size[i];
            t++;
            q[t]=i;
        }
    }
    int ans=0;
    while(h<=t)
    {
        int x=q[h];
        h++;
        ans=max(ans,dp[x]);
        int ptr=h2[x];
        while(ptr)
        {
            int y=v2[ptr];
            dp[y]=max(dp[y],dp[x]+size[y]);
            ind[y]--;
            if(ind[y]==0)
            {
                t++;
                q[t]=y;
            }
            ptr=ne2[ptr];
        }
    }
    printf("%d",ans);
    return 0;
}