Luogu 4514 上帝造题的七分钟
二维差分+树状数组。
定义差分数组$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 上帝造题的七分钟的更多相关文章
- [luogu] P4514 上帝造题的七分钟 (树状数组,二维差分)
P4514 上帝造题的七分钟 题目背景 裸体就意味着身体. 题目描述 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a ...
- 【题解】 Luogu P4145 上帝造题的七分钟2 / 花神游历各国
原题传送门 这道题实际和GSS4是一样的,只是输入方式有点区别 GSS4传送门 这道题暴力就能过qaq(这里暴力指线段树) 数据比较水 开方修改在线段树中枚举叶节点sqrt 查询区间和线段树基本操作 ...
- luogu P4145 上帝造题的七分钟2 / 花神游历各国 维护区间和&&区间开根号
因为开根号能使数字减小得非常快 所以开不了几次(6次?)很大的数就会变成1..... 所以我们可以维护区间最大值,若最大值>1,则继续递归子树,暴力修改叶节点,否则直接return (好像也可以 ...
- [Luogu P4145] 上帝造题的七分钟2 / 花神游历各国
题目链接 题目简要:我们需要一个能支持区间内每一个数开方以及区间求和的数据结构. 解题思路:说道区间修改区间查询,第一个想到的当然就是分块线段树.数据范围要用long long.本来我是看到区间这两个 ...
- GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 (线段树)
GSS4 - Can you answer these queries IV || luogu4145上帝造题的七分钟2 / 花神游历各国 GSS4 - Can you answer these qu ...
- 【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 ...
- C++之路进阶——codevs2492(上帝造题的七分钟 2)
2492 上帝造题的七分钟 2 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description XLk觉得<上帝造题的七分钟&g ...
- 【BZOJ】3038: 上帝造题的七分钟2(线段树+暴力)
http://www.lydsy.com:808/JudgeOnline/problem.php?id=3038 这题我就有得吐槽了,先是线段树更新写错,然后不知哪没pushup导致te,精度问题sq ...
- BZOJ3132: 上帝造题的七分钟
3132: 上帝造题的七分钟 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 483 Solved: 222[Submit][Status] Desc ...
随机推荐
- 使用NSUserDefaults保存自定义对象(转)
转自http://zani.iteye.com/blog/1431239 .h文件 #import <Foundation/Foundation.h> @interface MyObjec ...
- 11462 Age Sort(计数排序)
内存不够用,用计数排序可以解决问题. #include<iostream> #include<cstdio> #include<cstdlib> #include& ...
- mysql笔记1—安装、配置和基础的数据表操作
本篇笔记主要分为两部分: 1,安装完毕之后的简单配置 2,数据的类型.简单的数据表操作命令 一.mysql安装完毕之后 windows和linux环境,除mysql的安装.配置有所不同,其他操作一样, ...
- LeetCode Second Minimum Node In a Binary Tree
原题链接在这里:https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/description/ 题目: Given a ...
- 四、python沉淀之路--元组
一.元组基本属性 1.元组不能被修改,不能被增加.不能被删除 2.两个属性 tu.count(22) #获取指定元素在元组中出现的次数tu.index(22) #获取指定元素的缩 ...
- 洛谷【P1616】疯狂的采药
浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:https://www.luogu.org/problemnew/show/P ...
- Python 算法之冒泡排序
冒泡排序 冒泡排序算法的原理如下:(从后往前) 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是 ...
- walle代码发布系统配置
walle Walle 一个web部署系统工具,配置简单.功能完善.界面流畅.开箱即用! 支持git.svn版本管理,支持各种web代码发布, PHP,Python,JAVA等代码的发布.回滚,可以通 ...
- Ubuntu 16.04安装Elasticsearch,Logstash和Kibana(ELK)Filebeat
https://www.howtoing.com/how-to-install-elasticsearch-logstash-and-kibana-elk-stack-on-ubuntu-16-04 ...
- Linux python安装
Linux 安装 Python3.5 1. 准备 操作系统:Red Hat Enterprise Linux Server release 6.5 (Santiago) Python 安装包:Py ...