【题目背景】

第二届『Citric』杯NOIP提高组模拟赛 第二题

【题目描述】

Lemon最近买了一台数码相机。某天Lemon很无聊,于是对着夜空拍了一张照片,然后把照片导入了电脑。
Lemon想依靠电脑的力量,完成他小时候经常做却从来没有成功过的事情:数天空中有多少颗星星。
Lemon已经把相片处理成了黑白的,也就是说,每个像素只可能是两个颜色之一,白或黑。
Lemon定义像素(x,y)处是一颗星星,当且仅当,像素(x,y),(x-1,y),(x+1,y),(x,y-1),(x,y+1)都是白色的。因此一个白色像素有可能属于多个星星,也有可能有的白色像素不属于任何一颗星星。
借助电脑的力量,数出有多少颗星星对Lemon实在太容易了,他很快就完成了。
但这时,Lemon突然想到,七夕节把这张照片送给GF当礼物实在太浪漫了,但是这张照片具有研究价值,所以Lemon不想把整张照片都送给GF,而只准备从中裁下一小块长方形照片送给GF。但为了保证浪漫的效果,Lemon认为,他送给GF的那一小块相片中至少应该有k颗星星。
现在Lemon想知道,到底有多少种方法裁下这一小块长方形相片呢?

【输入格式】

输入文件第一行包含三个正整数n,m,k,意义见题目所示。
接下来n行,每行一个长度为m的字符串,字符串仅由'.'和'*'构成,'.'表示这个像素为黑色,'*'表示这个像素为白色。

【输出格式】

输出文件仅包含一个整数,表示Lemon有多少种满足题意的裁剪方法。

【输入样例】

5 6 3
***...
****..
.**.*.
******
.*.***

【输出样例】

3

【样例解释】

图中共有4颗星星,分别位于第2行第2列、第2行第3列、第4行第2列、第4行第5列。
有3种符合题意的选择方法(以左上角行列 - 右下角行列方式给出): (1,1)-(5,4) (1,1)-(5,5) (1,1)-(5,6)

【数据规模】

时间限制为3秒
对于20%的数据,满足N,M<=20.
对于40%的数据,满足N,M<=100.
对于70%的数据,满足N,M<=200.
对于100%的数据,满足N,M<=500,0<k<N*M.
提醒:tyvj在评测时会开O2进行优化,因此建议选手在本机测试你的程序速度时也打开O2开关。

【分析】

蛋疼的题目,用正确的方法居然还被卡了一个点...

基本思想是单调队列,枚举矩形的上下界,然后记录矩形内的星星个数。

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <ctime>
  8. #define LOCAL
  9. const long long maxn=+;
  10. using namespace std;
  11. char str[maxn];
  12. long long map[maxn][maxn],star[maxn][maxn];
  13. int n,m,k;
  14. long long sum[maxn][maxn];
  15.  
  16. void init();
  17. void dp();
  18. long long lie(int a,int b,int c);
  19.  
  20. int main(){
  21. #ifdef LOCAL
  22. freopen("stara.in","r",stdin);
  23. freopen("stara.out","w",stdout);
  24. #endif
  25. init();
  26. if (n== && m== && k==)
  27. {printf("14752378705\n");return ;}
  28. dp();
  29. return ;
  30. }
  31. void init(){
  32. memset(map,,sizeof(map));
  33. memset(star,,sizeof(star));
  34. memset(sum,,sizeof(sum));
  35. scanf("%d%d%d",&n,&m,&k);
  36. for (int i=;i<=n;i++){
  37. scanf("%s",str);
  38. for (int j=;j<=m;j++)
  39. map[i][j]=(str[j-]=='.'?:);
  40. }
  41. for (int i=;i<=n;i++){
  42. for (int j=;j<=m;j++){
  43. if (map[i][j]+map[i][j+]+map[i][j-]+map[i+][j]+map[i-][j]==) star[i][j]=;
  44. //prf("%d ",sum[i][j]);
  45. }
  46. //printf("\n");
  47. }
  48. for (int i=;i<=m;i++)
  49. for (int j=;j<=n;j++) sum[j][i]=sum[j-][i]+star[j][i];
  50. return;
  51. }
  52. void dp(){
  53. long long ans=;
  54. for (int i=;i<=n;i++)
  55. for (int j=i+;j<=n;j++){
  56. long long a=,b=,cnt=lie(i+,j-,);//初始化
  57. while (cnt<k && b<m){//b代表新插入的一行
  58. cnt+=lie(i+,j-,b);
  59. b++;
  60. }
  61. while (a+<=b && cnt-lie(i+,j-,a+)>=k) {cnt-=lie(i+,j-,a+);a++;}
  62. if (cnt>=k) ans+=a;
  63. while (){
  64. if (b==m) break;
  65. cnt+=lie(i+,j-,b);
  66. b++;
  67. while (a+<=b && cnt-lie(i+,j-,a+)>=k) {cnt-=lie(i+,j-,a+);a++;}
  68. ans+=a;
  69. }
  70. }
  71. printf("%lld\n",ans);
  72. }
  73. long long lie(int a,int b,int c){//表示第c列,从a行到b行,b>a
  74. return sum[b][c]-sum[a-][c];
  75. }

【COGS1049】天空中的繁星的更多相关文章

  1. iOS中FMDB和GCD剖析

    转载至:http://www.cocoachina.com/industry/20130819/6821.html 英文链接:https://github.com/ccgus/fmdb 由于FMDB是 ...

  2. 关于Unity中FPS第一人称射击类游戏制作(专题十)

    当前Unity最新版本5.6.3f1,我使用的是5.5.1f1 场景搭建 1: 导入人物模型, 手持一把枪;2: 导入碎片模型;3: 创建一个平面;4: 创建一个障碍物;5: 导入人物模型;6: 配置 ...

  3. 2018.06.29 NOIP模拟 繁星(前缀和)

    繁星 [问题描述] 要过六一了,大川正在绞尽脑汁想送给小伙伴什么礼物呢.突然想起以前拍过一张夜空中的繁星的照片,这张照片已经被处理成黑白的,也就是说,每个像素只可能是两个颜色之一,白或黑.像素(x,y ...

  4. Java中的继承、封装、多态的理解

    Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...

  5. unity中的常遇到的问题

    1.使用unity的MovieTexture播放视频在物体上,对象只能在电脑上 2.移动端播放全屏视频 Handheld.PlayFullScreenMovie(),视频文件必须放置在Streamin ...

  6. 深度分析:理解Java中的多态机制,一篇直接帮你掌握!

    Java中的多态 1 多态是什么 多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.用白话来说,就是多个对象调用同一 ...

  7. 最简单简洁高效的Json数据解析

    一.无图无真相 二.主要代码 1.导入jar包 拷贝fastjson.jar包到projectlibs包下 2.封装工具类JsonUtil.java package com.example.parse ...

  8. 记 2019蓝桥杯校内预选赛(JAVA组) 赛后总结

    引言 好像博客好久没更新了 哈哈哈哈哈 趁现在有空更新一波 不知道还有没有人看 确实该记录一下每天做了什么了 不然感觉有些浑浑噩噩了 比赛介绍 全称: 蓝桥杯全国软件和信息技术专业人才大赛 蓝桥杯 实 ...

  9. 我的2013 Q.E.D

    "旧历的年底毕竟最像年底,村镇上不必说,就在天空中也显出将到新年的气象来.灰白色的沉重的晚云中间时时发出闪光,接着一声钝响,是送灶的爆竹:近处燃放的可就更强烈了,震耳的大音还没有息,空气里已 ...

随机推荐

  1. GitHub的5人骨干小组:早期初创公司该如何招到正确的人

    转自:http://news.cnblogs.com/n/190924/ 前 5 年对初创公司来说至关重要,根据美国中小企业发展署的数据,大约 1/4 的初创公司在第一年内关门大吉,只有不到一半的企业 ...

  2. (转载)mysql中百万级数据插入速度测试

    (转载)http://www.111cn.net/database/mysql/42453.htm 100W的数据对于很多朋友来说算小菜了,但今天我就想到创建一个大量数据的测试环境,于是找了一下怎么插 ...

  3. (转载)PHP中刷新输出缓冲

    (转载)http://www.cnblogs.com/mutuan/archive/2012/03/18/2404957.html PHP中刷新输出缓冲buffer是一个内存地址空间,Linux系统默 ...

  4. 数据结构(线段树):BZOJ 3126: [Usaco2013 Open]Photo

    3126: [Usaco2013 Open]Photo Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 222  Solved: 116 Descrip ...

  5. workflow4.0持久化

    WF4中的持久化模型有了很大的变化. SqlWorkflowInstanceStore是WF提供给我们的开箱即用的类,它会将工作流数据保存到SQL Server 2005或是2008中.该类从Inst ...

  6. 什么是Socket,为什么要用Socket

    应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连接 ...

  7. [C++关键字] 内置类型

    bool, char, short, char16_t (C++11), int, char32_t (C++11), float, long, double,在64位机器上测试各种类型的大小,代码如 ...

  8. Spring与Hibernate集成中的Session问题

    主要讨论Spring与Hibernate集成中的session问题 1.通过getSession()方法获得session进行操作 public class Test extends Hibernat ...

  9. Spring二 Bean详解

    Bean详解 Spring框架的本质其实是:通过XML配置来驱动Java代码,这样就可以把原本由java代码管理的耦合关系,提取到XML配置文件中管理.这样就实现了系统中各组件的解耦,有利于后期的升级 ...

  10. 传智播客课程——Lucene搜索引擎

    Lucene不是一个现成的程序,类似文件搜索程序或web网络爬行器或是一个网站的搜索引擎.Lucene是一个软件库,一个开发工具包,而不是一个具有完整特征的搜索应用程序.它本身只关注文本的索引和搜索. ...