欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ4972 八月月赛Problem B


题目概括

  一个矩阵,一坨询问,问矩阵中一个特定方向的等腰直角三角形范围的sum。


题解

  一开始毫无头绪。

  看完9题,一题也不会。

  发现这题A的人多,于是我花了15分钟仔细思考。

  发现可以了。

  对于一个三角形区域,我们可以看下图:

  

  我们把求右下黑色三角形区域转化成一个矩形和3个左上的三角形,然后就OK了。

  矩形只要前缀和就可以了,O(nm)

  求贴在上面和左边的,各自只要O(nm)

  询问O(1)


代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
typedef unsigned int uint;
const int N=3000+5;
const uint Inv=534566745;
uint A,B,C,x,y,k,t,a[N][N],sum[N][N],L[N][N*2],U[N][N];
int n,m,q;
uint rng61(){A^=A<<16,A^=A>>5,A^=A<<1,t=A,A=B,B=C,C^=t^A;return C;
}
uint Pow(uint x,int y){if (y==0)return 1;uint xx=Pow(x,y/2);xx*=xx;if (y&1)xx*=x;return xx;
}
uint val(int xa,int ya,int xb,int yb){xb=min(xb,n),yb=min(yb,m);return sum[xb][yb]-sum[xb][ya-1]-sum[xa-1][yb]+sum[xa-1][ya-1];
}
int main(){scanf("%d%d%d%u%u%u",&n,&m,&q,&A,&B,&C);memset(sum,0,sizeof sum);memset(L,0,sizeof L);memset(U,0,sizeof U);for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){a[i][j]=rng61();sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];}for (int i=n;i>=1;i--)for (int j=1;j<=m*2;j++)L[i][j]=L[i+1][j-1]+val(i,1,i,j);for (int i=m;i>=1;i--)for (int j=1;j<=n;j++)U[i][j]=U[i+1][j-1]+val(1,i,j,i);uint timesx=Pow(233,q),Ans=0;for (int i=1;i<=q;i++){timesx*=Inv;x=rng61()%n+1,y=rng61()%m+1,k=rng61()%min(x,y)+1;int xx=x,yy=y,kk=k;uint ans=sum[x][y]-L[1][x+y-k-1]+L[x+1][max(0,yy-kk-1)]+U[y+1][max(0,xx-kk-1)];Ans+=timesx*ans;}printf("%u",Ans);return 0;
}

  

转载于:https://www.cnblogs.com/zhouzhendong/p/BZOJ4972.html

BZOJ4972 八月月赛 Problem B 小Q的方格纸 二维前缀和相关推荐

  1. 前缀和--BZOJ-4972 小Q的方格纸

    小Q的方格纸有n行m列,一共n*m个方格,从上到下依次标记为第1,2,...,n行,从左到右依次标记为第1,2,...,m列,方便起见,小Q称第i行第j列的方格为(i,j).小Q在方格纸中填满了数字, ...

  2. bzoj 4972 小Q的方格纸

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4972 题意: 给一个方格纸,每一个格子有一个数val,q个询问,每次询问一个x,y,k,求( ...

  3. BZOJ4972 小Q的方格纸

    每个格子记录其左下的45°直角梯形区域的和及左下矩形区域的和即可. #include<iostream> #include<cstdio> #include<cmath& ...

  4. [前缀和 乱搞]BZOJ4972 .小Q的方格纸

    发现询问是个等腰直角三角形,那么我们对于每条斜线作为斜边的等腰直角三角形,斜线上处理一下前缀和就可以了 #include <cstdio> #include <iostream> ...

  5. 用Flutter实现小Q聊天机器人(二)

    用Flutter实现小Q聊天机器人(一) 用Flutter实现小Q聊天机器人(二) 用Flutter实现小Q聊天机器人(三) 用Flutter实现小Q聊天机器人(四) 用Flutter实现小Q聊天机器 ...

  6. 2018 Multi-University Training Contest 4 Problem E. Matrix from Arrays 【打表+二维前缀和】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6336 Problem E. Matrix from Arrays Time Limit: 4000/20 ...

  7. python小工具myqr生成动态二维码

    python小工具myqr生成动态二维码 (一)安装 (二)使用 (一)安装 命令: pip install myqr 安装完成后,就可以在命令行中输入 myqr 查看下使用帮助: myqr --he ...

  8. 微信小程序使用weapp-qrcode生成二维码

    <canvas style="width:108rpx;height:108rpx; canvas-id='qrcode'></canvas> // weapp-qr ...

  9. 小程序扫描普通链接二维码跳转小程序指定界面方法

    微信官方文档扫普通链接二维码打开小程序 | 微信开放文档 看了官方文档之后,还是存在很多困惑,微信小程序是托管到微信服务器上的,要想扫描普通链接跳转指定界面,首先要知道微信把小程序放的服务器的访问路径 ...

最新文章

  1. QT 下配置OpenCV(VS编译器+QT+OpenCV)
  2. 黄仁勋评价股东孙正义
  3. 和nptf螺纹一样吗_摩托车火花塞长短不同,对发动机有影响吗?
  4. HDFS的块缓存和访问权限
  5. BookMarklet:瑞士军刀你用了吗?
  6. 庐山真面目之一 微服务的简介和技术栈
  7. 自定义----损失函数与优化器
  8. jdbc获取数据库元数据,获取数据库列表,获取数据库基本信息,获取指定数据库中的表信息,获取指定表中的字段信息
  9. HNOI2015 接水果
  10. [UVA 10529]Dumb Bones
  11. 全球最强免费电子书下载网址
  12. mysql java驱动 ibm_各种数据库的jdbc驱动下载及连接方式
  13. Android 腾讯bugly的学习使用
  14. dubbo中文官网地址
  15. 关于安全领域方向上学习的一点个人见解
  16. linux中安装中文拼音输入法过程
  17. 关于504报错的解决方法之一
  18. 请说明数据库系统如何实现数据和程序之间的独立性。
  19. 【HaaS Python硬件积木】HCSR04超声波测距传感器
  20. FM33G0系列之低功耗

热门文章

  1. 一文轻松搞懂LCD驱动编写
  2. 【前端】VUE组件操作
  3. 一个计算机爱好者的不完整回忆(十八)鼠标
  4. 让计算成为公共服务,从ATF看阿里对世界创新的贡献
  5. Python: 测试
  6. 钉钉打卡作弊软件彻底凉了!CEO 被判 5 年 6 个月
  7. Vi编辑器使用和Shell程序设计
  8. 百度云BCH如何设置禁止访问其临时域名
  9. 一文通透从输入URL到页面渲染的全过程----高频面试
  10. 搭建家庭服务器(适用无基础和电脑新手)