考场时没有发现性质,用了个前缀和优化暴力,结果写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. 一些代码小技巧&经典代码

    请说明逻辑与(&&)在下边表达式中起到的重要作用 count != 0 && sum/count 答:该表达式使用逻辑与(&&)来确保 sum/coun ...

  2. 自带的 print 函数居然会报错?

    前言 最近用 Python 写了几个简单的脚本来处理一些数据,因为只是简单功能所以我就直接使用 print 来打印日志. 任务运行时偶尔会出现一些异常: 因为我在不同地方都有打印日志,导致每次报错的地 ...

  3. primary key

    只要使用innodb就要为表指定主键: 如果不指定mysql就会自己找不为空且为一的作为主键,如果找不到,就会使用默认的(软件自己预定好的)作为主键: 主键分为单列主键和复合主键,用法和单列唯一,联合 ...

  4. Java集合详解(三):HashMap原理解析

    概述 本文是基于jdk8_271版本进行分析的. HashMap是Map集合中使用最多的.底层是基于数组+链表实现的,jdk8开始底层是基于数组+链表/红黑树实现的.HashMap也会动态扩容,与Ar ...

  5. EventSource的自定义实现

    前言: 前面两篇文章都介绍了.NET Core 性能诊断工具,其中诊断工具都用到了EventCounters来实时的收集服务器性能指标. 那么收集指标能否自己定义呢? 一.What's EventCo ...

  6. 排坑&#183;IPhone&IOS中不兼容正则中的断言匹配

    阅文时长 | 1.14分钟 字数统计 | 1834.4字符 主要内容 | 1.问题切入 2.什么是断言匹配 3.断言匹配的替换方案 4.声明与参考资料 『排坑·IPhone&IOS中不兼容正则 ...

  7. laravel 伪静态实现

    Route::get('show{id}.html',['as'=>'products.detail','uses'=>'companyController@show']) ->wh ...

  8. google 谷歌Python语言规范

    Python语言规范 https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_lan ...

  9. centos 7 启动和关闭zabbix 服务

    systemctl start zabbix-server  启动服务端 systemctl stop zabbix-server  停止服务端 systemctl start zabbix-agen ...

  10. Linux_yum命令详解

    一.yum命令语法 yum [options] [command] [package ...] 二.yum命令常用的选项: yum options -y //自动回答为"yes" ...