20%求助
查看原帖
20%求助
174806
xbb2楼主2022/8/4 23:29
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int dp[N],low[N],dfn[N],s[N],col[N],sum[N];
int ans,n,R,C,cnt1=0,sc=0,len;bool in_s[N];
vector<int> a[N],e[N];map<pair<int,int>,int>mp;
void tarjan(int x){
	dfn[x]=low[x]=++cnt1,in_s[x]=true,s[++len]=x;
	for(int i=0;i<a[x].size();i++){
		int y=a[x][i];if(dfn[y]==0)tarjan(y),low[x]=min(low[x],low[y]);
		else if(in_s[y]==true)low[x]=min(low[x],dfn[y]);
	}
	if(dfn[x]==low[x]){
		sc++;while(s[len]!=x)in_s[s[len]]=false,col[s[len]]=sc,sum[sc]+=s[len]<=n?1:0,len--;
		in_s[s[len]]=false,col[s[len]]=sc,sum[sc]+=s[len]<=n?1:0,len--;
	}
}
void dfs(int x,int fa){
	if(dp[x]>sum[x])return ;dp[x]=sum[x];
    for(int i=0;i<e[x].size();i++){
    	int y=e[x][i];if(y==fa)continue;
		dfs(y,x),dp[x]=max(dp[x],dp[y]+sum[x]);
    }
}
struct tip{int x,y,id;}u[5][N];int cnt[5];bool cmp1(tip a,tip b){return a.x<b.x;}bool cmp2(tip a,tip b){return a.y<b.y;}
int main(){
	cin>>n>>R>>C;for(int i=1;i<=n;i++){int x,y,t;scanf("%d%d%d",&x,&y,&t),u[t][++cnt[t]].x=x,u[t][cnt[t]].y=y,mp[make_pair(x,y)]=i,u[t][cnt[t]].id=i;}
	sort(u[1]+1,u[1]+1+cnt[1],cmp1),sort(u[2]+1,u[2]+1+cnt[2],cmp2);
	for(int i=1;i<=cnt[1];i++)if(u[1][i-1].x==u[1][i].x)a[u[1][i].id].push_back(u[1][i-1].id),a[u[1][i-1].id].push_back(u[1][i].id);
	for(int i=1;i<=cnt[2];i++)if(u[2][i-1].y==u[2][i].y)a[u[2][i].id].push_back(u[2][i-1].id),a[u[2][i-1].id].push_back(u[2][i].id);
	for(int i=1;i<=cnt[3];i++){
		if(mp.find(make_pair(u[3][i].x-1,u[3][i].y))!=mp.end())		a[u[3][i].id].push_back(mp[make_pair(u[3][i].x-1,u[3][i].y)]);
		if(mp.find(make_pair(u[3][i].x-1,u[3][i].y-1))!=mp.end())	a[u[3][i].id].push_back(mp[make_pair(u[3][i].x-1,u[3][i].y-1)]);
		if(mp.find(make_pair(u[3][i].x-1,u[3][i].y+1))!=mp.end())	a[u[3][i].id].push_back(mp[make_pair(u[3][i].x-1,u[3][i].y+1)]);
		if(mp.find(make_pair(u[3][i].x+1,u[3][i].y))!=mp.end())		a[u[3][i].id].push_back(mp[make_pair(u[3][i].x+1,u[3][i].y)]);
		if(mp.find(make_pair(u[3][i].x+1,u[3][i].y-1))!=mp.end())	a[u[3][i].id].push_back(mp[make_pair(u[3][i].x+1,u[3][i].y-1)]);
		if(mp.find(make_pair(u[3][i].x+1,u[3][i].y+1))!=mp.end())	a[u[3][i].id].push_back(mp[make_pair(u[3][i].x+1,u[3][i].y+1)]);
		if(mp.find(make_pair(u[3][i].x,u[3][i].y+1))!=mp.end())		a[u[3][i].id].push_back(mp[make_pair(u[3][i].x,u[3][i].y+1)]);
		if(mp.find(make_pair(u[3][i].x,u[3][i].y-1))!=mp.end())		a[u[3][i].id].push_back(mp[make_pair(u[3][i].x,u[3][i].y-1)]);
	}
	sort(u[1]+1,u[1]+1+cnt[1],cmp2),sort(u[2]+1,u[2]+1+cnt[2],cmp2),sort(u[3]+1,u[3]+1+cnt[3],cmp2); 
	for(int l=1,r=1;l<=cnt[1];l++){
		if(u[2][r].y==u[1][l].y)a[u[2][r].id].push_back(u[1][l].id);
		else if(u[2][r].y>u[1][l].y)continue;
		else {
			while(r<=cnt[2]&&u[2][r].y<u[1][l].y)r++;
			if(u[2][r].y==u[1][l].y)a[u[2][r].id].push_back(u[1][l].id);
			else if(u[2][r].y>u[1][l].y)continue;
		}
	}
	for(int l=1,r=1;l<=cnt[3];l++){
		if(u[2][r].y==u[3][l].y)a[u[2][r].id].push_back(u[3][l].id);
		else if(u[2][r].y>u[3][l].y)continue;
		else {
			while(r<=cnt[2]&&u[2][r].y<u[3][l].y)r++;
			if(u[2][r].y==u[3][l].y)a[u[2][r].id].push_back(u[3][l].id);
			else if(u[2][r].y>u[3][l].y)continue;
		}
	}
	sort(u[2]+1,u[2]+1+cnt[2],cmp1),sort(u[1]+1,u[1]+1+cnt[1],cmp1),sort(u[3]+1,u[3]+1+cnt[3],cmp1);
	for(int l=1,r=1;l<=cnt[2];l++){
		if(u[1][r].x==u[2][l].x)a[u[1][r].id].push_back(u[2][l].id);
		else if(u[1][r].x>u[2][l].x)continue;
		else {
			while(r<=cnt[1]&&u[1][r].x<u[2][l].x)r++;
			if(u[1][r].x==u[2][l].x)a[u[1][r].id].push_back(u[2][l].id);
			else if(u[1][r].x>u[2][l].x)continue;
		}
	}
	for(int l=1,r=1;l<=cnt[3];l++){
		if(u[1][r].x==u[3][l].x)a[u[1][r].id].push_back(u[3][l].id);
		else if(u[1][r].x>u[2][l].x)continue;
		else {
			while(r<=cnt[1]&&u[1][r].x<u[3][l].x)r++;
			if(u[1][r].x==u[3][l].x)a[u[1][r].id].push_back(u[3][l].id);
			else if(u[1][r].x>u[3][l].x)continue;
		}
	}
//	for(int i=1;i<=n;i++)printf("[%d=%d]",i,a[i].size());
//	for(int i=1;i<=3;i++){for(int j=1;j<=cnt[i];j++)printf("[%d %d %d] ",u[i][j].x,u[i][j].y,u[i][j].id);printf("\n");}
//	for(int i=1;i<=n;i++){printf("%d:",i);for(int j=0;j<a[i].size();j++)printf("%d ",a[i][j]);printf("\n");}
	for(int i=1;i<=n;i++)if(dfn[i]==0)tarjan(i);
//	for(int i=1;i<=n;i++)printf("%d ",col[i]);
//	printf("\n\n\n");
	for(int i=1;i<=sc;i++)s[i]=0;
	for(int i=1;i<=n;i++)for(int j=0;j<a[i].size();j++)if(col[i]!=col[a[i][j]])e[col[i]].push_back(col[a[i][j]]),s[col[i]]++;
//	for(int i=1;i<=sc;i++){printf("%d:",i);for(int j=0;j<e[i].size();j++)printf("%d ",e[i][j]);printf("\n");}
	for(int i=1;i<=sc;i++)dfs(i,0),ans=max(ans,dp[i]);
	printf("%d",ans);return 0;
} 

RT

2022/8/4 23:29
加载中...