「模拟8.13」任(liu_runda的神题,性质分析)
考场时没有发现性质,用了个前缀和优化暴力,结果写WA了
我们发现其实联通块的个数就是点的个数-边的个数
然后我们需要维护横向上和纵向上的边的前缀和
前缀和的查询形式稍改一下
暴力
1 #include<cstdio>
2 #include<iostream>
3 #include<cstdio>
4 #include<cstring>
5 #include<cmath>
6 #include<algorithm>
7 #include<set>
8 #include<vector>
9 #include<queue>
10 #define int long long
11 #define MAXN 6001
12 using namespace std;
13 int read()
14 {
15 int x=0;char cc=getchar();
16 while(cc<'0'||cc>'9')cc=getchar();
17 while(cc>='0'&&cc<='9'){x=(x<<1)+(x<<3)+(cc^48);cc=getchar();}
18 return x;
19 }
20 char a[MAXN][MAXN];
21 int sum[MAXN][MAXN];
22 int c[MAXN][MAXN];
23 int vis[MAXN][MAXN];
24 int n,m; queue<int>q_x;queue<int>q_y;
25 void BFS(int top_x,int top_y)
26 {
27 int maxn_x=top_x,maxn_y=top_y;
28
29 q_x.push(top_x);q_y.push(top_y);
30 vis[top_x][top_y]=1;
31 //belong[top_x][top_y]=cntt;
32 while(!q_x.empty())
33 {
34 int x=q_x.front();int y=q_y.front();q_x.pop();q_y.pop();
35 //belong[x][y]=cntt;
36 if(a[x-1][y]=='1'&&vis[x-1][y]==0)
37 {
38 q_x.push(x-1);q_y.push(y);
39 vis[x-1][y]=1;
40 maxn_x=max(maxn_x,x-1);maxn_y=max(maxn_y,y);
41 }
42 if(a[x][y-1]=='1'&&vis[x][y-1]==0)
43 {
44 q_x.push(x);q_y.push(y-1);
45 vis[x][y-1]=1;
46 maxn_x=max(maxn_x,x);maxn_y=max(maxn_y,y-1);
47 }
48 if(a[x+1][y]=='1'&&vis[x+1][y]==0)
49 {
50 q_x.push(x+1);q_y.push(y);
51 vis[x+1][y]=1;
52 maxn_x=max(maxn_x,x+1);maxn_y=max(maxn_y,y);
53 }
54 if(a[x][y+1]=='1'&&vis[x][y+1]==0)
55 {
56 q_x.push(x);q_y.push(y+1);
57 vis[x][y+1]=1;
58 maxn_x=max(maxn_x,x);maxn_y=max(maxn_y,y+1);
59 }
60 }
61 sum[maxn_x][maxn_y]++;
62 //mex[cntt]=maxn_x;
63 //mey[cntt]=maxn_y;
64 }
65 int q;int cnt;
66 int ans=0;
67 int get_sum(int x1,int y1,int x2,int y2)
68 {
69 return sum[x2][y2]+sum[x1-1][y1-1]-sum[x2][y1-1]-sum[x1-1][y2];
70 }
71 int judge(int x,int y,int x1,int y1,int x2,int y2)
72 {
73 if(x<x1)return 0;if(x>x2)return 0;if(y<y1)return 0;if(y>y2)return 0;
74 return 1;
75 }
76 void BFS_S(int top_x,int top_y,int x1,int y1,int x2,int y2)
77 {
78
79 q_x.push(top_x);q_y.push(top_y);
80 vis[top_x][top_y]=1;
81 while(!q_x.empty())
82 {
83 int x=q_x.front();int y=q_y.front();q_x.pop();q_y.pop();
84 if(a[x-1][y]=='1'&&vis[x-1][y]==0&&judge(x-1,y,x1,y1,x2,y2))
85 {
86 q_x.push(x-1);q_y.push(y);
87 vis[x-1][y]=1;
88 }
89 if(a[x][y-1]=='1'&&vis[x][y-1]==0&&judge(x,y-1,x1,y1,x2,y2))
90 {
91 q_x.push(x);q_y.push(y-1);
92 vis[x][y-1]=1;
93 }
94 if(a[x+1][y]=='1'&&vis[x+1][y]==0&&judge(x+1,y,x1,y1,x2,y2))
95 {
96 q_x.push(x+1);q_y.push(y);
97 vis[x+1][y]=1;
98 }
99 if(a[x][y+1]=='1'&&vis[x][y+1]==0&&judge(x,y+1,x1,y1,x2,y2))
100 {
101 q_x.push(x);q_y.push(y+1);
102 vis[x][y+1]=1;
103 }
104 }
105 }
106 void work(int x1,int y1,int x2,int y2)
107 {
108 ans=0;
109 for(int i=x1;i<=x2;++i)
110 {
111 //printf("i=%lld y1=%lld\n",i,y1);
112 for(int j=y1;j<=y2;++j)
113 {
114 if(vis[i][j]==0&&a[i][j]=='1')
115 {
116 BFS_S(i,j,x1,y1,x2,y2);
117 ans++;
118 }
119 }
120 //printf("ans=%lld\n",ans);
121 }
122 for(int i=x1;i<=x2;++i)for(int j=y1;j<=y2;++j)vis[i][j]=0;
123 }
124 signed main()
125 {
126 scanf("%lld%lld%lld",&n,&m,&q);
127 for(int i=1;i<=n;++i)
128 {
129 scanf("%s",a[i]+1);
130 }
131 for(int i=1;i<=n;++i)
132 {
133 for(int j=1;j<=m;++j)
134 {
135 if(a[i][j]=='1'&&vis[i][j]==0)
136 {
137 BFS(i,j);
138 }
139 }
140 }
141 for(int i=1;i<=n;++i)
142 {
143 for(int j=1;j<=m;++j)
144 {
145 sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
146 }
147 }
148 memset(vis,0,sizeof(vis));
149 for(int i=1;i<=q;++i)
150 {
151 int x1,y1,x2,y2;
152 ans=0;
153 x1=read();y1=read();x2=read();y2=read();
154 //printf("x1=%lld y1=%lld x2=%lld y2=%lld\n",x1,y1,x2,y2);
155 work(x1,y1,x2,y2);
156 printf("%lld\n",ans);
157 }
158 }
AC
1 #include<cstdio>
2 #include<iostream>
3 #include<cstdio>
4 #include<cstring>
5 #include<cmath>
6 #include<algorithm>
7 #include<set>
8 #include<vector>
9 #include<queue>
10 #define int long long
11 #define MAXN 6001
12 using namespace std;
13 int sum[MAXN][MAXN];
14 int vis[MAXN][MAXN];
15 int n,m;
16 char a[MAXN][MAXN];
17 int sum_lie[MAXN][MAXN],sum_hang[MAXN][MAXN];
18 int q_x[MAXN],q_y[MAXN];
19 void BFS(int top_x,int top_y)
20 {
21 int head,tail;
22 head=1;tail=1;q_x[1]=top_x;q_y[1]=top_y;
23 vis[top_x][top_y]=1;
24 while(head<=tail)
25 {
26 int x=q_x[head];int y=q_y[head];head++;
27 sum[x][y]++;//printf("add sum[%lld][%lld]=%lld\n",x,y,sum[x][y]);
28 if(a[x][y-1]=='1')sum_hang[x][y]++;
29 if(a[x-1][y]=='1')sum_lie[x][y]++;
30 if(a[x][y+1]=='1'&&vis[x][y+1]==0)
31 {
32 vis[x][y+1]=1;q_x[++tail]=x;q_y[tail]=y+1;
33 }
34 if(a[x][y-1]=='1'&&vis[x][y-1]==0)
35 {
36 vis[x][y-1]=1;q_x[++tail]=x;q_y[tail]=y-1;
37 }
38 if(a[x-1][y]=='1'&&vis[x-1][y]==0)
39 {
40 vis[x-1][y]=1;q_x[++tail]=x-1;q_y[tail]=y;
41 }
42 if(a[x+1][y]=='1'&&vis[x+1][y]==0)
43 {
44 vis[x+1][y]=1;q_x[++tail]=x+1;q_y[tail]=y;
45 }
46 }
47 }
48 int q;
49 signed main()
50 {
51 scanf("%lld%lld%lld",&n,&m,&q);
52 for(int i=1;i<=n;++i)
53 {
54 scanf("%s",a[i]+1);
55 }
56 for(int i=1;i<=n;++i)
57 {
58 for(int j=1;j<=m;++j)
59 {
60 if(vis[i][j]==0&&a[i][j]=='1')
61 BFS(i,j);
62 }
63 }
64 for(int i=1;i<=n;++i)
65 {
66 for(int j=1;j<=m;++j)
67 {
68 sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
69 //printf("sum[%lld][%lld]=%lld\n",i,j,sum[i][j]);
70 }
71 }
72 for(int i=1;i<=n;++i)
73 {
74 for(int j=1;j<=m;++j)
75 {
76 sum_hang[i][j]+=sum_hang[i][j-1]+sum_hang[i-1][j]-sum_hang[i-1][j-1];
77 sum_lie[i][j]+=sum_lie[i][j-1]+sum_lie[i-1][j]-sum_lie[i-1][j-1];
78 }
79 }
80 for(int i=1;i<=q;++i)
81 {
82 int x1,x2,y1,y2;
83 scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
84 int tt=sum[x2][y2]+sum[x1-1][y1-1]-sum[x2][y1-1]-sum[x1-1][y2];
85 int ttt=sum_hang[x2][y2]+sum_hang[x1-1][y1]-sum_hang[x2][y1]-sum_hang[x1-1][y2];
86 int tttt=sum_lie[x2][y2]+sum_lie[x1][y1-1]-sum_lie[x2][y1-1]-sum_lie[x1][y2];
87 //printf("tt=%lld ttt=%lld\n",tt,ttt);
88 printf("%lld\n",tt-ttt-tttt);
89 }
90 }
「模拟8.13」任(liu_runda的神题,性质分析)的更多相关文章
- 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...
- 2021升级版微服务教程5—通过IDEA运行多个项目实例「模拟集群」
2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...
- 「模拟赛20190327」 第二题 DP+决策单调性优化
题目描述 小火车虽然很穷,但是他还是得送礼物给妹子,所以他前往了二次元寻找不需要钱的礼物. 小火车准备玩玩二次元的游戏,游戏当然是在一个二维网格中展开的,网格大小是\(n\times m\)的,某些格 ...
- 「模拟8.29」chinese(性质)·physics·chemistry(概率期望)
T1 chinese 根据他的问题i*f[i]我们容易联想到,答案其实是每种方案中每个点的贡献为1的加和 我们可以转变问题,每个点在所有方案的贡献 进而其实询问就是1-k的取值,有多少中方案再取个和 ...
- 「模拟8.21」山洞(矩阵优化DP)
暴力: 正解: 考虑循环矩阵,f[i][j]表示从i点到j点的方案数 我们发现n很小,我们预处理出n次的f[i][j] 然后在矩阵快速幂中,我们要从当前的f[i][j]*f[j][k]-->fi ...
- 「模拟8.23」阴阳 DP
对于此题的性质我们考虑DP 分四种情况 黑色块在右侧单调降,单调升 还有在左侧 另外我们这样可能会记重,所以还要将重复记过的也就是边界线是横的和竖的 然后还要将全白全黑加上 1 #include< ...
- 「模拟8.23」one递推,约瑟夫
前置芝士约瑟夫问题 这样大概就是板子问题了 考场的树状数组+二分的60分暴力??? 1 #include<bits/stdc++.h> 2 #define int long long 3 ...
- 「模拟8.18」字符串(卡特兰数)·乌鸦喝水(树状数组,二分)·所驼门王的宝藏(tarjan,拓扑)
最近好颓啊,所以啥都做不出来 简单说一下这次考试,分机房了,还分不同考卷,果然我还是留在二机房的蒟蒻, 大概也只有这样的简单题,才能勉强水个rank 3吧........ 其实不必管在哪个机房,努力便 ...
- 「模拟8.17」star way to heaven(并查集,最小生成树)
80分打法 首先二分最后答案,答案即为r,可看作以每个k为圆心r为半径的圆 我们进行并查集维护,维护相交的圆的边界 最后判断是否存在圆将上下边界覆盖,如有证明不行 1 #include<iost ...
随机推荐
- 制作 PPT 的新方式出现了——GitHub 热点速览 v.21.19
作者:HelloGitHub-小鱼干 想当初 Markdown 的出现,拯救了多少死在 Word 样式调整上的人,现在,slidev 出现了,它让你 Focus 在本该专注的 PPT 内容制作上而不需 ...
- 【Azure Developer】使用Microsoft Graph API 批量创建用户,先后遇见的三个错误及解决办法
问题描述 在先前的一篇博文中,介绍了如何使用Microsoft Graph API来创建Azure AD用户(博文参考:[Azure Developer]使用Microsoft Graph API 如 ...
- MySQL关于日期为零值的处理
前言: 前面文章我们介绍过日期和时间字段的查询方法,最近遇到日期值为零的问题.原来了解过和 sql_mode 参数设置有关,但还不是特别清楚,本篇文章将探究下MySQL怎么处理日期值为零的问题. 1. ...
- Flutter 2.2 现已发布!
在本次 Google I/O 2021 大会 上,我们正式发布了 Flutter 2.2.Flutter 2.2 是我们最新版的开源工具包,可让开发者立足单个平台构建适合任何设备的精美应用.Flutt ...
- mysql order by 多样依照排序
如果先按a排序升序,a相同时按b降序排序 则order by a,b desc
- 前端必读:Vue响应式系统大PK(下)
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://www.sitepoint.com/vue-3-reactivity-system ...
- shell中的 “.”和source export
在shell脚本里面export的环境变量,在set里面竟然看不到.为什么在shell脚本里面用export设置环境变量之后,当shell执行完了,用set命令看不到呢?但是你如果直接在终端里expo ...
- [bug] CDH报错:cloudera-scm-server dead but pid file exists
参考 https://blog.csdn.net/levy_cui/article/details/51243335
- [c++] 二级指针的原理
示例 将值(实参)传递给值(形参),无法更改val 1 #include <iostream> 2 using namespace std; 3 4 void change(int mem ...
- Linux_防火墙与SElinux
一.防火墙与SElinux 1.防火墙和selinux 防火墙 iptables 默认允许所以 firewalld 默认拒绝所有 ebtables 不认识,不管 se ...