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

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

时间限制:1000MS

内存限制:131072KB

Description

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

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

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

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

此时Zrn神犇和妹纸都看到了2个星群。

接着又落下了一排星星:

此时在Zrn神犇看来有2个星群,而在妹纸眼中只有1个星群。

又落下了第三排星星:

此时Zrn神犇看到的有3个星群,而在妹纸眼中依然只有一个星群。

妹纸看得有些累了,便靠在Zrn神犇的身上。Zrn神犇也伸出手臂,轻轻搂住她。

这时妹纸发话了:“你知道在任意时刻我们看到的星群数量各是多少吗?说不出来你亲我一下!”

Zrn神犇当然不想说啦!所以你就来算一下吧。

Input Format

第一行两个整数N,M

接下来一个N行M列的矩阵,表示在第N个时刻星盘上的布局,“*”表示该格有星星,“ ”表示该格没有星星。

下面一行一个整数Q,代表询问个数。

接下来Q行,每行一个正整数T,表示询问第T个时刻。

Output Format

输出Q行,对于每个T,输出一行两个整数,分别为在第T个时刻Zrn神犇看到的星群数量和妹纸看到的星群数量。

Sample Input

3 3
* *
 **
*
3
1
2
3

Sample Output

2 2
2 1
3 1

Hint

# N M Q
1 10 10 1
2 2000 2000 1
3 3000 2000 2
4 50 50 50
5 40 40 5000
6 50 50 10000
7 1000 1000 50000
8 2000 2000 100000
9 5000 200 50000
10 20000 200 100000

保证1≤T≤N。

【题解】

就是并查集了,妹子的开一个,Zrn的开一个。

然后输入的时候进行维护,维护每个时段。

滚动数组进行优化。

并查集的时候我开同一个来进行操作=-=竟然T了!!!!!

然后我就分开来写,AC了=-=

我们需要分开来来优化。。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int f[2][40000010],r[20001][2001],t[2],n,m,ans[2][20001],k;
 4 int getf0(int x) {return f[0][x]==x?x:f[0][x]=getf0(f[0][x]);}
 5 int getf1(int x) {return f[1][x]==x?x:f[1][x]=getf1(f[1][x]);}
 6 void join0(int a,int b) {
 7     int fa=getf0(a),fb=getf0(b);
 8     if(fa!=fb) f[0][fa]=fb,t[0]--;
 9 }
10 void join1(int a,int b) {
11     int fa=getf1(a),fb=getf1(b);
12     if(fa!=fb) f[1][fa]=fb,t[1]--;
13 }
14 int read() {
15     int x=0; int fx=1;
16     char ch=getchar();
17     while(ch<‘0‘||ch>‘9‘) {if(ch==‘-‘) fx=-1; ch=getchar();}
18     while(ch>=‘0‘&&ch<=‘9‘) {x=x*10+ch-‘0‘; ch=getchar();}
19     return x*fx;
20 }
21 int main() {
22     n=read(),m=read();
23     for (int i=0;i<n;++i) {
24         for(int j=0;j<m;++j) {
25             char c=getchar();
26             if(c==‘*‘) {
27                 ++k;
28                 f[0][k]=f[1][k]=r[i][j]=k;
29                 t[0]++,t[1]++;
30                 if(j&&r[i][j-1]) {
31                     join0(r[i][j],r[i][j-1]);
32                     join1(r[i][j],r[i][j-1]);
33                 }
34                 if(i&&r[i-1][j]) {
35                     join0(r[i][j],r[i-1][j]);
36                     join1(r[i][j],r[i-1][j]);
37                 }
38                 if(i&&j&&r[i-1][j-1]) join1(r[i][j],r[i-1][j-1]);
39                 if(i&&j+1<m&&r[i-1][j+1]) join1(r[i][j],r[i-1][j+1]);
40             }
41         }
42         getchar();
43         ans[0][i]=t[0];
44         ans[1][i]=t[1];
45     }
46     int T,rx;
47     T=read();
48     while(T--) {
49         rx=read();rx--;
50         printf("%d %d\n",ans[0][rx],ans[1][rx]);
51     }
52     return 0;
53 }

最后终于最变态的点优化到0.92s,还加了读入优化,不然就0.98s了吧=-=

时间: 2024-11-03 22:46:12

[FZYZOJ 2132] Zrn神犇之一起来看流星雨的相关文章

[FZYZOJ 2162] Zrn神犇之折纸游戏

P2162 -- Zrn神犇之折纸游戏 时间限制:2000MS 内存限制:524288KB Description Zrn神犇最近喜欢上一款折纸游戏,因此他几乎每天都拿着一条悠长悠长又寂寥的纸带折来折去.其具体规则是这样的: 这是一个长度为N,宽度为1的纸条,从1开始写着连续的N个自然数. 1 2 3 4 5 6 … N 如果它的长度为偶数,Zrn神犇则会很高兴,直接把它从左往右或从右往左对折.比如长度为6的纸条从左往右对折完就会是这样: 如果它的长度为质数,Zrn神犇则会觉得不太爽,他就只能把

P2456 - 膜拜神犇

P2456 - 膜拜神犇 Description 有一个 n 个点 m 条边的有向图, 蒟蒻可以从 1 号点出发在图上走, 并且最终需要回到 1 号点. 每个点都有一个神犇( 包括 1 号点), 每次经过一个没到过的点, 蒟蒻都会膜拜那位 神犇. 蒟蒻希望膜拜尽可能多的神犇. 由于蒟蒻膜拜神犇的欲望非常强烈, 所以他可以有一次机会逆着一条有向边的方向走. ( 需要注意的是, 这条边的方向不会改变). 你现在想知道, 蒟蒻最多能膜拜多少神犇? Input 第一行 2 个整数 n. m, 分别表示图

P2300 合并神犇 DP

题目背景 loidc来到了NOI的赛场上,他在那里看到了好多神犇. 题目描述 神犇们现在正排成一排在刷题.每个神犇都有一个能力值p[i].loidc认为坐在附近的金牌爷能力参差不齐非常难受.于是loidc便想方设法对神犇们进行人道主义合并. loidc想把神犇的能力值排列成从左到右单调不减.他每次可以选择一个神犇,把他合并到两侧相邻的神犇上.合并后的新神犇能力值是以前两位犇的能力值之和.每次合并完成后,被合并的两个神犇就会消失.合并后的新神犇不能再分开(万一他俩有女朋友咋办)因此每次合并后神犇的

cogs 1656. 膜拜神犇

1656. 膜拜神犇 ★☆   输入文件:trioxorz.in   输出文件:trioxorz.out   简单对比时间限制:0.5 s   内存限制:128 MB [题目描述] bigmingod 是F.M.S信息组的组草,同时也是万人膜拜的神犇,整个年级暗恋他的女生不计其数,这让机房里的三只蒟蒻QYHDS,LZK,OIdiot羡慕嫉妒恨.为了获得像bigmingod一样的成就,这三只蒟蒻决定每次竞赛课前对他进行膜拜--三个人构成一个三角形,将bigmingod包围在内部(不包括边上),称为

【BZOJ4916】神犇和蒟蒻 杜教筛

[BZOJ4916]神犇和蒟蒻 Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你输出一个整数A=\sum_{i=1}^N{\mu (i^2)}; 请你输出一个整数B=\sum_{i=1}^N{\varphi (i^2)}; Sample Input 1 Sample Output 1 1 题解:哎?上面的那个东西好像一直是1?(废话),然后 设j=i/d,

bzoj4916 神犇和蒟蒻

Description 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; Input 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; Output 请你输出一个整数A=\sum_{i=1}^N{\mu (i^2)}; 请你输出一个整数B=\sum_{i=1}^N{\varphi (i^2)}; Sample Input 1 Sample Output 1 1 正解:杜教筛. 第一问答案是$1$. 第二问,先给个结论:$\varphi (n^{2})=n\va

合并神犇

题目背景 loidc来到了NOI的赛场上,他在那里看到了好多神犇. 题目描述 神犇们现在正排成一排在刷题.每个神犇都有一个能力值p[i].loidc认为坐在附近的金牌爷能力参差不齐非常难受.于是loidc便想方设法对神犇们进行人道主义合并. loidc想把神犇的能力值排列成从左到右单调不减.他每次可以选择一个神犇,把他合并到两侧相邻的神犇上.合并后的新神犇能力值是以前两位犇的能力值之和.每次合并完成后,被合并的两个神犇就会消失.合并后的新神犇不能再分开(万一他俩有女朋友咋办)因此每次合并后神犇的

【BZOJ4916】神犇和蒟蒻(杜教筛)

[BZOJ4916]神犇和蒟蒻(杜教筛) 题面 BZOJ 求 \[\sum_{i=1}^n\mu(i^2)\ \ 和\ \sum_{i=1}^n\phi(i^2)\] 其中\[n<=10^9\] 题解 第一问 搞笑的 不会做? 算了.. 还是说一下: 想想\(\mu(x)\)是怎么算的??? 既然是\(i^2\),每个因数的个数一定不会是\(1\) 所以除了\(\mu(1)\)外一定都是\(0\) 所以第一问的答案一定是\(1\) 第二问: 先看看要求的是什么 \(\phi(i^2)=i*\ph

DP——P2300 合并神犇

题目背景 loidc来到了NOI的赛场上,他在那里看到了好多神犇. 题目描述 神犇们现在正排成一排在刷题.每个神犇都有一个能力值p[i].loidc认为坐在附近的金牌爷能力参差不齐非常难受.于是loidc便想方设法对神犇们进行人道主义合并. loidc想把神犇的能力值排列成从左到右单调不减.他每次可以选择一个神犇,把他合并到两侧相邻的神犇上.合并后的新神犇能力值是以前两位犇的能力值之和.每次合并完成后,被合并的两个神犇就会消失.合并后的新神犇不能再分开(万一他俩有女朋友咋办)因此每次合并后神犇的