记录编号 |
594780 |
评测结果 |
AAAAAAAAAA |
题目名称 |
宝藏 |
最终得分 |
100 |
用户昵称 |
小金 |
是否通过 |
通过 |
代码语言 |
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;
}