Description

题目背景
热烈庆祝北京师范大学附属实验中学成立100周年!
问题描述
为了准备校庆庆典,学校招募了一些学生组成了一个方阵,准备在庆典上演出。
这个方阵是一个n*m的矩形,第i行第j列有一名学生,他有一个能力值Aij。
校长会定期检查一个p*q的方阵,询问这个方阵的学生能力值之和,或是学生能力值的最大值,或是学生能力值的最小值。由于校长不喜欢一个方阵长宽之比差太多,他每次询问的方阵的长不会超过宽的两倍。作为校庆筹办组组长的你,应该迅速并准确的回答校长所问的问题。

Input

第一行包含两个整数n,m,表示这个方阵的两条边的长度。
接下来n行,每行m个数,表示每个学生的能力值。
接下来一行包含一个整数q,表示校长的询问数。
接下来q行,每行先一个字符串s,接下来4个整数x1,y1 , x2, y2,保证
x1<=x2,y1<=y2 ,设以第x1行y1列为左上角,第x2行y2列为右下角的方阵为P。(本题为0下标)
若字符串内容为“SUM”,请求出P中所有学生的能力值之和。
若字符串内容为“MAX”,请求出P中所有学生的能力值的最大值。
若字符串内容为“MIN”,请求出P中所有学生的能力值的最小值。

Output

输出总共q行,第i行的数为第i组询问对应的答案ansi

Sample Input

3 3
1 2 3
4 5 6
7 8 9
3
SUM 0 0 1 1
MAX 0 0 2 2
MIN 0 1 1 1

Sample Output

12
9
2

样例说明
对于第一组询问,能力值之和为1+2+4+5=12。
对于第二组询问,能力值最大的位置为第2行第2列。
对于第三组询问,能力值最小的位置为第0行第1列。

Data Constraint

对于40%的数据,n,m<=200,q<=200
对于60%的数据,n,m<=300,q<=100000
对于80%的数据,n,m<=500,q<=500000
对于100%的数据,n,m<=800,q<=500000, 0<=Aij<=3000, 每个询问的方阵的长不超过宽的两倍

Solution

  • 矩阵和前缀和处理,矩阵最值用二维 RMQ 维护即可。

  • 设 F[i][j][k]F[i][j][k] 从 (i,j)(i,j) 向下延伸 2k2^k 、向右延伸 2k2^k 的最大值,最小值同理。

Code

#include<cstdio>
#include<cmath>
using namespace std;
const int N=801;
int a[N][N],sum[N][N],f[N][N][10],g[N][N][10],p[11];
inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}
inline int write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
inline int max(int x,int y)
{return x>y?x:y;
}
inline int min(int x,int y)
{return x<y?x:y;
}
int main()
{int n=read(),m=read();for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){f[i][j][0]=g[i][j][0]=a[i][j]=read();sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];}for(int i=p[0]=1;i<=10;i++) p[i]=p[i-1]<<1;for(int k=1;k<10;k++)for(int i=1;i<=n && i+p[k]-1<=n;i++)for(int j=1;j<=m && j+p[k]-1<=m;j++){f[i][j][k]=max(f[i][j][k-1],f[i][j+p[k-1]][k-1]);f[i][j][k]=max(f[i][j][k],max(f[i+p[k-1]][j][k-1],f[i+p[k-1]][j+p[k-1]][k-1]));g[i][j][k]=min(g[i][j][k-1],g[i][j+p[k-1]][k-1]);g[i][j][k]=min(g[i][j][k],min(g[i+p[k-1]][j][k-1],g[i+p[k-1]][j+p[k-1]][k-1]));}int q=read();while(q--){char ch=getchar();while(ch!='X' && ch!='N' && ch!='U') ch=getchar();int x1=read()+1,y1=read()+1,x2=read()+1,y2=read()+1;if(ch=='U'){write(sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1]),putchar('\n');continue;}int ans=ch=='N'?3000:0,z=min(log2(x2-x1+1),log2(y2-y1+1));if(ch=='X'){for(int yy=y1;yy+p[z]<=y2;yy+=p[z]) ans=max(ans,max(f[x1][yy][z],f[x2-p[z]+1][yy][z]));for(int xx=x1;xx+p[z]<=x2;xx+=p[z]) ans=max(ans,max(f[xx][y1][z],f[xx][y2-p[z]+1][z]));ans=max(ans,max(f[x1][y1][z],f[x1][y2-p[z]+1][z]));ans=max(ans,max(f[x2-p[z]+1][y1][z],f[x2-p[z]+1][y2-p[z]+1][z]));}else{for(int yy=y1;yy+p[z]<=y2;yy+=p[z]) ans=min(ans,min(g[x1][yy][z],g[x2-p[z]+1][yy][z]));for(int xx=x1;xx+p[z]<=x2;xx+=p[z]) ans=min(ans,min(g[xx][y1][z],g[xx][y2-p[z]+1][z]));ans=min(ans,min(g[x1][y1][z],g[x1][y2-p[z]+1][z]));ans=min(ans,min(g[x2-p[z]+1][y1][z],g[x2-p[z]+1][y2-p[z]+1][z]));}write(ans),putchar('\n');}return 0;
}

JZOJ 5417. 【NOIP2017提高A组集训10.24】方阵相关推荐

  1. JZOJ 5419. 【NOIP2017提高A组集训10.24】筹备计划

    Description 题目背景 热烈庆祝北京师范大学附属实验中学成立100周年! 问题描述 校庆筹备组的老师们正在寻找合适的地方来举办校庆庆典.学生们的位置和可以举办庆典的位置在x轴的正半轴取值在[ ...

  2. JZOJ 5438. 【NOIP2017提高A组集训10.31】Tree

    Description Input Output Sample Input 10 1 1 0 0 1 0 0 0 0 0 1 2 2 3 2 4 4 5 2 6 6 7 7 8 7 9 4 10 Sa ...

  3. JZOJ 5439. 【NOIP2017提高A组集训10.31】Calculate

    Description Input Output Data Constraint Solution 设前缀和 g[i][j]g[i][j] 表示 AA 为 ii .BB%A 为 jj 的数量. 这样就 ...

  4. JZOJ 5436. 【NOIP2017提高A组集训10.30】Group

    Description Input Output Sample Input 10 113 28 3 39 90 46 14 55 35 48 47 Sample Output 62453 Data C ...

  5. JZOJ 5431. 【NOIP2017提高A组集训10.28】序列操作

    Description 一开始有n个非负整数hi,接下来会进行m次操作,第i次操作给出一个数c[i],要求你选出c[i]个大于零的数并将它们减去1. 问最多可以进行多少轮操作后无法操作(即没有c[i] ...

  6. JZOJ 5426. 【NOIP2017提高A组集训10.25】摘Galo

    Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Gal ...

  7. JZOJ 5421. 【NOIP2017提高A组集训10.25】嘟嘟噜

    Description 由于众所周知的原因, 冈部一直欠真由理一串香蕉. 为了封上真由理的嘴, 冈部承诺只要真由理回答出这个问题, 就给她买一车的香蕉: 一开始有n 个人围成一个圈, 从1 开始顺时针 ...

  8. JZOJ 5425. 【NOIP2017提高A组集训10.25】数论

    Description 聪明的0v0正在学习莫比乌斯反演. 她看到了这样的一道题:有n*m个人站成了一个n*m的方阵-- 剩下的题面,聪明的0v0不记得了.但是,她通过自己高超的数论技巧,给出了一个转 ...

  9. JZOJ 5422. 【NOIP2017提高A组集训10.25】天才绅士少女助手克里斯蒂娜

    Description Input 第一行两个整数n;m 表示电子个数和询问个数. 接下来n 行, 每行两个整数x; y 表示vi. 接下来m 行, 每行形如1 p x y 或2 l r, 分别表示两 ...

最新文章

  1. wxWidgets:wxRegKey类用法
  2. OpenGL:glMatrixMode()
  3. 畅游“私有化”完成,搜狐股价暴涨逾25%
  4. 遍历python字典几种方法
  5. mysql+keepalived实现双主自由切换
  6. No tracked branch configured for branch master or the branch doesn‘t exist
  7. pidgin qq_Pidgin入门:Skype的开源替代品
  8. WordPress安装主题时出现安装失败的解决方法
  9. 如何快速制作一个H5单页面网站
  10. 线段树 (更新区间查询点)秋实大哥与小朋友
  11. 电信短信网关ISAG-SMS二次开发
  12. GraphQL初探:Java服务示例及Yahoo/Elide
  13. 大搜车与永达二手车合作,大型汽车经销商加快数字化进程
  14. 青海计算机系统集成2级,青海2018上半年系统集成项目管理工程师省内合格标准及人员名单...
  15. Gitlab使用指引1(基础篇)
  16. 基于Php幼儿园管理系统
  17. 论VI设计的基础部分和应用部分
  18. Cadence Allegro 16.6培训计划【江苏 无锡 市区】
  19. 通过图像相机进行mark定位,校正角度
  20. linux驱动开发: wm8960 codec代码分析

热门文章

  1. ubuntu 14.04 安装qq 2015
  2. linux下网络排错与查看
  3. 推荐CUDA程序优化的15个策略
  4. 基于fdatool的滤波器设计(低通、带通、高通)
  5. 科大星云诗社动态20210517
  6. Win10下使用HDFView查看hdf5文件
  7. 云炬Android开发笔记 5-7网络框架优化与完善
  8. 重磅 |“吴恩达deeplearningai”官方微信公众号已经上线!
  9. QFileDialog::getOpenFileName
  10. C#中线程池的简单应用