二维差分+树状数组。

定义差分数组$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. 20165210 预习作业3 Linux安装及学习

    Linux安装及学习 一.Linux安装 通过参考教程:基于VirtualBox虚拟机安装Ubuntu图文教程成功的安装上了Linux但在过程中还是有一些小问题的. 首先按着步骤走,一开始没什么毛病, ...

  2. 2018.7.7 MBA -从专业到管理(1)—— 技术人才与的管理人才比较

    目录 1从基层员工到基层管理 专业,专长,专能,受赏识,团结同事 2从 基层管理到中层管理 重点:一专多能, 打造团队, 获取资源,对外沟通 3从中层到高层 重点:战略规划, 选拔人才 , 市场扩展

  3. Project://CRM

    初始化 考勤 录入成绩 查看成绩 待续...

  4. mysql出现mysql server has gone away错误的解决办法

    应用程序(比如PHP)长时间的执行批量的MYSQL语句.执行一个SQL,但SQL语句过大或者语句中含有BLOB或者longblob字段.比如,图片数据的处理.都容易引起MySQLserver has ...

  5. java web工程启动socket服务

    1.新建web工程 2.自定义类 实现ServletContextListener 接口 在contextInitialized方法中启动socket服务的线程 在contextDestroyed方法 ...

  6. 《Javascript高级程序设计》阅读记录(五):第六章 上

    这个系列以往文字地址: <Javascript高级程序设计>阅读记录(一):第二.三章 <Javascript高级程序设计>阅读记录(二):第四章 <Javascript ...

  7. [SP16580]QTREE7

    luogu vjudge 题意 一棵树,每个点初始有个点权和颜色(输入会给你) 0 u :询问所有u,v路径上的最大点权,要满足u,v路径上所有点的颜色都相同 1 u :反转u的颜色 2 u w :把 ...

  8. QT:QString、QByteArray和char *的转换 【转载】

    原文网址:http://blog.csdn.net/light1028/article/details/7899541 第一种,数据流的方式,这里只说从QByteArray转向QString. QBy ...

  9. 应用层-day01

    主流应用程序体系结构:CS结构.P2P结构. CS结构:客户-服务器体系结构.有一台总是打开的主机称为服务器,它服务来自其他许多称为客户的主机的请求. P2P体系结构:应用程序在不同的主机间链接,被称 ...

  10. 接口方式[推荐]/动态SQL语句

    MVC目录结构: Src -- com.shxt.servlet[控制层] --com.shxt.service[业务逻辑层] --com.shxt.model[实体Bean,用来承载数据] --co ...