「模拟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 ...
随机推荐
- mysql-.frm,.myd,myi备份如何导入mysql
.frm..myd..myi文件,也就是说是MySQL的原始数据文件,这三个文件分别是: .frm 表结构文件 .myd 表数据文件 .myi 表索引文件 方法,如下: 新建一个数据库 在my.ini ...
- Windows bat批处理删除指定N天前的文件
1:新建批处理文件:del_old_file.bat,更改系统时间为7天前,在c盘sql back 目录下新建测试文件,再将系统时间改为正确时间 2:编辑内容: rem 删除C:\sql back目录 ...
- 『政善治』Postman工具 — 13、Postman接口测试综合练习
目录 (一)项目接口文档 1.鉴权接口 2.注册接口 3.登录接口 4.用户信息接口 5.注销接口 (二)网站上手动验证 (三)Postman测试实现 1.准备工作 (1)创建一个Collection ...
- Java Arrays.sort()重写comparator方法
先看一下接口 Arrays.sort(T[],Comparator<? super T> c); comparator要重写compare方法 compare方法大概长这样,返回值> ...
- Gateway导航
简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...
- istio部署问题Q&A
端口绑定无权限 创建Gateway,提示绑定端口无权限. 2020-12-27T12:25:30.974288Z warning envoy config gRPC config for type.g ...
- ELK日志收集分析平台部署使用
一.ELK介绍 开源实时日志分析ELK平台能够完美的解决我们上述的问题,ELK由ElasticSearch.Logstash和Kiabana三个开源工具组成: 1.ElasticSearch是一个基于 ...
- 在Windows上使用 Python 安装+ win10启用长路径
https://docs.python.org/zh-cn/3/using/windows.html 成功20200131 https://docs.python.org/zh-cn/3/using/ ...
- 在 Ubuntu 上安装 .NET SDK 或 .NET 运行时
在wsl Ubuntu 20.04上面安装dotnet链接 https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-ubuntu Ubun ...
- 英特尔 i5-9400F,或将成为本年最高性价比的游戏处理器
英特尔 i5-9400F,或将成为本年最高性价比的游戏处理器 一直以来,每一代英特尔 i5 系列都是很多游戏玩家主要的选购对象,它和任何一款显卡似乎都能够很好的搭配起来.可凡事都有美中不足的地方,比如 ...