90分求助!!!
查看原帖
90分求助!!!
25891
沧桑の天骄楼主2021/10/29 23:42
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#define ll long long
using namespace std;
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline ll read()
{
	ll x=0,w=1;
	char aa=getchar();
	while(aa<'0'||aa>'9')
	{
		if(aa=='-')
		{
			w=-1;
		}
		aa=getchar();
	}
	while(aa>='0'&&aa<='9')
	{
		x=(x<<3)+(x<<1)+aa-'0';
		aa=getchar();
	}
	return x*w;
}
const int N=100010;
const int M=20*N;

struct tty
{
	int x,y,t;
}f[N];
vector<int> x[10*N],y[10*N];
map<int ,int > mp[N];
int dx[8]={-1,1,0,0,-1,-1,1,1},dy[8]={0,0,-1,1,-1,1,-1,1};
int n;
int hd[N],nt[M],ver[M],top;
int hd2[N],nt2[M],ver2[M],top2;
int dfn[N],low[N],num[N],tot,e,be[M];
int sum[N],jh[N],in[N];
int dis[N];
bool b[N];
queue<int> q;

void add(int x,int y)
{
	top++;
	be[top]=x;
	ver[top]=y;
	nt[top]=hd[x];
	hd[x]=top;
}

void add2(int x,int y)
{
	top2++;
	ver2[top2]=y;
	nt2[top2]=hd2[x];
	hd2[x]=top2;
}

void tarjan(int x)
{
	dfn[x]=low[x]=++tot;
	num[++e]=x;
	b[x]=1;
	for(int i=hd[x];i;i=nt[i])
	{
		int y=ver[i];
		if(!dfn[y])
		{
			tarjan(y);
			low[x]=min(low[x],low[y]);
		}
		else if(b[y]==1)
		{
			low[x]=min(low[x],low[y]);
		}
	}
	if(dfn[x]==low[x])
	{
		int y;
		while(y=num[e--])
		{
			jh[y]=x;
			b[y]=0;
			if(x==y)
			{
				break;
			}
			sum[x]+=sum[y];
		}
	}
}

void jsans()
{
	for(int i=1;i<=n;i++)
	{
		if(jh[i]==i&&in[i]==0)
		{
			q.push(i);
			dis[i]=sum[i];
		}
	}
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		for(int i=hd2[x];i;i=nt2[i])
		{
			int y=ver2[i];
			dis[y]=max(dis[y],dis[x]+sum[y]);
			in[y]--;
			if(in[y]==0)
			{
				q.push(y);
			}
		}
	}
}

int main()
{
	n=read();
	int r=read(),c=read();
	for(int i=1;i<=n;i++)
	{
		f[i].x=read();
		f[i].y=read();
		f[i].t=read();
		x[f[i].x].push_back(i);
		y[f[i].y].push_back(i);
		mp[f[i].x][f[i].y]=i;
	}
	for(int i=1;i<=n;i++)
	{
		if(f[i].t==1)
		{
			for(int j=0;j<x[f[i].x].size();j++)
			{
				if(i==x[f[i].x][j])
				{
					continue;
				}
				add(i,x[f[i].x][j]);
			}
		}
		if(f[i].t==2)
		{
			for(int j=0;j<y[f[i].y].size();j++)
			{
				if(i==y[f[i].y][j])
				{
					continue;
				}
				add(i,y[f[i].y][j]);
			}
		}
		if(f[i].t==3)
		{
			for(int j=0;j<8;j++)
			{
				int xx=f[i].x+dx[j],yy=f[i].y+dy[j];
				if(xx<1||xx>r||yy<1||yy>c||mp[xx][yy]==0)
				{
					continue;
				}
				add(i,mp[xx][yy]);
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		sum[i]=1;
	}
	for(int i=1;i<=n;i++)
	{
		if(!dfn[i])
		{
			tarjan(i);
		}
	}
	for(int i=1;i<=top;i++)
	{
		int x=jh[be[i]],y=jh[ver[i]];
		if(x!=y)
		{
			add2(x,y);
			in[y]++;
		}
	}
	jsans();
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,dis[i]);
	}
	printf("%d\n",ans);
	return 0;
}
2021/10/29 23:42
加载中...