2018.06.29 NOIP模拟 繁星(前缀和)
繁星
【问题描述】
要过六一了,大川正在绞尽脑汁想送给小伙伴什么礼物呢。突然想起以前拍过一张夜空中的繁星的照片,这张照片已经被处理成黑白的,也就是说,每个像素只可能是两个颜色之一,白或黑。像素(x,y)处是一颗星星,当且仅当,像素(xxx,yyy),(x−1x-1x−1,yyy),(x+1x+1x+1,yyy),(xxx,y−1y-1y−1),(xxx,y+1y+1y+1)都是白色的。因此一个白色像素有可能属于多个星星,也有可能有的白色像素不属于任何一颗星星。但是这张照片具有研究价值,所以大川不想把整张照片都送给小伙伴,而只准备从中裁下一小块长方形照片送给他。但为了保证效果,大川认为,这一小块相片中至少应该有 kkk 颗星星。
现在大川想知道,到底有多少种方法裁下这一小块长方形相片呢?
【输入格式】
从文件 star.instar.instar.in 中输入数据。
输入的第一行包含三个正整数 nnn,mmm,kkk,意义见题目所示。
接下来 nnn 行,每行一个长度为 mmm 的字符串,字符串仅由’.‘和’‘构成,’.‘表示这个像素为黑色,’'表示这个像素为白色。
【输出格式】
输出到文件 star.outstar.outstar.out 中。
输出的第一行包含一个整数,表示大川有多少种满足题意的裁剪方法。
【样例输入】
555 666 333
∗∗∗...***...∗∗∗...
∗∗∗∗..****..∗∗∗∗..
.**.*.
∗∗∗∗∗∗******∗∗∗∗∗∗
.∗.∗∗∗.*.***.∗.∗∗∗
【样例输出】
333
【样例说明】
图中共有 444 颗星星,分别位于第 222 行第 222 列、第 222 行第 333 列、第 444 行第 222 列、第444 行第 555 列。
有 333 种符合题意的选择方法(以左上角行列 - 右下角行列方式给出): (1,11,11,1)-(5,45,45,4)
(1,11,11,1)-(5,55,55,5) (1,11,11,1)-(5,65,65,6)
【数据规模与约定】
对于 202020%的数据,满足 NNN,MMM<=202020. 对于 404040%的数据,满足 N,M<=100N,M<=100N,M<=100. 对于 707070%的数据,满足 N,MN,MN,M<=200200200. 对于 100100100%的数据,满足 N,MN,MN,M<=500500500,0<k<N∗M0<k<N*M0<k<N∗M.
202020%做法:
枚举左上角、右下角,暴力统计其中的星星个数。O(N6N^6N6)
404040%做法:
首先发现查询矩形内星星个数可以用部分和在O(N2N^2N2)预处理后O(111)回答。
枚举左上角、右下角,用部分和计算其中星星个数。O(N4N^4N4)
707070%做法:
枚举子矩阵的左、右边界。然后发现对于某个给定的下边界,可行的上边界必然是连续一段。
因此枚举左、右边界后用部分和维护这一条里的星星,枚举下边界,二分查找上边界。O(N3lgNN^3lgNN3lgN)
100100100%做法:
发现左右边界确定后,随着下边界的向下移动,上边界也只会向下移动或不动。
于是枚举左、右边界后用部分和维护星星,然后用一个滑窗维护可行的上边界。O(N3N^3N3)
此题十分垃圾,考试时二维前缀和加双指针水过,下面来一发考试代码。
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<iostream>
#include<queue>
#include<stack>
#include<vector>
#include<set>
using namespace std;
#define N 505
inline long long read(){
long long ans=0,w=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')w=-1;
ch=getchar();
}
while(isdigit(ch)){
ans=(ans<<3)+(ans<<1)+ch-'0';
ch=getchar();
}
return ans*w;
}
inline void write(long long x){
if(x<0){
x=-x;
putchar('-');
}
if(x>9)write(x/10);
putchar(x%10+'0');
}
int n,m,t,b[N],sum[N][N];
long long cnt=0;
bool map[N][N],ok[N];
char s[N];
inline int total(int x1,int y1,int x2,int y2){return sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];}
inline void solve1(){
for(int len=1;len<=n;++len)
for(int i=len+1;i<n;++i){
for(int j=1;j<=m;++j)b[j]=sum[i][j]-sum[i-len][j];
if(b[m]<t)continue;
int l=2,r=2;
while(r<=m-1){
if(b[r]-b[l-1]>=t){
cnt+=m-r;
++l;
}
else ++r;
}
}
}
int main(){
freopen("star.in","r",stdin);
freopen("star.out","w",stdout);
n=read();
m=read();
t=read();
for(int i=1;i<=n;++i){
scanf("%s",s);
for(int j=0;j<m;++j){
if(s[j]=='*')map[i][j+1]=true;
else map[i][j+1]=false;
}
}
for(int i=2;i<=n;++i)
for(int j=2;j<=m;++j){
if(map[i][j]&&map[i-1][j]&&map[i+1][j]&&map[i][j-1]&&map[i][j+1])sum[i][j]=1;
sum[i][j]=sum[i-1][j]+sum[i][j-1]+sum[i][j]-sum[i-1][j-1];
}
if(sum[n][m]<t){
printf("0");
return 0;
}
solve1();
write(cnt);
return 0;
}
2018.06.29 NOIP模拟 繁星(前缀和)的更多相关文章
- 2018.06.29 NOIP模拟 区间(前缀和差量)
区间(interval.cpp) 时限:2000ms 空间限制:512MB [问题描述] 给出一个长度为 n 的序列 a[1]-a[n]. 给出 q 组询问,每组询问形如<x,y>< ...
- 2018.06.29 NOIP模拟 Gcd(容斥原理)
Gcd 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出n个正整数,放入数组 a 里. 问有多少组方案,使得我从 n 个数里取出一个子集,这个子集的 gcd 不为 1 ,然后我再从 ...
- 2018.06.29 NOIP模拟 旅馆(线段树)
旅馆 [问题描述] OIEROIEROIER 们最近的旅游计划,是到长春净月潭,享受那里的湖光山色,以及明 媚的阳光.你作为整个旅游的策划者和负责人,选择在潭边的一家著名的旅馆住 宿.这个巨大的旅馆一 ...
- 2018.06.29 NOIP模拟 排列(线段树)
排列(premu.cpp) [题目描述] 对于一个 1 到 n 的排列,逆序数的定义为:排列中第 i 位 ai的逆序数就是 a1-ai-1中比 ai大的数的个数.另外用 pi表示 a1,-,ai的逆序 ...
- 2018.06.29 NOIP模拟 Minimum(最小生成树)
Minimum 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出一幅由 n 个点 m 条边构成的无向带权图. 其中有些点是黑点,另外点是白点. 现在每个白点都要与他距离最近的所有黑 ...
- 2018.06.29 NOIP模拟 1807(简单递推)
1807 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出一个由数字('0'-'9')构成的字符串.我们说一个子序列是好的,如果他的每一位都是 1.8.0.7 ,并且这四个数字按照 ...
- 2018.06.29 NOIP模拟 边的处理(分治+dp)
边的处理(side.cpp) [问题描述] 有一个 n 个点的无向图,给出 m 条边,每条边的信息形如<x,y,c,r><x,y,c,r><x,y,c,r>. 给出 ...
- 2018.08.29 NOIP模拟 pmatrix(线性筛)
[问题描述] 根据哥德巴赫猜想(每个不小于 6 的偶数都可以表示为两个奇素数之和),定义 哥德巴赫矩阵 A 如下:对于正整数对(i,j),若 i+j 为偶数且 i,j 均为奇素数,则 Ai,j = 1 ...
- 2018.06.27 NOIP模拟 节目(支配树+可持久化线段树)
题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 学校一年一度的学生艺术节开始啦!在这次的艺术节上总共有 N 个节目,并且总共也有 N 个舞台供大家表演.其中第 i 个节目的 ...
随机推荐
- ASP.NET的gridview设置数据格式(DataFormatString="{}") 2011年04月08日 16:26:00 阅读数:5318 标签: asp.net datagrid integer asp date strin
select convert(numeric(8,2),round(UnTaxAmount,2))as UnTaxAmount from View_SaleVoiceselect cast(UnT ...
- Using Celery with Django
参考1: http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html#using-celery-with-d ...
- AS3 os与version 区别 使用Capabilities类获取Flash Player的信息
AS3中flash.system.Capabilities类提供诸多静态的只读属性来描述应用程序当前所运行在的系统和运行时信息,如Flash Player,Adobe AIR,Flash Lite.通 ...
- 基于OpenGL编写一个简易的2D渲染框架-06 编写一个粒子系统
在这篇文章中,我将详细说明如何编写一个简易的粒子系统. 粒子系统可以模拟许多效果,下图便是这次的粒子系统的显示效果.为了方便演示,就弄成了一个动图. 图中,同时显示了 7 种不同粒子效果,看上去效果挺 ...
- H5 缓存机制解析
在web项目开发中,我们可能都曾碰到过这样一个棘手的问题: 线上项目需要更新一个有问题的资源(可能是图片,js,css,json数据等),这个资源已经发布了很长一段时间,为什么页面在浏览器里打开还是没 ...
- git 拉取某个分支到本地
git 拉取其实只需要 git fetch origin xxx. git pull origin xxx即可
- Java 命令行运行参数
Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOME"bin"java –option 来启动,-option为虚拟 ...
- TZOJ 5279 马拉松比赛(广搜)
描述 有一块矩形的海域,其中有陆地也有海洋,这块海域是CSUFT_ACM集训队的训练基地,这一天,昌神说要集训队的队员不能总是训练,于是昌神提出了中南林ACM集训队第一场环陆马拉松比赛,顾名思义就是围 ...
- 蚁群算法(Java)tsp问题
1.理论概述 1.1.TSP问题 旅行商问题,即TSP问题(旅行推销员问题.货郎担问题),是数学领域中著名问题之一.假设有一个旅行商人要拜访n个城市,他必须选择所要走的路径,路径的限制是每个城市只 ...
- 交叉字符串 · Interleaving String
[抄题]: 给出三个字符串:s1.s2.s3,判断s3是否由s1和s2交叉构成.(洗牌) 比如 s1 = "aabcc" s2 = "dbbca" - 当 s3 ...