MnZn求助
查看原帖
MnZn求助
304458
ZHUHK楼主2022/10/3 13:40

建立虚点5个MLE:

#include<bits/stdc++.h>
using namespace std;
const int N=8e5+10;
int n,r,c;
int dx[]={-1,-1,0,1,1,1,0,-1},dy[]={0,-1,-1,-1,0,1,1,1};
int w[N],dp[N];

struct node
{
	int from,to,nxt;
}g[N<<1];int h[N],len=0;
void add(int from,int to){
	g[len]={from,to,h[from]};
	h[from]=len;len++;
}

typedef pair<int,int> PII;
map<PII,int> point;
int cnt=0;
bool inmap(int x,int y)
{
	if(x>=1&&x<=r&&y>=1&&y<=c) return true;
	else return false;
}
void getnode(int x,int y)
{
	if(!point.count(PII(x,y))) {
		point[PII(x,y)]=++cnt;
		int rt=point[PII(x,0)];
		int ct=point[PII(0,y)];
		add(rt,point[PII(x,y)]);add(ct,point[PII(x,y)]);
	}
	return ;
}


struct door
{
	int x,y,t;
}d[N];


int dfn[N],low[N],idx=0,st[N],top=0,co[N],col=0,s[N];
void tarjan(int u){
	low[u]=dfn[u]=++idx;
	st[++top]=u;
	for(int i=h[u];~i;i=g[i].nxt){
		int v=g[i].to;
		if(!dfn[v]) {
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}else if(!co[v]) low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u])
	{
		co[u]=++col;
		s[col]=w[u];
		while(st[top]!=u)
		{
			co[st[top]]=col;
			s[col]+=w[st[top]];
			top--;
		}
		top--;
	}
}


int main(){
	memset(h,-1,sizeof h);
	scanf("%d%d%d",&n,&r,&c);
	
	for(int i=1;i<=r;i++) point[PII(i,0)]=++cnt;
	for(int i=1;i<=c;i++) point[PII(0,i)]=++cnt;
	
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d%d",&d[i].x,&d[i].y,&d[i].t);
		getnode(d[i].x,d[i].y);w[point[PII(d[i].x,d[i].y)]]=1;
		int u=point[PII(d[i].x,d[i].y)],rv=point[PII(d[i].x,0)],cv=point[PII(0,d[i].y)];
		if(d[i].t==1) add(u,rv);
		else if(d[i].t==2) add(u,cv);
		else {
			for(int j=0;j<8;j++)
			{
				int dxx=dx[j]+d[i].x,dyy=dy[j]+d[i].y;
				if(inmap(dxx,dyy))
				{
					getnode(dxx,dyy);
					int t=point[PII(dxx,dyy)];
					add(u,t);
				}
			}
		}
	}
	
	for(int i=1;i<=cnt;i++)
		if(!dfn[i]) tarjan(i);
		
	int t=len;len=0;
	memset(h,-1,sizeof h);
	for(int i=1;i<=t;i++){
		int u=co[g[i].from],v=co[g[i].to];
		if(u!=v) add(u,v);
	}
	
	for(int i=1;i<=col;i++){
		for(int j=h[i];~j;j=g[j].nxt){
			int v=g[j].to;
			dp[i]=max(dp[i],dp[v]+s[i]);
		}
	}

	
	int ans=0;
	for(int i=1;i<=col;i++){
		ans=max(ans,dp[i]);
	}
	cout<<ans<<endl;
	return 0;
}
2022/10/3 13:40
加载中...