P4514 上帝造题的七分钟

求的是矩阵里所有数的和;

维护四个树状数组;

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int maxn=;
  6. int b[maxn][maxn],bi[maxn][maxn],bj[maxn][maxn],bij[maxn][maxn];
  7. char s[];
  8. int n,m,num;
  9.  
  10. void add(int x,int y,int z) {for(int i=x;i<=n;i+=i&(-i)) for(int j=y;j<=m;j+=j&(-j)) b[i][j]+=z;}
  11. void addi(int x,int y,int z) {for(int i=x;i<=n;i+=i&(-i)) for(int j=y;j<=m;j+=j&(-j)) bi[i][j]+=z;}
  12. void addj(int x,int y,int z) {for(int i=x;i<=n;i+=i&(-i)) for(int j=y;j<=m;j+=j&(-j)) bj[i][j]+=z;}
  13. void addij(int x,int y,int z) {for(int i=x;i<=n;i+=i&(-i)) for(int j=y;j<=m;j+=j&(-j)) bij[i][j]+=z;}
  14.  
  15. int query_(int x,int y) { int ans=; for(int i=x;i;i-=i&(-i)) for(int j=y;j;j-=j&(-j)) ans+=b[i][j]; return ans;}
  16. int query_i(int x,int y) { int ans=; for(int i=x;i;i-=i&(-i)) for(int j=y;j;j-=j&(-j)) ans+=bi[i][j]; return ans;}
  17. int query_j(int x,int y) { int ans=; for(int i=x;i;i-=i&(-i)) for(int j=y;j;j-=j&(-j)) ans+=bj[i][j]; return ans;}
  18. int query_ij(int x,int y) { int ans=; for(int i=x;i;i-=i&(-i)) for(int j=y;j;j-=j&(-j)) ans+=bij[i][j]; return ans;}
  19.  
  20. void add_all(int x,int y,int num)
  21. {
  22. add(x,y,num);
  23. addi(x,y,num*x);
  24. addj(x,y,num*y);
  25. addij(x,y,num*x*y);
  26. }
  27.  
  28. int query(int x,int y)
  29. {
  30. int ans=;
  31. ans+=query_(x,y)*(x*y+x+y+)-query_i(x,y)*(y+)-query_j(x,y)*(x+)+query_ij(x,y);
  32. return ans;
  33. }
  34.  
  35. int main()
  36. {
  37. scanf("%s%d%d",s,&n,&m);
  38. while(~scanf("%s",s))
  39. {
  40. int x1,y1,x2,y2;
  41. scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
  42. if(s[]=='L')
  43. {
  44. scanf("%d",&num);
  45. add_all(x1,y1,num);
  46. add_all(x1,y2+,-num);
  47. add_all(x2+,y1,-num);
  48. add_all(x2+,y2+,num);
  49. }
  50. else
  51. {
  52. printf("%d\n",query(x2,y2)-query(x2,y1-)-query(x1-,y2)+query(x1-,y1-));
  53. }
  54.  
  55. }
  56.  
  57. return ;
  58. }

我写的比较丑了,也可以将加入和查询操作放在结构体里面;

  1. struct node
  2. {
  3. int tree[][];
  4.  
  5. int lowbit(int x) {return x&-x;}
  6.  
  7. void add(int x,int y,int num)
  8. {
  9. for(int i=x; i<=n; i+=lowbit(i))
  10. for(int j=y; j<=m; j+=lowbit(j))
  11. tree[i][j]+=num;
  12. }
  13.  
  14. int query(int x,int y)
  15. {
  16. int res=;
  17. for(int i=x; i>=; i-=lowbit(i))
  18. for(int j=y; j>=; j-=lowbit(j))
  19. res+=tree[i][j];
  20. return res;
  21. }
  22. }b,bi,bj,bij;

差分和前缀和的思想;

P4514 上帝造题的七分钟——二维树状数组的更多相关文章

  1. tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树

    P1716 - 上帝造题的七分钟 From Riatre    Normal (OI)总时限:50s    内存限制:128MB    代码长度限制:64KB 背景 Background 裸体就意味着 ...

  2. 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询

    题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...

  3. 【BZOJ3132】【TYVJ1716】上帝造题的七分钟 二维树状数组

    题目大意 维护一个\(n\times m\)的矩阵,有两种操作: \(1~x_1~y_1~x_2~y_2~v\):把\((a,b),(c,d)\)为顶点的矩形区域内的所有数字加上\(v\). \(2~ ...

  4. [bzoj3132]上帝造题的七分钟——二维树状数组

    题目大意 你需要实现一种数据结构,支援以下操作. 给一个矩阵的子矩阵的所有元素同时加一个数. 计算子矩阵和. 题解 一看这个题,我就首先想到用线段树套线段树做. 使用二维线段树的错误解法 其实是第一次 ...

  5. BZOJ 3132: 上帝造题的七分钟( 二维BIT )

    二维树状数组... 自己YY一下再推一下应该可以搞出来... --------------------------------------------------------------------- ...

  6. POJ 2029 Get Many Persimmon Trees (模板题)【二维树状数组】

    <题目链接> 题目大意: 给你一个H*W的矩阵,再告诉你有n个坐标有点,问你一个w*h的小矩阵最多能够包括多少个点. 解题分析:二维树状数组模板题. #include <cstdio ...

  7. P4514 上帝造题的七分钟(二维树状数组)

    P4514 上帝造题的七分钟 二维树状数组 差分维护区间加法,区间求和 #include<cstdio> int read(){ ,f=; ') f=f&&(c!='-') ...

  8. POJ 2155 Matrix (二维树状数组)

    Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17224   Accepted: 6460 Descripti ...

  9. POJ_2155 Matrix 【二维树状数组】

    一.题面 POJ2155 二.分析 楼教主出的题,是二维树状数组非常好的题,还结合了开关问题(开关变化的次数如果为偶数,状态不变,奇数状态相反). 题意就是给了一个二维的坐标平面,每个点初始值都是0, ...

随机推荐

  1. MQ与logstash实现ES与数据库同步区别

    Logstash 实现ES 与数据库同步: 使用定时器(使用sql 定时的去查询数据进行同步).实现方式比较简单. MQ 实现 ES 与数据库同步: 实时性,消息放到MQ中,消费者会自动的消费,复杂性 ...

  2. AngularJS在IE下页面缓存问题

    问题: 在使用AngularJS发出请求(GET)获取服务端数据,然后再绑定到页面中,你会发现在IE中总是显示原来的数据结果.这时候我们就会知道,IE做了缓存. 解决办法: 我们可以在AngularJ ...

  3. 二、openfeign生成并调用客户端动态代理对象

    所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 上一篇文章中,我们了解到了@FeignClient注解的接口被扫描到以后,会生成一个Fe ...

  4. VBA Excel对象(十九)

    使用VBA进行编程时,用户将要处理的重要对象很少.下面是一些常见的对象 - 应用程序对象 工作簿对象 工作表对象 范围对象 应用程序对象 应用程序对象由以下部分组成 - 应用程序范围的设置和选项. 返 ...

  5. iOS - SceneKit 3D引擎初探

    最近到处搜集资料研究3D最后还是决定锁定OC框架,找到的学习资料随后慢慢整理 SceneKit 是一个OC 框架,开始之前,先熟悉一下SceneKit 的三维坐标系: 很清楚的看到,SceneKit ...

  6. 快速提交一个项目到github或gitee上

    以下步骤假设你已经安装好git 一.Git 全局设置: git config --global user.name "用户名" git config --global user.e ...

  7. Java 之 递归

    一.概述 递归:指在当前方法内调用自己的现象. 递归的分类: 递归分为两种,直接递归和简介递归 直接递归称为方法自身调用自己 间接递归可以 A 方法调用 B 方法,B 方法调用 C 方法,C 方法调用 ...

  8. CentOS7安装CDH 第七章:CDH集群Hadoop的HA配置

    相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...

  9. c# 调试过程

  10. Django之form表单详解

    构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的模板: <form action="/your-name/" method=" ...