记录编号 459129 评测结果 AAAAAAAAAA
题目名称 [SDOI 2010] 所驼门王的宝藏 最终得分 100
用户昵称 GravatarHzoi_Mafia 是否通过 通过
代码语言 C++ 运行时间 1.422 s
提交时间 2017-10-12 18:59:30 内存使用 28.16 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
using namespace std;
inline int read(){
	int sum(0);
	char ch(getchar());
	for(;ch<'0'||ch>'9';ch=getchar());
	for(;ch>='0'&&ch<='9';sum=sum*10+(ch^48),ch=getchar());
	return sum;
}
struct edge{
	int s,e;
	edge *n;
}*pre[100005],*adj[100005];
typedef pair<int,int> pii;
map<pii,int>ma;
inline void insert(int s,int e){
	edge *tmp(new edge);
	tmp->s=s;
	tmp->e=e;
	tmp->n=pre[s];
	pre[s]=tmp;
}
inline void add(int s,int e){
	edge *tmp(new edge);
	tmp->s=s;
	tmp->e=e;
	tmp->n=adj[s];
	adj[s]=tmp;
}
int n,r,c;
vector<int>hx[1000005];
vector<int>ly[1000005];
int x[100005],y[100005],t[100005];
int cnt,top,qlt,vis[100005],bl[100005],dfn[100005],low[100005],size[100005],sta[100005];
int mov[8][2]={{1,1},{1,0},{1,-1},{0,1},{0,-1},{-1,1},{-1,0},{-1,-1}};
int in[100005];
inline bool check(int x,int y){
	if(x<=0||y<=0||x>r||y>c)return true;
	return false;
}
inline int tarjan(int u){
	dfn[u]=low[u]=++cnt;
	vis[u]=1;
	sta[++top]=u;
	for(edge *i=pre[u];i;i=i->n){
		int e(i->e);
		if(!dfn[e]){
			tarjan(e);
			low[u]=min(low[u],low[e]);
		}
		else
			if(vis[e])
				low[u]=min(low[u],dfn[e]);
	}
	if(low[u]==dfn[u]){
		++qlt;
		int tmp;
		while(1){
			tmp=sta[top--];
			vis[tmp]=0;
			bl[tmp]=qlt;
			if(tmp==u)
				break;
		}
	}
}
inline int dfs(int u){
	vis[u]=cnt;
	int ret(size[u]);
	for(edge *i=adj[u];i;i=i->n){
		int e(i->e);
		if(vis[e]==cnt)continue;
		ret=max(ret,dfs(e)+size[u]);
	}
	vis[u]=0;
	return ret;
}
queue<int>q;
int f[100005];
int main(){
	freopen("sdoi10sotomon.in","r",stdin);
	freopen("sdoi10sotomon.out","w",stdout);
	memset(pre,NULL,sizeof(pre));
	memset(adj,NULL,sizeof(adj));
	n=read(),r=read(),c=read();
	for(int i=1;i<=n;++i){
		x[i]=read(),y[i]=read(),t[i]=read();
		hx[x[i]].push_back(i);
		ly[y[i]].push_back(i);
		ma[pii(x[i],y[i])]=i;
	}
	for(int i=1;i<=n;++i){
		if(t[i]==1){
			int size(hx[x[i]].size());
			for(int j=0;j<size;++j){
				if(hx[x[i]][j]==i)continue;
				insert(i,hx[x[i]][j]);
			}
		}
		if(t[i]==2){
			int size(ly[y[i]].size());
			for(int j=0;j<size;++j){
				if(ly[y[i]][j]==i)continue;
				insert(i,ly[y[i]][j]);
			}
		}
		if(t[i]==3){
			for(int j=0;j<8;++j){
				int tmpx(x[i]+mov[j][0]),tmpy(y[i]+mov[j][1]);
				if(check(tmpx,tmpy)||!ma.count(pii(tmpx,tmpy)))continue;
				insert(i,ma[pii(tmpx,tmpy)]);
			}
		}
	}
	for(int i=1;i<=n;++i)
		if(!dfn[i])
			tarjan(i);
	for(int i=1;i<=n;++i){
		for(edge *j=pre[i];j;j=j->n){
			int e(j->e);
			if(bl[i]!=bl[e]){
				add(bl[i],bl[e]);
				++in[bl[e]];
//				cout<<i<<' '<<e<<
			}
		}
	}
	for(int i=1;i<=n;++i)
		++size[bl[i]];
	for(int i=1;i<=qlt;++i)
		if(!in[i])
			q.push(i),f[i]=size[i];
	while(!q.empty()){
		int k(q.front());
		q.pop();
		for(edge *i=adj[k];i;i=i->n){
			int e(i->e);
			--in[e];
			f[e]=max(f[e],f[k]+size[e]);
			if(!in[e])
				q.push(e);
		}
	}
	int ans(0);
	for(int i=1;i<=qlt;++i)
		ans=max(ans,f[i]);
	printf("%d",ans);
}