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 ...
随机推荐
- java.lang.UnsatisfiedLinkError: Native method not found 三种可能解决方案
so文件编译生成后,运行时,有时候会遇到java.lang.UnsatisfiedLinkError: Native method not found问题,有可能是以下三种因素: 一.Jni方法头部大 ...
- 外键约束列并没有导致大量建筑指数library cache pin/library cache lock
外键约束列并没有导致大量建筑指数library cache pin/library cache lock 清除一个100大数据表超过一百万线,发现已经运行了几个小时: delete B001.T_B1 ...
- Sort List (使用归并排序的链表排序)
Sort a linked list in O(n log n) time using constant space complexity. C++代码的实现: #include<iostrea ...
- PYCURL ERROR 22 - "The requested URL returned error: 403 Forbidden"
RHEL6.5创建本地Yum源后,发现不可用,报错如下: [root@namenode1 html]# yum install gcc Loaded plugins: product-id, refr ...
- pbxproj文件冲突解决办法
企业开发经常会遇到project.pbxproj文件冲突的问题 project.pbxproj文件主要包含了以下几项主要信息 工程文件关联信息,如PBXBuildFile.PBXFileReferen ...
- mongodb查询之模糊查询
mongodb的模糊查询是用正则表达式来实现的.例子如下: db.COMMODITY_COMMODITY_SHOP.find({name:{$regex :/南京/i}})
- Wcf资料收集
1.简介 http://www.tuicool.com/articles/mqYB32 使用规范 http://blog.51cto.com/zt/219 2.教程系列 http://www.cnbl ...
- 如何查看linux系统下的各种日志文件 linux 系统日志的分析大全
日志分类: 1. 连接时间的日志 连接时间日志一般由/var/log/wtmp和/var/run/utmp这两个文件记录,不过这 两个文件无法直接cat查看,并且该文件由系统自动更新,可以通过如下: ...
- C++小技巧之四舍五入与保留小数
四舍五入:保留整数 int a = b+0.5; 保留一位小数 int a=(b+0.05)*10; double c=a/10; 保留二位小数 int a=(b+0.005)*100; doub ...
- XML Schema (2)
定义元素 <!-- 1.定义元素book --> <element name="book"></element> <!-- 2.定义元素包 ...