蒟蒻 20pts求助
查看原帖
蒟蒻 20pts求助
305121
8atemak1r楼主2021/11/15 10:03
#include<iostream>
#include<stdio.h>
#include<map>
#include<stack> 
#include<queue>
#include<algorithm>
#define maxn 2100005
#define maxm 1000005
using namespace std;
int n,r,c;

struct edge{
	int to,next;
}e[maxm],en[maxm];

int head[maxn],cnt;

inline void add(int u,int v){
	e[++cnt]={v,head[u]};
	head[u]=cnt;
}

int headn[maxn],cntn;

inline void addn(int u,int v){
	en[++cntn]={v,headn[u]};
	headn[u]=cntn;
} 

struct node{
	int x,y;
	bool operator < (const node &a)const{return a.x<x||(a.x==x&&a.y<y);}
};

struct door{
	int typ,num;
};

map<node,door> mp;

int xx[8]={-1,-1,0,1,1,1,0,-1},yy[8]={0,-1,-1,-1,0,1,1,1};
int dfn[maxn],low[maxn],ind,color,belong[maxn],val[maxn];
bool vis[maxn];
stack<int> s;

void tar(int u){
	vis[u]=1;
	s.push(u);
	dfn[u]=low[u]=++ind;
	for(int i=head[u];i;i=e[i].next){
		int v=e[i].to;
		if(dfn[v]==0){
			tar(v);
			low[u]=min(low[u],low[v]); 
		}
		if(vis[v]) low[u]=min(low[u],low[v]);
	}
	if(dfn[u]==low[u]){
		color++;
		int t=-1;
		while(t!=u){
			t=s.top();s.pop();
			vis[t]=0;belong[t]=color;
			if(t>r+c) val[color]++;
		}
	}
}

int in[maxn],dp[maxn],ans=-0x7fffffff;
queue<int> q;

void topo(){
	for(int i=1;i<=color;i+=1){
		if(in[i]==0){
			q.push(i);
//			cout<<i<<' ';
			dp[i]=val[i];
		} 
	}
	while(!q.empty()){
		int x=q.front();q.pop();
		for(int i=headn[x];i;i=en[i].next){
			int y=en[i].to;
			in[y]--;
			dp[y]=max(dp[y],dp[x]+val[y]);
			if(in[y]==0){
				q.push(y);
			}
		}
	}
	for(int i=1;i<=color;i+=1) ans=max(ans,dp[i]);
}

struct no{
	int x,y,typ;
}a[maxn];

bool cmp(no a,no b){
	if(a.typ==b.typ){
		if(a.x==b.x) return a.y<b.y;
		return a.x<b.x;
	}
	return a.typ<b.typ;
}

int main(){
	cin>>n>>r>>c;	
	int x,y,typ;
	for(int i=1;i<=n;i+=1) scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].typ);
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i+=1){
		x=a[i].x,y=a[i].y,typ=a[i].typ;
		add(x,i+c+r);
		add(y+r,i+c+r);
		if(typ==1){
			add(i+c+r,x);
			mp[{x,y}]={1,i+c+r};
		}
		else if(typ==2){
			add(i+c+r,y+r);
			mp[{x,y}]={2,i+c+r};
		}
		else{
			int tmpx=x,tmpy=y;
			mp[{x,y}]={3,r+c+i};
			for(int j=0;j<8;j+=1){
				door tmp=mp[{tmpx+xx[j],tmpy+yy[j]}];
				if(tmp.num!=0&&1<=tmpx+xx[j]&&r>=tmpx+xx[j]&&1<=tmpy+yy[j]&&c>=tmpy+yy[j]){
					add(r+c+i,tmp.num);
				}
			} 
		}
	}
	for(int i=1;i<=r+c+n;i+=1) if(dfn[i]==0) tar(i);
	for(int i=1;i<=r+c+n;i+=1){
		for(int j=head[i];j;j=e[j].next){
			int v=e[j].to;
			if(belong[i]==belong[v]) continue;
			addn(belong[i],belong[v]);
			in[belong[v]]++;
		}
	}
	topo();
	cout<<ans;
	return 0;
} 
2021/11/15 10:03
加载中...