1176: [Balkan2007]Mokia

Time Limit: 30 Sec  Memory Limit: 162 MB
Submit: 1854  Solved: 821
[Submit][Status][Discuss]

Description

维护一个W*W的矩阵,初始值均为S.每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数Q<=10000,W<=2000000.

Input

第一行两个整数,S,W;其中S为矩阵初始值;W为矩阵大小

接下来每行为一下三种输入之一(不包含引号):

"1 x y a"

"2 x1 y1 x2 y2"

"3"

输入1:你需要把(x,y)(第x行第y列)的格子权值增加a

输入2:你需要求出以左上角为(x1,y1),右下角为(x2,y2)的矩阵内所有格子的权值和,并输出

输入3:表示输入结束

Output

对于每个输入2,输出一行,即输入2的答案

Sample Input

0 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

保证答案不会超过int范围

Solution  

CDQ分治+树状数组裸题,矩阵分成四个点统计,单点更新。

Code

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream> using namespace std; const int maxn = ;
const int maxm = +;
int s, w, ans[maxm];
struct Node
{
int op, id, x, y, k, to;
Node (int op = , int id = , int x = , int y = , int k = , int to = ):
op(op), id(id), x(x), y(y), k(k), to(to) {}
bool operator < (const Node &AI) const
{
if (x == AI.x && y == AI.y)
return op < AI.op;
if (x == AI.x)
return y < AI.y;
return x < AI.x;
}
}q[maxm], temp[maxm];
struct BIT
{
int c[maxn+];
int lowbit(int x)
{
return x & -x;
}
void update(int x, int d)
{
while (x <= w)
{
c[x] += d;
x += lowbit(x);
}
}
int query(int x)
{
int ret = ;
while (x > )
{
ret += c[x];
x -= lowbit(x);
}
return ret;
}
}T; void cdq(int l, int r)
{
if (l == r)
return ;
int mid = (l+r)>>;
for (int i = l; i <= r; ++i)
{
if (q[i].id <= mid && q[i].op == )
T.update(q[i].y, q[i].k);
if (q[i].id > mid && q[i].op == )
ans[q[i].to] += q[i].k*T.query(q[i].y);
}
for (int i = l; i <= r; ++i)
if (q[i].id <= mid && q[i].op == )
T.update(q[i].y, -q[i].k);
int t1 = l-, t2 = mid;
for (int i = l; i <= r; ++i)
if (q[i].id <= mid)
temp[++t1] = q[i];
else
temp[++t2] = q[i];
for (int i = l; i <= r; ++i)
q[i] = temp[i];
cdq(l, mid), cdq(mid+, r);
} int main()
{
scanf("%d %d", &s, &w);
w += ;
int oper, cnt = , cnt_2 = ;
while (~scanf("%d", &oper) && oper != )
{
if (oper == )
{
int x, y, d;
scanf("%d %d %d", &x, &y, &d);
x += , y += ;
q[++cnt] = Node(, cnt, x, y, d, );
}
else
{
int x1, y1, x2, y2;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
x1 += , y1 += , x2 += , y2 += ;
cnt_2 ++;
ans[cnt_2] = s*(x2-x1+)*(y2-y1+);
q[++cnt] = Node(, cnt, x2, y2, , cnt_2);
q[++cnt] = Node(, cnt, x1-, y2, -, cnt_2);
q[++cnt] = Node(, cnt, x2, y1-, -, cnt_2);
q[++cnt] = Node(, cnt, x1-, y1-, , cnt_2);
}
}
sort(q+, q+cnt+);
cdq(, cnt);
for (int i = ; i <= cnt_2; ++i)
printf("%d\n", ans[i]);
return ;
}

  

BZOJ 1176 Mokia CDQ分治+树状数组的更多相关文章

  1. BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )

    考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...

  2. bzoj 3262 陌上花开 - CDQ分治 - 树状数组

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

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

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

  4. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  5. 【bzoj3262】陌上花开 CDQ分治+树状数组

    题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...

  6. 【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 ...

  7. LOJ3146 APIO2019路灯(cdq分治+树状数组)

    每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...

  8. BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组

    考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...

  9. BZOJ1176---[Balkan2007]Mokia (CDQ分治 + 树状数组)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1176 CDQ第一题,warush了好久.. CDQ分治推荐论文: 1 <从<C ...

随机推荐

  1. Vmware安装ubuntu详细教程

    1.环境准备: (1) 范例系统为WIN10 64位家庭普通版,已正确安装虚拟机VMware Workstation 12 Pro.(2) 下载Ubuntu系统. 2.安装过程: 2.1 VMware ...

  2. 【shell】shell编程总结

    总结一下在写shell脚本时的常见注意事项: 1.shell脚本中的命令最好用命令的全路径,如果不知道全路径可以用which cmd查找命令的全路径. 2.shell脚本中定义环境变量用export ...

  3. perl6正则 1: ~~ , //, m//, rx//

    ~~ perl6 中, 要匹配一个正则, 使用 ~~ 智能匹配符. > so 'abcde' ~~ /a.c/ True > so 'abcde' ~~ /a.d/ False > ...

  4. Swift中的指针类型

    Swift编程语言为了能与Objective-C与C语言兼容,而引入了指针类型.尽管官方不建议频繁使用指针类型,但很多时候,使用指针能完成更多.更灵活的任务.比如,我们要实现一个交换两个整数值的函数的 ...

  5. [ python ] 全局和局部作用域变量的引用

    全局与局部变量的引用 (a)locals(b)globals 这里还需要在补充2个关键字一起比较学习,关键字:(c)nonlocal(d)global locals 和 globals locals: ...

  6. 数学中的Sin和Cos是什么意思?(转)

    数学中的Sin和Cos是什么意思? 作者:admin 分类:生活随笔 发表于 2012年03月21日 16:48 问:数学中的Sin和Cos是什么意思? 答:sin, cos, tan 都是三角函数, ...

  7. spring自定义注解的使用

    前几天写了一个消息中间件(kafka)的封装,业务方发现消费者需要配置的东西太多(每增加一个topic和实现类都需要在配置文件中加,会显得很繁琐).于是我为了尽量减少这个XML配置,采用注解的方式来获 ...

  8. RGW 系统吞吐量(TPS)、用户并发量、性能测试概念和公式

      一.系统吞度量要素: 一个系统的吞度量(承压能力)与request对CPU的消耗.外部接口.IO等等紧密关联. 单个reqeust 对CPU消耗越高,外部系统接口.IO影响速度越慢,系统吞吐能力越 ...

  9. Ceph 时钟偏移问题 clock skew detected 解决方案--- 部署内网NTP服务

    告警:HEALTH_WARN clock skew detected on mon.ip-10-25-195-6; 8 requests are blocked > 32 sec; Monito ...

  10. appium---【Mac】Appium-Doctor提示WARN:“ opencv4nodejs cannot be found”解决方案

    报错提示: AppiumDoctor  ✖. opencv4nodejs cannot be found 如下截图: 解决方案: 第一步:安装cmake并配置环境变量 1.打开terminal执行:c ...