BZOJ 2683: 简单题
2683: 简单题
Time Limit: 50 Sec Memory Limit: 128 MB
Submit: 913 Solved: 379
[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分治,对于预处理后的所有操作(查询)按照X坐标排序,然后用树状数组维护Y坐标上的前缀和。
代码
#include <bits/stdc++.h> using namespace std; const int N = ;
const int M = ; template <class T>
__inline void read(T &x)
{
x = ;
bool f = false;
char c = getchar(); while (c < '')
{
if (c == '-')
f ^= true;
c = getchar();
} while (c >= '')
{
x = x* + c - '';
c = getchar();
} if (f)x = -x;
} struct operation
{
int id, op, to, x, y, d;
}q[M << ], tmp[M << ]; int cmp(const void *a, const void *b)
{
operation *A = (operation *)a;
operation *B = (operation *)b; if (A->x != B->x)
return A->x - B->x;
if (A->y != B->y)
return A->y - B->y;
return A->op - B->op;
} int n, m, t; void pushQuery(void)
{
int x1; read(x1);
int y1; read(y1);
int x2; read(x2);
int y2; read(y2); ++t;
{
++m;
q[m].d = ;
q[m].op = ;
q[m].id = m;
q[m].to = t;
q[m].x = x1 - ;
q[m].y = y1 - ;
}
{
++m;
q[m].d = ;
q[m].op = ;
q[m].id = m;
q[m].to = t;
q[m].x = x2;
q[m].y = y2;
}
{
++m;
q[m].d = -;
q[m].op = ;
q[m].id = m;
q[m].to = t;
q[m].y = y2;
q[m].x = x1 - ;
}
{
++m;
q[m].d = -;
q[m].op = ;
q[m].id = m;
q[m].to = t;
q[m].x = x2;
q[m].y = y1 - ;
}
} int answer[M]; void printAnswer(void)
{
for (int i = ; i <= t; ++i)
printf("%d\n", answer[i]);
} namespace binaryInsertTree
{
int tree[N]; void change(int p, int v)
{
for (int i = p; i <= n; i += i & -i)
tree[i] += v;
} int query(int p)
{
int ret = ; for (int i = p; i >= ; i -= i & -i)
ret += tree[i]; return ret;
}
} void divideAndConquer(int l, int r)
{
if (l != r)
{
int mid = (l + r) >> ; for (int i = l; i <= r; ++i)
{
if (q[i].op == && q[i].id <= mid)
binaryInsertTree::change(q[i].y, q[i].d);
if (q[i].op == && q[i].id > mid)
answer[q[i].to] += binaryInsertTree::query(q[i].y) * q[i].d;
} for (int i = l; i <= r; ++i)
if (q[i].op == && q[i].id <= mid)
binaryInsertTree::change(q[i].y, -q[i].d); int t1 = l, t2 = mid + ; for (int i = l; i <= r; ++i)
{
if (q[i].id <= mid)
tmp[t1++] = q[i];
else
tmp[t2++] = q[i];
} for (int i = l; i <= r; ++i)
q[i] = tmp[i]; divideAndConquer(l, mid);
divideAndConquer(mid + , r);
}
} signed main(void)
{
read(n); for (m = t = ; ; )
{
int opt; read(opt); if (opt == )break; switch (opt)
{
case :
++m;
q[m].op = ;
q[m].id = m;
read(q[m].x);
read(q[m].y);
read(q[m].d);
break;
case :
pushQuery();
}
} qsort(q + , m, sizeof(operation), cmp); divideAndConquer(, m); printAnswer();
}
BZOJ_2683.cpp
@Author: YouSiki
BZOJ 2683: 简单题的更多相关文章
- BZOJ 2683: 简单题(CDQ分治 + 树状数组)
BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...
- BZOJ 2683: 简单题 [CDQ分治]
同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...
- bzoj 4066 & bzoj 2683 简单题 —— K-D树(含重构)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 https://www.lydsy.com/JudgeOnline/problem.p ...
- BZOJ 2683 简单题 cdq分治+树状数组
题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...
- BZOJ 2683: 简单题(CDQ 分治)
题面 Time Limit: 50 Sec Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: ...
- BZOJ 2683 简单题 ——CDQ分治
[题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...
- bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治
2683: 简单题 Time Limit: 50 Sec Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...
- bzoj 4066: 简单题 kd-tree
4066: 简单题 Time Limit: 50 Sec Memory Limit: 20 MBSubmit: 234 Solved: 82[Submit][Status][Discuss] De ...
- BZOJ 3687: 简单题 bitset
3687: 简单题 Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss] Description 小呆开始研究集合论了,他 ...
随机推荐
- 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序
如何用javac 和java 编译运行整个Java工程 (转载) http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...
- mac:在当前文件夹打开terminal终端
System Preferences -> Keyboard -> Shortcuts -> Services -> New Terminal at Folders/New T ...
- java 客户端链接不上redis解决方案
原文地址:http://blog.csdn.net/yingxiake/article/details/51472810 出现问题描述: 1.Could not get a resource from ...
- oracle 11g的企业管理器
oracle 11g的企业管理器不同于其他版本,它是B/S的,默认登录为:https://localhost:1158/em,但我试了IE8跟360浏览器都不行,谷歌浏览器是可以访问的
- 翻译qmake文档(四) Building Common Project Types
翻译qmake文档 目录 本章原英文文档:http://qt-project.org/doc/qt-5/qmake-common-projects.html 构建常见的项目类型 本章描述 ...
- 【AS3】Flash与后台数据交换四种方法整理
随着Flash Player 9的普及,AS3编程也越来越多了,所以这次重新整理AS3下几种与后台数据交换方法.1.URLLoader(URLStream)2.FlashRemoting3.XMLSo ...
- 一次莽撞的行为:在phpmyadmin中修改MySQL root密码后无法操作数据库
一.手贱行为(✿◡‿◡) 在一次开发中通过xampp方式安装了PHP环境,需要操作数据库时通过phpmyadmin访问MySQL,在一次数据库操作时想起没有设置密码,于是直接在mysql数据库中的us ...
- 【REST WCF】30分钟理论到实践
先来点理论知识,来自 http://www.cnblogs.com/simonchen/articles/2220838.html 一.什么是Rest REST软件架构是由Roy Thomas Fie ...
- Myeclipse 2015 stable 2.0 完美破解方法
2015-08-21 以前写了一篇<Myeclipse 2015 stable 1.0 完美破解方法>,现 在跟新一下Myeclipse 2015 stable 2.0 破解方法,此方法 ...
- Congruence relation 同余关系
https://en.wikipedia.org/wiki/Congruence_relation https://zh.wikipedia.org/wiki/%E5%90%8C%E9%A4%98%E ...