2683: 简单题

Time Limit: 50 Sec  Memory Limit: 128 MB
Submit: 913  Solved: 379
[Submit][Status][Discuss]

Description

你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作:

命令

参数限制

内容

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

输入文件第一行一个正整数N。
接下来每行一个操作。
 

Output

对于每个2操作,输出一个对应的答案。
 

Sample Input

4
1 2 3 3
2 1 1 3 3
1 2 2 2
2 2 2 3 4
3

Sample Output

3
5

HINT

1<=N<=500000,操作数不超过200000个,内存限制20M。
对于100%的数据,操作1中的A不超过2000。

Source

 

[Submit][Status][Discuss]

分析

离线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: 简单题的更多相关文章

  1. BZOJ 2683: 简单题(CDQ分治 + 树状数组)

    BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...

  2. BZOJ 2683: 简单题 [CDQ分治]

    同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...

  3. bzoj 4066 & bzoj 2683 简单题 —— K-D树(含重构)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4066 https://www.lydsy.com/JudgeOnline/problem.p ...

  4. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

  5. BZOJ 2683: 简单题(CDQ 分治)

    题面 Time Limit: 50 Sec  Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: ...

  6. BZOJ 2683 简单题 ——CDQ分治

    [题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...

  7. bzoj 1176: [Balkan2007]Mokia&&2683: 简单题 -- cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要 ...

  8. bzoj 4066: 简单题 kd-tree

    4066: 简单题 Time Limit: 50 Sec  Memory Limit: 20 MBSubmit: 234  Solved: 82[Submit][Status][Discuss] De ...

  9. BZOJ 3687: 简单题 bitset

    3687: 简单题 Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 小呆开始研究集合论了,他 ...

随机推荐

  1. Broadmann分区

    来源: http://blog.sina.com.cn/s/blog_60a751620100k2hj.html Brodmann areas Name 中文名 Function 1 Somatose ...

  2. DataReader用法

    一.DataReader含义 DataReader相比于DataSet,DataReader是一个抽象类,所以不能用DataReader DR = new DataReader(),来构造函数创建对象 ...

  3. 4816 江哥的dp题b

    4816 江哥的dp题b  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给出两个1-N的随机排列A,B.若 ...

  4. 003商城项目:数据库的创建以及ssm框架的整合

    我们创建一个数据库.如下: 然后开始整合框架:  先给出整合框架的思路: 我们的Dao层用的是Mybatis,其实Mybatis与Spring整合要做的就是把他的数据库连接这部分全部交给Spring来 ...

  5. [py]文件 字符串 列表特例

    文件 readlines 列表 readline 字符串 read 字符串   列表---拆分---小列表   f=file('test.log','r') for line in f.readlin ...

  6. Linux execve函数簇用法

    exec函数簇实现的功能都是用一个新程序替换原来的程序,替换的内容包括堆栈段,代码段,进程控制器PCD,但是原进程的PID保持不变 int execl(const char *path, const ...

  7. java:如何让程序按要求自行重启?

    正文开始前的废话: 这里的程序即包括b/s的web application,也包括standalone的类c/s的java application.   为什么要自我重启?   场景1:分布式环境中, ...

  8. hessian学习

    hessian是一个采用二进制格式传输的服务框架,相对传统soap web service,更轻量,更快速.官网地址:http://hessian.caucho.com/ 目前已经支持N多语言,包括: ...

  9. 大新闻!HoloLens即将入华商用

    昨天微软搞了大新闻,Terry和Alexi到了深圳,在WinHEC大会上宣布了2017上半年HoloLens正式入华商用. 关于HoloLens的技术原理和细节官方文档和报道已经披露很多了,他是一款真 ...

  10. JavaScript 总结几个提高性能知识点

    前段时间花时间看了大半的<High Performance JavaScript>这本书啊,然后就开始忙项目了,庆幸最忙的一周已经熬过去了.由于空不出时间,这个月写的学习笔记也不多,忙完最 ...