考场时没有发现性质,用了个前缀和优化暴力,结果写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的神题,性质分析)的更多相关文章

  1. 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组

    题目描述 回忆树是一棵树,树边上有小写字母. 一次回忆是这样的:你想起过往,触及心底--唔,不对,我们要说题目. 这题中我们认为回忆是这样的:给定 \(2\) 个点 \(u,v\) (\(u\) 可能 ...

  2. 2021升级版微服务教程5—通过IDEA运行多个项目实例「模拟集群」

    2021升级版SpringCloud教程从入门到实战精通「H版&alibaba&链路追踪&日志&事务&锁」 教程全目录「含视频」:https://gitee.c ...

  3. 「模拟赛20190327」 第二题 DP+决策单调性优化

    题目描述 小火车虽然很穷,但是他还是得送礼物给妹子,所以他前往了二次元寻找不需要钱的礼物. 小火车准备玩玩二次元的游戏,游戏当然是在一个二维网格中展开的,网格大小是\(n\times m\)的,某些格 ...

  4. 「模拟8.29」chinese(性质)·physics·chemistry(概率期望)

    T1  chinese 根据他的问题i*f[i]我们容易联想到,答案其实是每种方案中每个点的贡献为1的加和 我们可以转变问题,每个点在所有方案的贡献 进而其实询问就是1-k的取值,有多少中方案再取个和 ...

  5. 「模拟8.21」山洞(矩阵优化DP)

    暴力: 正解: 考虑循环矩阵,f[i][j]表示从i点到j点的方案数 我们发现n很小,我们预处理出n次的f[i][j] 然后在矩阵快速幂中,我们要从当前的f[i][j]*f[j][k]-->fi ...

  6. 「模拟8.23」阴阳 DP

    对于此题的性质我们考虑DP 分四种情况 黑色块在右侧单调降,单调升 还有在左侧 另外我们这样可能会记重,所以还要将重复记过的也就是边界线是横的和竖的 然后还要将全白全黑加上 1 #include< ...

  7. 「模拟8.23」one递推,约瑟夫

    前置芝士约瑟夫问题 这样大概就是板子问题了 考场的树状数组+二分的60分暴力??? 1 #include<bits/stdc++.h> 2 #define int long long 3 ...

  8. 「模拟8.18」字符串(卡特兰数)·乌鸦喝水(树状数组,二分)·所驼门王的宝藏(tarjan,拓扑)

    最近好颓啊,所以啥都做不出来 简单说一下这次考试,分机房了,还分不同考卷,果然我还是留在二机房的蒟蒻, 大概也只有这样的简单题,才能勉强水个rank 3吧........ 其实不必管在哪个机房,努力便 ...

  9. 「模拟8.17」star way to heaven(并查集,最小生成树)

    80分打法 首先二分最后答案,答案即为r,可看作以每个k为圆心r为半径的圆 我们进行并查集维护,维护相交的圆的边界 最后判断是否存在圆将上下边界覆盖,如有证明不行 1 #include<iost ...

随机推荐

  1. php基础-php基本语法

    http://study.163.com/course/courseMain.htm?courseId=246003

  2. 修改wordpress版权信息

    修改页脚版权信息位置:找到C:\wamp64\www\wordpress\wp-content\themes\travelify\library\structure\footer-extensions ...

  3. react+antd 使用脚手架动态修改主题色

    最近做了一个需求,后台管理系统添加一个可以动态修改ant-design主题色.查询了大多数的文章,发现基本都是抄来抄去,而且文章记录的也一点也不详细.刚刚把这个功能做完了,顺便记录一下如何去修改主题色 ...

  4. LightningChart JS 3.0 新功能上线

    在这次的LC JS更新中,首次将极坐标图引入图表库. 这种全新的图表类型可以通过API轻松地进行样式设置.极坐标可以用作独立图表或在仪表板中使用. 另外,用于 XY图表的对数轴也添加到了这次的更新,L ...

  5. cmake和make

    学计算机的,在写代码的时候,IDE安装好,环境按着教程配置好,就直接代码了,编辑器的具体原理只是一知半解,现在来系统学习一下,为了方便以后学习HElib! make和cmake 写程序大体步骤为: 1 ...

  6. gcc 版本

    $ gcc --versiongcc (Ubuntu 5.4.0-6kord1~16.04.4k2) 5.4.0 20160609Copyright (C) 2015 Free Software Fo ...

  7. k8s 管理存储资源(10)

    一.Kubernetes 如何管理存储资源 理解Volume 我们经常会说:容器和 Pod 是短暂的. 其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据 ...

  8. 如何访问pod --- service(7)

    一.通过service访问pod 我们不应该期望 Kubernetes Pod 是健壮的,而是要假设 Pod 中的容器很可能因为各种原因发生故障而死掉.Deployment 等 controller ...

  9. Scala 中为什么不建议用 return 关键字

    在scala中使用 return 的话,编译的时候会提示the latest statement is method is automatically returned, use of th retu ...

  10. 【GIS风暴】30米分辨率地表覆盖数据GlobeLand30原始数据集简介及下载地址

    数据集预览: GlobeLand30是30米空间分辨率全球地表覆盖数据,目前可供下载使用的有3年的数据:2000-2010-2020,本文主要讲述GlobeLand30的官网下载地址和数据集简介. 数 ...