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 小呆开始研究集合论了,他 ...
随机推荐
- POJ 1743 Musical Theme
感觉最近好混乱......各种OJ都刷一点,感觉不太好......尤其是这种英文题 这道题一开始还没有看懂.听了ljh大犇的解释后终于明白了.下面我为英语和我一样的人翻译一下题面: 输入n个数.求最长 ...
- JDK动态代理和CGLib动态代理简单演示
JDK1.3之后,Java提供了动态代理的技术,允许开发者在运行期间创建接口的代理实例. 一.首先我们进行JDK动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: package te ...
- JMS + jboss EAP 6.2 示例
.Net中如果需要消息队列功能,可以很方便的使用微软自带的MSMQ,对应到Java中,这个功能就是JMS(Java Message Service). 下面以Jboss EAP 6.2环境,介绍一下基 ...
- 一步一步学习ABP项目系列文章目录
1.概述 基于DDD的.NET开发框架 - ABP初探 基于DDD的.NET开发框架 - ABP分层设计 基于DDD的.NET开发框架 - ABP模块设计 基于DDD的.NET开发框架 - ABP启动 ...
- requirejs:性能优化-及早并行加载
为了提高页面的性能,通常情况下,我们希望资源尽可能地早地并行加载.这里有两个要点,首先是尽早,其次是并行. 通过data-main方式加载要尽可能地避免,因为它让requirejs.业务代码不必要地串 ...
- word-wrap,word-break和white-space总结
最近网页布局中遇到得比较多,所以打算总结总结. word-wrap: 1.normal(使用浏览器默认的换行规则) 2.break-word(内容将在边界内换行,但是英文换行会按词断句) word-b ...
- ALinq Dynamic 使用指南——代码的获取与编译
1.下载代码 ALinq Dynamic 项目托管在 CodePlex 网站,你可以使用浏览器下载压缩包,或者通过 SVN 获取. 项目网址:http://esql.codeplex.com/ 压缩包 ...
- SDRAM操作原理分析
芯片原理图 引脚原理图 指令 通过对上面指令的总结,简化出要用到的指令如下: 指令 常量名 CKE CSn RAS CASn WEn 备注 空操作 NOP 1 0 1 1 1 行激活 ACTIVE ...
- 分布式拒绝服务攻击 DDoS
分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒 ...
- Recommending branded products from social media -RecSys 2013-20160422
1.Information publication:RecSys 2013 author:zhengyong zhang 2.What 是对上一篇论文的拓展:利用社交媒体中用户信息 对用户购买的类别排 ...