[CSP-S模拟测试]:physics(二维前缀和+二分+剪枝)
题目传送门(内部题26)
输入格式
第一行有$3$个整数$n,m,q$。
然后有$n$行,每行有一个长度为$m$的字符串,$+$表示正电粒子,$-$表示负电粒子。
然后有$q$行,每行$2$个整数$x,y$,表示将第$x$行第$y$列的正电粒子修改为负电粒子,保证修改前第$x$行第$y$列的粒子带正电。
输出格式
有$q$行,每行一个整数此次修改后所有正电粒子能形成的最大的电场强度。
样例
样例输入:
5 5 5
+-+++
+++++
+++++
+++++
++++-
1 5
2 2
5 3
2 3
1 1
样例输出:
4
3
3
2
2
数据范围与提示
对于所有数据,$1\leqslant n,m\leqslant {10}^3,1\leqslant q\leqslant {10}^3$。
题解
$40\%$算法:
纯暴力,暴力枚举端点,暴力枚举边长,暴力统计。
时间复杂度:$\Theta(n^5)$。
期望得分:$40$分。
实际得分:$40$分。
$70\%$算法:
如果你会二维前缀和,然后你以为你可以拿到$70$分,然后……依然是$40$分。
但是我们发现,假设当前枚举的端点是$(i,j)$,边长为$k$,那么如果当前的正方形不行,那边长更大的肯定也不行;如果行,边长更小的肯定也行,那么我们要找的答案就在这行与不行的分界点上,而这个分界点你可以通过二分来找。
时间复杂度:$\Theta(n^2\log n)$。
期望得分:$40$分。
实际得分:$40$分。
$70\%pro$算法:
题目中只会把正电子变为负电子,所以最大的电场强度一定是单调不递增的。
进而,如果我们现在改变的这个电荷不在最大的正方形内,也就是它的改变对答案并没有影响,那么我们就可以标记它改变了,然后输出上一次的答案。
如果它在最大正方形里,那么暴力再来一遍好啦。
在二分的时候,如果已经不能出现比现在已经计算出来的答案更大的答案,就直接$continue$掉好啦。
由于强大的剪枝,你就可以用这个算法$A$掉这道题了,但是仍能被极端数据卡掉。
时间复杂度:$\Theta(n^2\log n)$。
期望得分:$70$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,m,q;
char ch[1001];
int Map[1001][1001],sum[1001][1001];
int maxn,ans=1001;
pair<int,int> pre;
int main()
{
scanf("%d%d%d",&n,&m,&q);
maxn=min(n,m);
for(int i=1;i<=n;i++)
{
scanf("%s",ch+1);
for(int j=1;j<=m;j++)
{
if(ch[j]=='+')Map[i][j]=1;
sum[i][j]=Map[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
}
}
while(q--)
{
int x,y;
scanf("%d%d",&x,&y);
Map[x][y]=0;
if(x<pre.first||y<pre.second||x>pre.first+ans-1||y>pre.second+ans-1)
{
printf("%d\n",ans);
continue;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
sum[i][j]=Map[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
ans=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
int lft=1,rht=min(maxn,min(n-i+1,m-j+1)),res=0;
if(rht<=ans)break;
while(lft<=rht)
{
int mid=(lft+rht)>>1;
if(sum[i+mid-1][j+mid-1]-sum[i+mid-1][j-1]-sum[i-1][j+mid-1]+sum[i-1][j-1]==mid*mid){lft=mid+1,res=mid;}
else rht=mid-1;
if(rht<=ans)break;
}
if(res>ans)
{
ans=res;
pre=make_pair(i,j);
}
}
printf("%d\n",ans);
maxn=ans;
}
return 0;
}
rp++
[CSP-S模拟测试]:physics(二维前缀和+二分+剪枝)的更多相关文章
- Memento Mori (二维前缀和 + 枚举剪枝)
枚举指的是枚举矩阵的上下界,然后根据p0, p1, p2的关系去找出另外的中间2个点.然后需要记忆化一些地方防止重复减少时间复杂度.这应该是最关键的一步优化时间,指的就是代码中to数组.然后就是子矩阵 ...
- C - Monitor CodeForces - 846D (二维前缀和 + 二分)
Recently Luba bought a monitor. Monitor is a rectangular matrix of size n × m. But then she started ...
- [CSP-S模拟测试]:任(duty)(二维前缀和)
题目描述 $liu\_runda$退役之后就失去梦想开始咸鱼生活了……$Bilibili$夏日画板活动中,所有人都可以在一块画板上进行像素画创作.$UOJ$群有一群无聊的人决定在画板上创作一个$50\ ...
- 计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和
题目链接:https://nanti.jisuanke.com/t/16445 题意: 给你一个n*n大小的01矩阵,和一个k*k大小的锤子,锤子只能斜着砸,问只砸一次最多能砸到多少个1. 题解: 将 ...
- Nowcoder farm ( 树状数组、二维前缀和、二维偏序 )
题目链接 分析 : 最简单的想法当然就是去模拟 直接对每个施肥料的操作进行模拟.然后计算贡献 但是这显然会超时.这题需要换一个思维 对于一个土地(也就是二维平面上的一个点)的种类是 T' 如果它被操作 ...
- 【AcWing 99】激光炸弹——二维前缀和
(题面来自AcWing) 一种新型的激光炸弹,可以摧毁一个边长为 R 的正方形内的所有的目标. 现在地图上有 N 个目标,用整数Xi,Yi表示目标在地图上的位置,每个目标都有一个价值Wi. 激光炸弹的 ...
- openjudge1768 最大子矩阵[二维前缀和or递推|DP]
总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的 ...
- COGS1752 [BOI2007]摩基亚Mokia(CDQ分治 + 二维前缀和 + 线段树)
题目这么说的: 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它 ...
- poj-3739. Special Squares(二维前缀和)
题目链接: I. Special Squares There are some points and lines parellel to x-axis or y-axis on the plane. ...
随机推荐
- mysql-M-S-S模型 中继器 级联
1.基础环境 三台虚机并且安装有mysql 并且同步好数据库 2.主服务器-创建账号并授权 mysql> create user 'mslave'@'X.X.X.X' identified by ...
- HTML--JS 二级联动
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- Python List append()方法
append() 方法用于在列表末尾添加新的对象.Grammar: list.append(obj) 参数obj — 添加到列表末尾的对象.返回值该方法无返回值,但是会修改原来的列表.Case: al ...
- APT攻防整理-攻击方法/工具
攻击步骤 一般步骤 社工 武器制造 武器投递 漏洞利用 安装后门 后渗透 这5个阶段攻击非常隐蔽,可绕过传统安全设备检测 潜伏控制 传统通信方式不会使用,如cc/socket/http(可采用安全隧道 ...
- ELK+Filebeat (2)
ELK+Filebeat收集多台机器不同日志 采坑:在使用了6.0版本的ELK以后,使用如上配置,if [type]匹配不到在filebeat里面使用document_type定义的字符串.在多次调试 ...
- zookeeper+dubbo+demo
zookeeper下载地址 https://archive.apache.org/dist/zookeeper/ zookeeper安装和使用 windows环境 https://blog.csdn. ...
- Redis数据库-基础篇
Redis Redis是一个开源的,先进的key-value存储. 它通常被称为数据结构服务器,因为键可以包含字符串,哈希,链表,集合和有序集合. Redis 简介 Redis 是完全开源免费的,遵守 ...
- 专题:性能调优之工具---perf
1. Linux Perf简介 1.1 Perf是什么 Perf 是内置于Linux 内核源码树中的性能剖析(profiling)工具.它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标 ...
- 38.0到n-1中缺失的数字
题目描述: 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字的范围都在0到n-1之内.在范围0到n-1内的n个数字中有且仅有一个数字不在该数组中,求出该数字. 思路分析: 因 ...
- Quartz的简单使用
一.Quartz 介绍 Quartz是Java领域最著名的.功能丰富的.开放源码的作业调度工具,几乎可以在所有的Java应用程序中集成--从小的单机应用到大的电子商务系统. Quartz可以用来执行成 ...