P4514 上帝造题的七分钟

题意: 二维区间修改 区间查询

**错误日志: 写了个 4 重循环忘记调用 \(i\) **


Solution

二维树状数组 巨尼玛毒瘤

听说二维线段树会 \(MLE\) 反正我两个都不会 就学了二维树状数组

然而这是什么东西啊太恶心了

首先是推导:

设 \(b[x][y]\) 为二维增量数组, 那么有:

\[SUM[x,y]=\sum_{i = 1}^{x}\sum_{j = 1}^{y}\sum_{k = 1}^{i}\sum_{l = 1}^{j}b[k][l]$$ $$=\sum_{i = 1}^{x}\sum_{j = 1}^{y}(x - i + 1)(y - j + 1)b[i][j]$$把有关 $i, j$ 的丢到一边, 展开化简得
$$(xy + x + y + 1)\sum_{i = 1}^{x}\sum_{j = 1}^{y}b[i][j] - (x +1)\sum_{i = 1}^{x}\sum_{j = 1}^{y}j * b[i][j] - (y + 1)\sum_{i = 1}^{x}\sum_{j = 1}^{y}i * b[i][j] + \sum_{i = 1}^{x}\sum_{j = 1}^{y}ij * b[i][j]\]

所以, 我们维护 \(b[i][j], b[i][j] * i, b[i][j] * j, b[i][j] * i * j\) 这四个前缀和即可 二维树状数组区间修改区间查询

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
using namespace std;
int RD(){
int out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const int maxn = 4019;
int lenx, leny;
int num, na;
#define lowbit(i) ((i) & (-i))
int c[maxn][maxn][4];
void update(int x, int y, int val, int o){
if(x < 1 || x > lenx || y < 1 || y > leny)return ;
if(o == 0)val = val;
else if(o == 1)val *= x;
else if(o == 2)val *= y;
else val *= x * y;
for(int i = x;i <= lenx;i += lowbit(i))
for(int j = y;j <= leny;j += lowbit(j))
c[i][j][o] += val;
}
int get_sum(int x, int y, int o){
int ans = 0;
for(int i = x;i > 0;i -= lowbit(i))
for(int j = y;j > 0;j -= lowbit(j))
ans += c[i][j][o];
return ans;
}
void uprange(int x1, int y1, int x2, int y2, int val){
for(int i = 0;i < 4;i++){
update(x1, y1, val, i), update(x1, y2 + 1, -val, i);
update(x2 + 1, y2 + 1, val, i), update(x2 + 1, y1, -val, i);
}
}
int query(int x, int y){
return
(x * y + x + y + 1) * get_sum(x, y, 0) -
(x + 1) * get_sum(x, y, 2) -
(y + 1) * get_sum(x, y, 1) +
get_sum(x, y, 3);
}
char cmd;
int main(){
cin>>cmd;lenx = RD();leny = RD();
while(cin>>cmd){
int x1 = RD(), y1 = RD(), x2 = RD(), y2 = RD();
if(cmd == 'L'){
int val = RD();
uprange(x1, y1, x2, y2, val);
}
else{
printf("%d\n",
query(x2, y2) +
query(x1 - 1, y1 - 1) -
query(x2, y1 - 1) -
query(x1 - 1, y2)
);
}
}
}

P4514 上帝造题的七分钟的更多相关文章

  1. 洛谷 P4514 上帝造题的七分钟 解题报告

    P4514 上帝造题的七分钟 题目背景 裸体(裸题)就意味着身体(神题). 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了\(0\)的\(n \times m\)矩阵. 第二 ...

  2. [luogu] P4514 上帝造题的七分钟 (树状数组,二维差分)

    P4514 上帝造题的七分钟 题目背景 裸体就意味着身体. 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a ...

  3. P4514 上帝造题的七分钟——二维树状数组

    P4514 上帝造题的七分钟 求的是矩阵里所有数的和: 维护四个树状数组: #include<cstdio> #include<cstring> #include<alg ...

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

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

  5. 洛谷P4514 上帝造题的七分钟

    P4514 上帝造题的七分钟 题目背景 裸体就意味着身体. 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了000的n×mn×mn×m矩阵. 第二分钟,L说,要能修改,于是便有 ...

  6. 二维树状数组总结&&【洛谷P4514】 上帝造题的七分钟

    P4514 上帝造题的七分钟 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了00的n×mn×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b)(a,b),右下 ...

  7. 【BZOJ3211&3038】花神游历各国&上帝造题的七分钟2(CodeVS)

    Description   Input   Output 每次x=1时,每行一个整数,表示这次旅行的开心度 Sample Input 4 1 100 5 5 5 1 1 2 2 1 2 1 1 2 2 ...

  8. C++之路进阶——codevs2492(上帝造题的七分钟 2)

    2492 上帝造题的七分钟 2  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 大师 Master    题目描述 Description XLk觉得<上帝造题的七分钟&g ...

  9. 【BZOJ】3038: 上帝造题的七分钟2(线段树+暴力)

    http://www.lydsy.com:808/JudgeOnline/problem.php?id=3038 这题我就有得吐槽了,先是线段树更新写错,然后不知哪没pushup导致te,精度问题sq ...

随机推荐

  1. Teamproject --人员职责

    职责分配: 初步分工如下: PM:林豪森 Dev:宋天舒 张迎春 黄漠源 刘翔宇 叶露婷 旦增晋美 黄敬博 Test:林豪森 宋天舒 张迎春 刘翔宇 经过团队的讨论,认为对于职责的分配,并不存在绝对的 ...

  2. learning of a previous team

     作为一个软件工程团队,离不开下面三个要素:支持,即分享.责任和合作. 分享是出色技术团队的另一个关键要素,它是团队的基石之一.只有通过分享,团队才有可能实现1+1 > 2这种效应,分享也是让团 ...

  3. sampleFactory(女娲造人)

    使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数M,则返回一个Man对象,如果传入参数W,则返回一个Woman对象,如果传入参数R,则返回一个Robot对象. package c ...

  4. 调研ANDRIOD平台的开发环境的发展演变

    在同学的推荐下,我选用学习eclipse这个软件,参考了这个网址的教程开始了一步一步的搭建之路. http://jingyan.baidu.com/article/bea41d437a41b6b4c5 ...

  5. golang数据类型转换

    int--string //string到int value_int,err:=strconv.Atoi(string) //int到string str:=strconv.Itoa(value_in ...

  6. Alpha冲刺阶段博客汇总

    第一篇(冲刺前安排):http://www.cnblogs.com/Aragaki-Yui/p/8893752.html 第二篇(冲刺第一天):http://www.cnblogs.com/Araga ...

  7. 词频统计Web工程

    本次将原本控制台工程迁移到了web工程上.. 需求: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件: 2.在页面上给出链接 (如果有封皮.作者.字数.页数等信息更佳)或表格,展示经典英 ...

  8. redis哨兵机制二(转)

    概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如 master宕机了,Redis本身(包括它的很多客户端) ...

  9. (2)YARN的工作流程

    Writing YARN Applications 文档中的启动过程: Application submission client向Yarn ResourceManager提交一个Applicatio ...

  10. 【大数据】MapTask并行度和切片机制

    一. MapTask并行度决定机制 maptask的并行度决定map阶段的任务处理并发度,进而影响到整个job的处理速度 那么,mapTask并行实例是否越多越好呢?其并行度又是如何决定呢? 1.1 ...