您的位置:首页 > 其它

[FZYZOJ 2132] Zrn神犇之一起来看流星雨

2015-06-09 17:28 555 查看

P2132 -- Zrn神犇之一起来看流星雨

时间限制:1000MS

内存限制:131072KB

Description

Zrn神犇带着妹纸来到异度空间看流星雨。

那儿有个矩形的星盘,一共有N*M格,流星雨都会落在那里。只是,那里的流星雨很奇特,都是很有节奏地、成排成排地落下的。每个时刻都会落下一排的流星,它们落在星盘上,形成了一个一个星群。

而Zrn神犇和妹纸对于星群的定义是不一样的。Zrn神犇认为,一颗星星和它周围的四个格子里的星星属于同一个星群。而妹纸认为,一颗星星和它周围的八个格子里的星星都属于同一个星群。

比如在第一个时刻,星盘上可能是这样的:

#include<bits/stdc++.h>
using namespace std;
int f[2][40000010],r[20001][2001],t[2],n,m,ans[2][20001],k;
int getf0(int x) {return f[0][x]==x?x:f[0][x]=getf0(f[0][x]);}
int getf1(int x) {return f[1][x]==x?x:f[1][x]=getf1(f[1][x]);}
void join0(int a,int b) {
int fa=getf0(a),fb=getf0(b);
if(fa!=fb) f[0][fa]=fb,t[0]--;
}
void join1(int a,int b) {
int fa=getf1(a),fb=getf1(b);
if(fa!=fb) f[1][fa]=fb,t[1]--;
}
int read() {
int x=0; int fx=1;
char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') fx=-1; ch=getchar();}
while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
return x*fx;
}
int main() {
n=read(),m=read();
for (int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
char c=getchar();
if(c=='*') {
++k;
f[0][k]=f[1][k]=r[i][j]=k;
t[0]++,t[1]++;
if(j&&r[i][j-1]) {
join0(r[i][j],r[i][j-1]);
join1(r[i][j],r[i][j-1]);
}
if(i&&r[i-1][j]) {
join0(r[i][j],r[i-1][j]);
join1(r[i][j],r[i-1][j]);
}
if(i&&j&&r[i-1][j-1]) join1(r[i][j],r[i-1][j-1]);
if(i&&j+1<m&&r[i-1][j+1]) join1(r[i][j],r[i-1][j+1]);
}
}
getchar();
ans[0][i]=t[0];
ans[1][i]=t[1];
}
int T,rx;
T=read();
while(T--) {
rx=read();rx--;
printf("%d %d\n",ans[0][rx],ans[1][rx]);
}
return 0;
}


View Code
最后终于最变态的点优化到0.92s,还加了读入优化,不然就0.98s了吧=-=
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: