记录编号 |
459140 |
评测结果 |
AAAAAAAAAA |
题目名称 |
宝藏 |
最终得分 |
100 |
用户昵称 |
하루Kiev |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.633 s |
提交时间 |
2017-10-12 19:11:58 |
内存使用 |
104.17 MiB |
显示代码纯文本
# pragma GCC optimize("O3")
# include "iostream"
# include "stdio.h"
# include "algorithm"
# include "cmath"
# include "string.h"
# include "vector"
# define maxn 100005
using namespace std;
int n,r,c,sum,ans;
vector<int> vex[1000005];
vector<int> vey[1000005];
struct map{int x,y,dor;}e[maxn];
int st[maxn],zz;
struct node{int fro,to,next;}e1[maxn*40];
void add(int x,int y){
e1[++zz].fro=x;
e1[zz].to=y;
e1[zz].next=st[x];
st[x]=zz;
}
int low[maxn],dfn[maxn],tim,cnt,bl[maxn],size[maxn];
int sta[maxn],top;
bool vis[maxn];
void tarjan(int x){
low[x]=dfn[x]=++tim;
sta[++top]=x;
vis[x]=1;
for(int i=st[x];i;i=e1[i].next){
int t=e1[i].to;
if(!dfn[t]){
tarjan(t);
low[x]=min(low[x],low[t]);
}else if(vis[t]) low[x]=min(low[x],dfn[t]);
}
if(dfn[x]==low[x]){
cnt++;int k;
while(true){
k=sta[top--];
bl[k]=cnt;
size[cnt]++;
vis[k]=0;
if(k==x) break;
}
}
}
int zz1,st2[maxn],ru[maxn],f[maxn];
struct nodee{int to,next;}e2[maxn*40];
void addd(int x,int y){
e2[++zz1].next=st2[x];
e2[zz1].to=y;
st2[x]=zz1;
}
void dfs(int x){
if(f[x]) return;
for(int i=st2[x];i;i=e2[i].next)
{dfs(e2[i].to);f[x]=max(f[x],f[e2[i].to]);}
f[x]+=size[x];
}
int main(){
freopen("sdoi10sotomon.in","r",stdin);
freopen("sdoi10sotomon.out","w",stdout);
scanf("%d%d%d",&n,&r,&c);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].dor);
vex[e[i].x].push_back(i);
vey[e[i].y].push_back(i);
}
for(int i=1;i<=n;i++){
if(e[i].dor==1){
int sz=vex[e[i].x].size();
for(int j=0;j<sz;j++){
int t=vex[e[i].x][j];
if(t==i) continue;
add(i,t);
}continue;
}
if(e[i].dor==2){
int sz=vey[e[i].y].size();
for(int j=0;j<sz;j++){
int t=vey[e[i].y][j];
if(t==i) continue;
add(i,t);
}continue;
}
if(e[i].dor==3){
int sz=vex[e[i].x-1].size();
for(int j=0;j<sz;j++){
int t=vex[e[i].x-1][j];
if(e[t].y==e[i].y||e[t].y==e[i].y+1||e[t].y==e[i].y-1)
add(i,t);
}
sz=vex[e[i].x+1].size();
for(int j=0;j<sz;j++){
int t=vex[e[i].x+1][j];
if(e[t].y==e[i].y||e[t].y==e[i].y+1||e[t].y==e[i].y-1)
add(i,t);
}
sz=vey[e[i].y-1].size();
for(int j=0;j<sz;j++){
int t=vey[e[i].y-1][j];
if(e[t].x-e[i].x==0) {add(i,t);break;}
}
sz=vey[e[i].y+1].size();
for(int j=0;j<sz;j++){
int t=vey[e[i].y+1][j];
if(e[t].x-e[i].x==0) {add(i,t);break;}
}
}
}
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
for(int i=1;i<=zz;i++){
if(bl[e1[i].fro]!=bl[e1[i].to]){
addd(bl[e1[i].fro],bl[e1[i].to]);
ru[bl[e1[i].to]]++;
}
}
for(int i=1;i<=cnt;i++)
if(!ru[i]){
dfs(i);
ans=max(ans,f[i]);
}
printf("%d",ans);
}