记录编号 |
461616 |
评测结果 |
AAAAAAAA |
题目名称 |
城堡 |
最终得分 |
100 |
用户昵称 |
liuyu |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.010 s |
提交时间 |
2017-10-20 09:50:34 |
内存使用 |
0.40 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,m,ss[60][60],f[10100],sum[10100];
int ans1,ans2=1,ans3,s,t,x,y,ans4=0;
char c;
int find(int x){
return f[x]==x ? x:f[x]=find(f[x]);
}
struct ed{
int fr,to;
};
vector<ed>v;
bool cmp(ed a,ed b){
int ax,ay,bx,by;
ax=a.fr/100,ay=a.fr%100;
bx=b.fr/100,by=b.fr%100;
if(ay!=by)return ay<by;
if(ax!=bx)return ax>bx;
ax=a.to/100,ay=a.to%100;
bx=b.to/100,by=b.to%100;
if(ay!=by)return ay<by;
return ax>bx;
}
int main(){
freopen("castle.in","r",stdin);
freopen("castle.out","w",stdout);
ios::sync_with_stdio(false);
cin>>m>>n;
ans1=n*m;ans2=1;
for(int i=1;i<=9999;i++)f[i]=i,sum[i]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>ss[i][j];
int a=ss[i][j],u,r;//cout<<ss[i][j]<<" "<<a<<endl;
u=i*100+(j-1);r=i*100+j;
if(!(a&1)&&j-1){
s=find(u),t=find(r);
if(s!=t){f[s]=t;sum[t]+=sum[s];ans1--;ans4++;ans2=max(ans2,sum[t]);}
}
else if(j-1)v.push_back((ed){u,r});
a>>=1;
u=(i-1)*100+j;
if(!(a&1)&&i-1){
s=find(u),t=find(r);
if(s!=t){f[s]=t;sum[t]+=sum[s];ans1--;ans4++;ans2=max(ans2,sum[t]);}
}
else if(i-1)v.push_back((ed){r,u});
a>>=1;
u=i*100+(j+1);
if(!(a&1)&&j+1<=m){
s=find(u),t=find(r);
if(s!=t){f[s]=t;sum[t]+=sum[s];ans1--;ans4++;ans2=max(ans2,sum[t]);}
}
else if(j+1<=m)v.push_back((ed){r,u});
a>>=1;
u=(i+1)*100+j;
if(!(a&1)&&i+1<=n){
s=find(u),t=find(r);
if(s!=t){f[s]=t;sum[t]+=sum[s];ans1--;ans4++;ans2=max(ans2,sum[t]);}
}
else if(i+1<=n)v.push_back((ed){u,r});
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<v.size();i++){
s=find(v[i].fr),t=find(v[i].to);
if(s!=t&&ans3<sum[s]+sum[t]){
//cout<<sum[s]<<" "<<sum[t]<<endl;
ans3=sum[s]+sum[t];
x=v[i].fr/100;
y=v[i].fr%100;
int a=v[i].to/100,b=v[i].to%100;
if(x-1==a)c='N';
if(y+1==b)c='E';
}
}
cout<<ans1<<endl<<ans2<<endl<<ans3<<endl<<x<<" "<<y<<" "<<c<<endl;
return 0;
}