二维差分+树状数组。

定义差分数组$d_{i, j} = a_{i, j} + a_{i - 1, j - 1} - a_{i, j - 1} - a_{i - 1, j}$,有$a_{i, j} = \sum_{x = 1}^{i}\sum_{y = 1}^{j}d_{i, j}$。

我们要求$sum(n, m) = \sum_{i = 1}^{n}\sum_{j = 1}^{m}a_{i, j} $,

代入$a_{i, j}$,得$sum(n, m) = \sum_{i = 1}^{n}\sum_{j = 1}^{m}\sum_{x = 1}^{i}\sum_{y = 1}^{j}d_{x, y}$。

列一下发现$d_{x, y}$出现了$(n - x + 1) * (m - y + 1)$次。

那么$sum(n, m) = \sum_{i = 1}^{n}\sum_{j = 1}^{m}d_{i, j} * (n - i + 1) * (m - j + 1)$。

把$(n + 1),(m + 1),i, j$看作四项展开,得到$(n + 1) * (m + 1)\sum_{i = 1}^{n}\sum_{j = 1}^{m}d_{i, j} + \sum_{i = 1}^{n}\sum_{j = 1}^{m}d_{i, j} * i * j - (m + 1)  \sum_{i = 1}^{n}\sum_{j = 1}^{m}d_{i, j} * i - (n + 1)\sum_{i = 1}^{n}\sum_{j = 1}^{m}d_{i, j} * j$。

两个$\sum$可以用一个二维树状数组维护,这样子维护四个树状数组即可(修改好长)。

时间复杂度$O(qlognlogm)$。

另外,longlong在Luogu上会MLE最后两个点,要用int

Code:

#include <cstdio>
#include <cstring>
using namespace std;
typedef int ll; const int N = ; int n, m; template <typename T>
inline void read(T &X) {
X = ; char ch = ; T op = ;
for(; ch > ''|| ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} struct BinaryIndexTree {
ll arr[N][N]; #define lowbit(p) (p & (-p)) inline void modify(int x, int y, ll v) {
for(int i = x; i <= n; i += lowbit(i))
for(int j = y; j <= m; j += lowbit(j))
arr[i][j] += v;
} inline ll query(int x, int y) {
ll res = 0LL;
for(int i = x; i > ; i -= lowbit(i))
for(int j = y; j > ; j -= lowbit(j))
res += arr[i][j];
return res;
} } sum, mulij, muli, mulj; inline int min(int x, int y) {
return x > y ? y : x;
} inline int max(int x, int y) {
return x > y ? x : y;
} inline ll qSum(int x, int y) {
return 1LL * (x + ) * (y + ) * sum.query(x, y) + 1LL * mulij.query(x, y)
- 1LL * (y + ) * muli.query(x, y) - 1LL * (x + ) * mulj.query(x, y);
} int main() {
// freopen("Sample.txt", "r", stdin); char op = getchar();
read(n), read(m);
for(; ; ) {
for(op = getchar(); op != 'L' && op != 'k' && op >= ; op = getchar());
if(op < ) break; if(op == 'L') {
int a, b, c, d; ll v;
read(a), read(b), read(c), read(d), read(v);
int lx = min(a, c), ly = min(b, d), rx = max(a, c), ry = max(b, d);
sum.modify(lx, ly, v);
sum.modify(rx + , ry + , v);
sum.modify(lx, ry + , -v);
sum.modify(rx + , ly, -v); muli.modify(lx, ly, v * lx);
muli.modify(rx + , ry + , v * (rx + ));
muli.modify(lx, ry + , -v * lx);
muli.modify(rx + , ly, -v * (rx + )); mulj.modify(lx, ly, v * ly);
mulj.modify(rx + , ry + , v * (ry + ));
mulj.modify(lx, ry + , -v * (ry + ));
mulj.modify(rx + , ly, -v * ly); mulij.modify(lx, ly, v * lx * ly);
mulij.modify(rx + , ry + , v * (rx + ) * (ry + ));
mulij.modify(lx, ry + , -v * (ry + ) * lx);
mulij.modify(rx + , ly, -v * (rx + ) * ly);
} else {
int a, b, c, d;
read(a), read(b), read(c), read(d);
int lx = min(a, c), ly = min(b, d), rx = max(a, c), ry = max(b, d);
printf("%d\n", qSum(rx, ry) + qSum(lx - , ly - ) - qSum(rx, ly - ) - qSum(lx - , ry));
}
}
return ;
}

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

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

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

  2. 【题解】 Luogu P4145 上帝造题的七分钟2 / 花神游历各国

    原题传送门 这道题实际和GSS4是一样的,只是输入方式有点区别 GSS4传送门 这道题暴力就能过qaq(这里暴力指线段树) 数据比较水 开方修改在线段树中枚举叶节点sqrt 查询区间和线段树基本操作 ...

  3. luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号

    因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以 ...

  4. [Luogu P4145] 上帝造题的七分钟2 / 花神游历各国

    题目链接 题目简要:我们需要一个能支持区间内每一个数开方以及区间求和的数据结构. 解题思路:说道区间修改区间查询,第一个想到的当然就是分块线段树.数据范围要用long long.本来我是看到区间这两个 ...

  5. GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 (线段树)

    GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 GSS4 - Can you answer these qu ...

  6. 【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 ...

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

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

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

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

  9. BZOJ3132: 上帝造题的七分钟

    3132: 上帝造题的七分钟 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 483  Solved: 222[Submit][Status] Desc ...

随机推荐

  1. (转)libcurl库使用方法,好长,好详细。

    一.ibcurl作为是一个多协议的便于客户端使用的URL传输库,基于C语言,提供C语言的API接口,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP ...

  2. uva10815(set的应用)

    紫书例题,这道题的例程让我长了知识.以前没有用过cctype和stringstream相关的东西.很实用,值得学习. #include <cctype>的函数 c++中应该是#includ ...

  3. Docker 容器相关技术

    Docker 依赖的Linux内核特性 Namespaces 命名空间 Control groups (cgroups) 控制组 理解这两个特性,能够更好的帮助我们理解docker的资源分配和管理 N ...

  4. [转]HTMl中Meta标签详解以及meta property=og标签含义

    meta是用来在HTML文档中模拟HTTP协议的响应头报文.META标签是HTML语言HEAD区的一个辅助性标签,它位于HTML文档头部的<HEAD>标记和<TITLE>标记之 ...

  5. Azure上Linux VM误配防火墙的恢复方法

    在实际运维中,防火墙把自己挡在机器外面的情况会时有发生.如何快速的恢复对运维人员是很重要的. 本文将介绍如何用Azure Extension实现不通过ssh对VM进行操作的方法. 之前写过一遍Blog ...

  6. request_mem_region,ioremap 和phys_to_virt()

    转载: request_mem_region,ioremap 和phys_to_virt()   Linux在头文件include/linux/ioport.h中定义了三个对I/O内存资源进行操作的宏 ...

  7. ThreadPoolTaskExecutor异常收集

    ThreadPoolTaskExecutor ipFinderThreads = new ThreadPoolTaskExecutor(); ipFinderThreads.setCorePoolSi ...

  8. Intellij IDEA 发布后的项目在哪里

    Intellij IDEA 中使用 tomcat 并发布项目后,项目并没有出现在在 webapps 文件夹中,如果没有手动修改过部署目录的话,idea的真实部署目录为 File---->Proj ...

  9. VisualGDB系列11:Linux C++项目中使用外部Linux库

    根据VisualGDB官网(https://visualgdb.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指正. 在<使用VS创建Linux静态库和 ...

  10. jhipster初接触

    在Windows7部署之前把几个依赖下了 jdk:1.80 Maven :3.3.9 git:2.14.1 npm:唯一要注意的就是配置一个阿里的镜像,不然慢的你崩溃 Yeoman: npm inst ...