BZOJ2683: 简单题(cdq分治 树状数组)
Time Limit: 50 Sec Memory Limit: 128 MB
Submit: 2142 Solved: 874
[Submit][Status][Discuss]
Description
|
命令 |
参数限制 |
内容 |
|
1 x y A |
1<=x,y<=N,A是正整数 |
将格子x,y里的数字加上A |
|
2 x1 y1 x2 y2 |
1<=x1<= x2<=N 1<=y1<= y2<=N |
输出x1 y1 x2 y2这个矩形内的数字和 |
|
3 |
无 |
终止程序 |
Input
Output
Sample Input
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3
Sample Output
5
HINT
Source
cdq分治裸题。
首先我们对询问点拆为$4$个前缀和查询
再把所有的询问/修改离线,按照$x$轴排序
直接上cdq分治,用树状数组为护$y$轴的贡献
归并排序版太难写了直接上sort
#include<cstdio>
#include<algorithm>
#define lowbit(x) ((x) & (-x))
using namespace std;
const int MAXN = * 1e5 + ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int N, Qnum;
struct Query {
int opt, x, y, v, ans, xxx;
bool operator < (const Query &rhs) const {
return x == rhs.x ? y < rhs.y : x < rhs.x;
}
}Q[MAXN], Tp[MAXN];
int T[MAXN];
void Add(int pos, int val) {
for(int i = pos; i <= N; i += lowbit(i)) T[i] += val;
}
int Sum(int pos) {
int ans = ;
for(int i = pos; i; i -= lowbit(i)) ans += T[i];
return ans;
}
int num = , out[MAXN];
void CDQ(int l, int r) {
if(l == r) return ;
int mid = l + r >> ;
CDQ(l, mid);
CDQ(mid + , r);
int i = l, j = mid + , p = l, last = ;
sort(Q + l, Q + mid + );
sort(Q + mid + , Q + r + );
while(j <= r) {
while(Q[i].opt == && i <= mid) i++;
while(Q[j].opt == && j <= r) j++;
if(i <= mid && Q[i].x <= Q[j].x) Add(Q[i].y, Q[i].v), last = i++;
else if(j <= r) Q[j].ans += Sum(Q[j].y), j++;
}
for(int i = l; i <= last; i++)
if(Q[i].opt == )
Add(Q[i].y, -Q[i].v); }
int main() {
N = read();
for(;;) {
int op = read();
if(op == ) break;
if(op == ) {Q[++num].opt = op; Q[num].x = read(), Q[num].y = read(), Q[num].v = read();}
else {
int xx1 = read(), yy1 = read(), xx2 = read(), yy2 = read();
Qnum++;
Q[++num] = (Query) {op, xx2, yy2, , , Qnum};
Q[++num] = (Query) {op, xx1 - , yy1 - , , , Qnum};
Q[++num] = (Query) {op, xx1 - , yy2, , , Qnum};
Q[++num] = (Query) {op, xx2, yy1 - , , , Qnum};
}
}
CDQ(, num);
for(int i = ; i <= num; i++) {
if(Q[i].opt == ) {
if(Q[i].v == || Q[i].v == ) out[Q[i].xxx] += Q[i].ans;
else out[Q[i].xxx] -= Q[i].ans;
}
}
for(int i = ; i <= Qnum; i++)
printf("%d\n", out[i]);
return ;
}
BZOJ2683: 简单题(cdq分治 树状数组)的更多相关文章
- BZOJ 2683 简单题 cdq分治+树状数组
题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...
- 【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组
bzoj1176 题目描述 维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数 ...
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组
[BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...
- 【bzoj3262】陌上花开 CDQ分治+树状数组
题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...
- 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组
题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...
- LOJ3146 APIO2019路灯(cdq分治+树状数组)
每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...
- BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组
考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...
- BZOJ 2683: 简单题(CDQ分治 + 树状数组)
BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...
随机推荐
- CentOS 7 修改root 密码
环境: 1.重启系统在加载内核的地方按e,编辑启动脚本 2.将ro crashkernel = auto 所在地的 ro 替换为 rw init=/sysroot/bin/sh 3.修改完成后用Ctr ...
- git分布式的理解----简单服务端搭建
Git是分布式的,并没有服务端跟客户端之分,所谓的服务端安装的其实也是git.Git支持四种协议,file,ssh,git,http.ssh是使用较多的,下面使用ssh搭建一个免密码登录的服务端. 1 ...
- HDU 4334——Trouble——————【贪心&水题】
Trouble Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- netty之==线程模型
1.1 netty线程模型本质遵循了Reactor的基础线程模型,所以得先介绍Reactor模型 1.2 Reactor模型 无论是C++还是Java编写的网络框架,大多数都是基于Reactor模 ...
- genymotion安装及使用出现的问题
此处总结genymotion出现的问题. 1)安装好genymotion后,新建一个模拟器.去下载的时候报错 Unable to create Virtual Device: Connection t ...
- dojo事件绑定
Dojo如何动态绑定事件的小demo <html> <title>事件绑定测试test</title> <head></head> < ...
- Python开发环境Wing IDE使用教程之matplotlib 2D绘图库代码调试技巧
Wing IDE是一个集成开发环境,可用于加快matplotlib2D图形库的Python代码的编写和调试进程.Wing IDE提供自动完成.调用提示.调试器,以及许多其他功能,可帮助用户编写.浏览和 ...
- 【从业余项目中学习1】C# 实现XML存储用户名密码(MD5加密)
最近在写一个C#的项目,用户需求是实现Winform的多文档界面与Matlab算法程序之间的交互.做了一段时间发现,这既能利用业余时间,实战中也可学习一些技术,同时刚毕业也增加一份收入.所以后面会不断 ...
- java:错误Error,异常Excepition
java中throw异常后代码还会继续执行吗 今天遇到一个问题,在下面的代码中,当抛出运行时异常后,后面的代码还会执行吗,是否需要在异常后面加上return语句呢? public void add(i ...
- java核心-流基础
1.流的概念: 1.1输入流:向内存中写入数据 1.2输出流:有内存向指定的地方输出数据 2.