求助,谜之MLE
查看原帖
求助,谜之MLE
341362
CodePenguin楼主2022/8/5 10:45

RT,是建立虚点的方式。

不知道是不是vector的问题。

#include<bits/stdc++.h>
using namespace std;
int n,r,c,cnt;
vector<int>g[500001];
struct room{
	int x,y,op;
}a[100001];
vector<int>ht[1000001],zh[1000001];
map<int,int>ry[1000001];
void makegraph()
{
	for(int i=1;i<=n;i++)
	{
		ry[a[i].x][a[i].y]=i;
		ht[a[i].x].push_back(i);
		zh[a[i].y].push_back(i);
	}
//	for(int i=1;i<=r;i++)
//	{
//		printf("#%d: ",i);
//		for(int j=0;j<ht[i].size();j++)printf("%d ",ht[i][j]);
//		printf("\n");
//	}
	for(int i=1;i<=r;i++)
	{
		if(!ht[i].size())continue;
		cnt++;
		for(int j=0;j<ht[i].size();j++)
		{
			g[cnt].push_back(ht[i][j]);
			if(a[ht[i][j]].op==1)g[ht[i][j]].push_back(cnt);
		}
	}
	for(int i=1;i<=c;i++)
	{
		if(!zh[i].size())continue;
		cnt++;
		for(int j=0;j<zh[i].size();j++)
		{
			g[cnt].push_back(zh[i][j]);
			if(a[zh[i][j]].op==2)g[zh[i][j]].push_back(cnt);
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(a[i].op!=3)continue;
		int x=a[i].x,y=a[i].y;
		for(int dx=-1;dx<=1;dx++)
		{
			for(int dy=-1;dy<=1;dy++)
			{
				if(dx==0&&dy==0)continue;
				int p=x+dx,q=y+dy;
				if(p>0&&q>0&&p<=r&&q<=c&&ry[p][q])g[i].push_back(ry[p][q]);
			}
		}
	}
//	for(int i=1;i<=cnt;i++)
//	{
//		for(int j=0;j<g[i].size();j++)printf("%d->%d\n",i,g[i][j]);
//	}
}
int dfn[500001],low[500001],fa[500001],sz[500001],tarj;
stack<int>S;
bool inst[500001];
void init(){for(int i=1;i<=cnt;i++)fa[i]=i,sz[i]=(i<=n);}
void dfs(int now)
{
	dfn[now]=low[now]=++tarj;
	S.push(now);inst[now]=true;
	for(int i=0;i<g[now].size();i++)
	{
		int to=g[now][i];
		if(!dfn[to])dfs(to),low[now]=min(low[now],low[to]);
		else if(inst[to])low[now]=min(low[now],dfn[to]);
	}
	if(dfn[now]==low[now])
	{
		for(;!S.empty();S.pop())
		{
			int son=S.top();
			inst[son]=false;
			if(son==now)break;
			fa[son]=now;sz[now]+=sz[son];
		}
		S.pop();
	}
}
int in[500001],f[500001];
vector<int>e[500001];
void remakegraph()
{
	for(int i=1;i<=cnt;i++)
	{
		int fr=fa[i];
		for(int j=0;j<g[i].size();j++)
		{
			int to=fa[g[i][j]];
			if(fr==to)continue;
			e[fr].push_back(to);in[to]++;
//			printf("%d->%d\n",fr,to);
		}
	}
}
queue<int>Q;
void TPsort()
{
	for(int i=1;i<=cnt;i++)
	{
		if(fa[i]!=i)continue;
		if(!in[i])Q.push(i);
		f[i]=sz[i];
	}
	while(!Q.empty())
	{
		int now=Q.front();Q.pop();
		for(int i=0;i<e[now].size();i++)
		{
			int to=e[now][i];
			f[to]=max(f[to],f[now]+sz[to]);
//			printf("%d->%d %d\n",now,to,f[to]);
			if(--in[to]==0)Q.push(to);
		}
	}
	int maxn=0;
	for(int i=1;i<=cnt;i++)
	{
		if(fa[i]==i)maxn=max(maxn,f[i]);
	}
	printf("%d",maxn);
}
int main()
{
	scanf("%d%d%d",&n,&r,&c);cnt=n;
	for(int i=1;i<=n;i++)scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].op);
	makegraph();init();
	for(int i=1;i<=cnt;i++)
	{
		if(!dfn[i])dfs(i);
	}
//	for(int i=1;i<=cnt;i++)printf("%d ",fa[i]);printf("\n");
	remakegraph();TPsort();
	return 0;
}
2022/8/5 10:45
加载中...