BZOJ1176---[Balkan2007]Mokia (CDQ分治 + 树状数组)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1176
CDQ第一题,warush了好久。。
CDQ分治推荐论文:
1 《从<Cash>谈一类分治算法的应用》 陈丹琦
2 《浅谈数据结构题的几个非经典解法》 许昊然
关于CDQ分治,两种要求:①操作不相互影响 ②可以离线处理
题目描述是有问题的,,初始时 全部为0,不是s
题意:二维平面内,两种操作,1 x y v ,位于(x,y)的值加上v.。。2 x1,y1,x2,y2,,(x1,y1) (x2,y2)分别矩形的左上角右下角,查询矩形内所有元素的和。
大致思路,在x这一维上进行分治,然后y这一维直接就可以用树状数组乱搞了。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxb = 2e6+;
struct Node
{
int x,y,delt;
int flag,idx;
Node(){}
Node(int _x,int _y,int _delt,int _flag,int _idx):
x(_x),y(_y),delt(_delt),flag(_flag),idx(_idx){};
bool operator < (const Node &rhs)const
{
return x < rhs.x || (x == rhs.x && y < rhs.y);
}
}a[];
struct BIT
{
int c[maxb],MAX;
inline int lowbit(int x)
{
return x & -x;
}
void add(int x,int val)
{
while (x <= MAX)
{
c[x] += val;
x += lowbit(x);
}
}
int sum(int x)
{
int res = ;
while (x > )
{
res += c[x];
x -= lowbit(x);
}
return res;
}
}arr; //---------------------------------------------
int ans[];
void CDQ(int l,int r)
{
if (l == r)
return;
int mid = (l + r) >> ;
CDQ(l,mid);
CDQ(mid+,r);
int j = l;
for (int i = mid + ; i <= r; i++)
{
if (a[i].flag == )
{
for ( ; j <= mid && a[j].x <= a[i].x; j++)
{
if (a[j].flag == )
{
arr.add(a[j].y,a[j].delt);
}
}
ans[a[i].idx] += arr.sum(a[i].y) * a[i].delt;
}
}
for (int i = l; i < j; i++)
if (a[i].flag == )
arr.add (a[i].y,-a[i].delt);
inplace_merge (a+l,a+mid+,a+r+); // 合并区间 [l,mid+1) [mid+1,r+1)
}
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
int s,w;
while (~scanf ("%d%d",&s,&w))
{
int op;
int tot = ,totq = ;
arr.MAX = w;
memset(ans,,sizeof(ans));
while (scanf ("%d",&op), op != )
{
if (op == )
{
int x,y,delt;
scanf ("%d%d%d",&x,&y,&delt);
a[tot] = Node(x,y,delt,,tot);
tot++;
}
if (op == )
{
int x1,y1,x2,y2;
scanf ("%d%d%d%d",&x1,&y1,&x2,&y2);
a[tot] = Node(x1-, y1-, , , totq); tot++;
a[tot] = Node(x2, y1-, -, , totq); tot++;
a[tot] = Node(x1-, y2, -, , totq); tot++;
a[tot] = Node(x2, y2, , , totq); tot++;
totq++;
}
}
CDQ (,tot-);
for (int i = ; i < totq; i++)
printf("%d\n",ans[i]);
}
return ;
}
BZOJ1176---[Balkan2007]Mokia (CDQ分治 + 树状数组)的更多相关文章
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...
- 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 ...
- BZOJ 2683 简单题 cdq分治+树状数组
题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...
- LOJ3146 APIO2019路灯(cdq分治+树状数组)
每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...
- BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组
考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...
- Hdu4742-Pinball Game 3D(cdq分治+树状数组)
Problem Description RD is a smart boy and excel in pinball game. However, playing common 2D pinball ...
随机推荐
- Robotium--通过Id寻找控件
在自动化测试中,UI上经常有一些控件是没有名称的,那么此时,就可以通过id来找到这些控件. 案例:对两个EditText进行测试 package com.tangbc.tedit.test; impo ...
- swift开发笔记24 解决键盘遮挡输入框 的方法
很简单,就是开始输入时把整个view的frame上移,也就是把y值减小就行了,至于减少多少自己调 ,也可以动态获取参见(http://blog.csdn.net/lengshengren/articl ...
- php开启ssl支持
1.首先在php的安装文件下找到三个文件 并copy到系统目标下的 system32文件夹下: ssleay32.dll.libeay32.dll,php_openssl.dll. 2.打开php.i ...
- Topcoder SRM 639 (Div.2)
A.ElectronicPetEasy [题意]一个数st1开始,每次加p1,一共加t1次,另外一个数st2开始,每次加p2,一共加t2次,输入的数均小于1000,问这两个数有没有可能相等,有可能输出 ...
- 拓扑排序 HDU1285
这个题是个模板题,可以直接用拓扑排序的模板来做, AC代码 #include <stdio.h> #include<iostream> #include <string. ...
- String对象之间的比较
public class StringTest { @Test public void test01() { int a = 50; // 基本数据类型比较的是值 int b = 50; System ...
- Mysql group_concat
select p.id,p.parent_id,group_concat(distinct(CONCAT("分类名称:",c.name)) order by c.id desc s ...
- CRC32校验的用法
CRC32校验数据的完整性 这里的数据包括字符串.文件,还有哪些? 文件校验相当于下载大型软件,有md5加密结果.这里的用途是什么?
- smarty半小时快速上手教程(转)
来源于:http://www.chinaz.com/program/2010/0224/107006.shtml 一:smarty的程序设计部分: 在smarty的模板设计部分我简单的把smarty在 ...
- oracle 使用 ALTER 操作列
使用 ALTER TABLE 语句追加, 修改, 或删除列的语法