题:https://codeforces.com/contest/1301/problem/E

题意:给个n*m的图形,q个询问,每次询问问询问区间最大的合法logo的面积是多少

分析:由于logo是由4个同色的小正方形组成的,所以我们先考虑一个数组val[i][j]表示[i][j]位置为‘R' , [i+1][j]位置为’Y‘,[i][j+1]位置为’G‘,[i+1][j+1]位置为’B'所能形成的最大图案边长是多少;

   因为这样就只要预处理‘R’正方形沿着左上能形成的最大正方形,“Y”沿着左下能形成的最大正方形,’G‘沿着右上能形成的最大正方形,”B“沿着右下能形成的最大正方形,然后对于位置[i][j]就取min这四者;

   对于询问,我们只要二分答案搜到最大符合条件的就行了,注意这里的二分的mid,假设询问[r1,c1,r2,c2],则搜索访问应该在[r1+mid-1,c1+mid-1,r2-mid,c2-mid]的范围内搜索才是合法的;

   因为我们在二分时要求满足条件的mid就行,所以这里对val进行倍增处理;

   合法性:因为小的合法图案一定在大的合法图案里面,所以对val取的图案也许是超过询问范围,但我们上面已经对询问范围进行如上缩减,所以是合法的

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int M=;
  4. const int N=;
  5. int ex[][M][M];
  6. int n,m,q;
  7. int val[M][M],f[N][N][M][M],lg[M];
  8. char s[M][M];
  9. void RMQ(int n,int m){
  10. for(int i=;i<n;i++)
  11. for(int j=;j<m;j++)
  12. f[][][i+][j+]=val[i][j];
  13. for(int i=;i<M;i++)
  14. lg[i]=+lg[i/];
  15. for(int i=;i<=n;i++)
  16. for(int k2=;(<<k2)<=m;k2++)
  17. for(int j=;j<=m-(<<k2)+;j++)
  18. f[][k2][i][j]=max(f[][k2-][i][j],f[][k2-][i][j+(<<(k2-))]);
  19. for(int k1=;(<<k1)<=n;k1++)
  20. for(int i=;i<=n-(<<k1)+;i++)
  21. for(int k2=;(<<k2)<=m;k2++)
  22. for(int j=;j<=m-(<<k2)+;j++)
  23. f[k1][k2][i][j]=max(f[k1-][k2][i][j],f[k1-][k2][i+(<<(k1-))][j]);
  24. }
  25.  
  26. int query(int x1,int y1,int x2,int y2){
  27. int k1=lg[x2-x1+];
  28. int k2=lg[y2-y1+];
  29. x2=x2-(<<k1)+;
  30. y2=y2-(<<k2)+;
  31. return max(f[k1][k2][x1][y1],max(f[k1][k2][x1][y2],max(f[k1][k2][x2][y1],f[k1][k2][x2][y2])));
  32. }
  33. bool check(int r1,int c1,int r2,int c2,int midd){
  34. r1=r1+midd-;
  35. c1=c1+midd-;
  36. r2=r2-midd;
  37. c2=c2-midd;
  38. if(r1>r2||c1>c2)
  39. return false;
  40. return query(r1,c1,r2,c2)>=midd;
  41. }
  42. void color(int fx,int fy,char c,int k){///根据进来的参数不同,组成不同方向相同颜色的最大正方形
  43. int stx=,sty=;
  44. if(fx==-)stx=n-;
  45. if(fy==-)sty=m-;
  46. ///while遍历二维数组
  47. while(stx<n&&stx>=){
  48. while(sty<m&&sty>=){
  49. if(s[stx][sty]==c){
  50. ex[k][stx][sty]=;
  51. if(stx-fx>=&&stx-fx<n&&sty-fy>=&&sty-fy<m){///正方形区域取最小值
  52. if(s[stx-fx][sty]==c&&s[stx][sty-fy]==c&&s[stx-fx][sty-fy]==c){
  53. ex[k][stx][sty]=min(ex[k][stx-fx][sty],
  54. min(ex[k][stx][sty-fy],ex[k][stx-fx][sty-fy]))+;
  55. }
  56. }
  57. }
  58. sty+=fy;
  59. }
  60. sty=;if(fy==-)sty=m-;
  61. stx+=fx;
  62. }
  63. }
  64. int main(){
  65. scanf("%d%d%d",&n,&m,&q);
  66. for(int i=;i<n;i++)
  67. scanf("%s",s[i]);
  68. //
  69. color(,,'R',);
  70. color(-,,'Y',);
  71. color(,-,'G',);
  72. color(-,-,'B',);
  73. for(int i=;i<n-;i++){
  74. for(int j=;j<m-;j++){
  75. if(s[i][j]=='R'&&s[i+][j]=='Y'&&s[i][j+]=='G'&&s[i+][j+]=='B'){
  76. val[i][j]=min(ex[][i][j],min(ex[][i+][j],min(ex[][i][j+],ex[][i+][j+])));
  77. }
  78. }
  79. }
  80. //
  81. RMQ(n,m);
  82.  
  83. //
  84. for(int i=;i<q;i++){
  85. int r1,c1,r2,c2,ans=;
  86. scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
  87. int l=,r=min(r2-r1,c2-c1);
  88. while(l<=r){
  89. int midd=(l+r)>>;
  90. if(check(r1,c1,r2,c2,midd)){
  91. ans=midd;
  92. l=midd+;
  93. }
  94. else
  95. r=midd-;
  96. }
  97. printf("%d\n",*ans*ans);
  98. }
  99. return ;
  100. }

Codeforces Round #619 (Div. 2)E思维+二维RMQ的更多相关文章

  1. Codeforces Round #368 (Div. 2) E. Garlands 二维树状数组 暴力

    E. Garlands 题目连接: http://www.codeforces.com/contest/707/problem/E Description Like all children, Ale ...

  2. Codeforces Round #619 (Div. 2)

    A. Three Strings 题意:给三个长度相同的非空字符串abc,依次将c中的每个字符和a或者b中对应位置的字符进行交换,交换必须进行,问能否使得ab相同. 思路:对于每一个位置,如果三个字符 ...

  3. codeforces 713D D. Animals and Puzzle 二分+二维rmq

    题目链接 给一个01矩阵, 然后每个询问给出两个坐标(x1, y1), (x2, y2). 问你这个范围内的最大全1正方形的边长是多少. 我们dp算出以i, j为右下角的正方形边长最大值. 然后用二维 ...

  4. 【CF1256】Codeforces Round #598 (Div. 3) 【思维+贪心+DP】

    https://codeforces.com/contest/1256 A:Payment Without Change[思维] 题意:给你a个价值n的物品和b个价值1的物品,问是否存在取物方案使得价 ...

  5. Codeforces Round #143 (Div. 2) (ABCD 思维场)

    题目连链接:http://codeforces.com/contest/231 A. Team time limit per test:2 seconds memory limit per test: ...

  6. Codeforces Round #395 (Div. 2)(A.思维,B,水)

    A. Taymyr is calling you time limit per test:1 second memory limit per test:256 megabytes input:stan ...

  7. Codeforces Round #416 (Div. 2)(A,思维题,暴力,B,思维题,暴力)

    A. Vladik and Courtesy time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...

  8. Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS

    题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...

  9. Codeforces Round #539 (Div. 2) D 思维

    https://codeforces.com/contest/1113/problem/D 题意 将一个回文串切成一段一段,重新拼接,组成一个新的回文串,问最少切几刀 题解 首先无论奇偶串,最多只会切 ...

随机推荐

  1. ACM-小偷的背包

    题目描述:小偷的背包   设有一个背包可以放入的物品重量为S,现有n件物品,重量分别是w1,w2,w3,...,wn.问能否从这n件物品中选择若干件放入背包中,使得放入的重量之和正好为S.如果有满足条 ...

  2. 《ES6标准入门》(阮一峰)--11.对象的新增方法

    1.Object.is() ES5 比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===).它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0.J ...

  3. 5款国内免费CDN服务商及使用点评

    第一款,百度加速乐 加速乐目前被百度收购,这样百度也有了自己运营的CDN产品,可以丰富自身站长平台工具使用用户群.目前有免费用户和付费用户的区别,对于一般的网站免费方案也足够使用.特点具备智能解析.加 ...

  4. 英语语法 - the + 形容词 的意义

    1,表示一类人  (复数) the young 青年 the old 老年the poor 穷人 the rich 富人the sick 病人 The old need care more than ...

  5. [ cocos2d-JS ] 启动项目

    1, 打开windows命令行 2, cd 到项目的文件夹 3, 执行 cocos run -p web

  6. css选择器权重、样式继承、默认样式

    学过css的小伙伴都是指css选择器的权重 !important Infinity 行间样式 1000 id   100 class|属性|伪类 10 标签|伪元素 1 通配符 0 权重相同 相同cs ...

  7. oracle数据泵导出导入

    先创建一个目录:比如 Create  or Replace directory  DATA_PUMP_DIR as 'D:\DataPipe';   然后给导入导出的用户赋权限: Grant read ...

  8. codeforces 594

    D 给你一个长度为n的括号序列,然后你可以选择交换两个位置,你需要使得能够变成 合法括号序列的起点最多. 题解 人尽皆知的东西:合法的括号序列是,令'('为1,')'为-1,那么前缀和需要>=0 ...

  9. 【转】selenium技巧 - 通过js来控制滚动条,通过xpath定位最上层的div层

    http://blog.csdn.net/iceryan/article/details/8162703 业务流程:   1.打开此网页 http://nanjing.xiaomishu.com/sh ...

  10. 使用FragmentStatePagerAdapter时发现的内存泄露问题

    这篇文章想说的并非是由于使用 FragmentStatePagerAdapter 而导致的内存泄漏,内存泄漏的真正原因和 FragmentStaePagerAdapter 并无直接关联,但是使用 Fr ...