啃了一天论文,发现CDQ分治的原理其实很简单,大概就是这样的一类分治:将左右区间按一定规律排序后分开处理,递归到底时直接计算答案,对于一个区间,按照第二关键字split成两个区间,先处理左区间,之后因为整个区间是有序的,就可以根据左区间来推算右区间的答案,最后递归处理右区间即可。拿此题做比方,先把全区间按照x坐标排序,然后自左向右用前一半(按时间排序)的修改来更新后一半的查询,之后将整个区间按照时间分成两个部分,递归处理。归纳起来就是split->left->push->right->merge->return。

 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cmath> using namespace std; struct node { int v,x,y,op,d,pos; }a[],temp[]; int s,w,cnt;
int L[],Ans[]; bool operator<(const node temp1,const node temp2)
{
if(temp1.x!=temp2.x)return temp1.x<temp2.x;
if(temp1.y!=temp2.y)return temp1.y<temp2.y;
return temp1.op<temp2.op;
} void Add(const int x,const int d) { for(int i=x;i<=w;i+=i&-i)L[i]+=d; return ; }
int Query(const int x) { int t=; for(int i=x;i;i-=i&-i) t+=L[i]; return t; } void CDQ(const int l,const int r)
{
if(l==r)return ; int i,mid=l+((r-l)>>); for(i=l;i<=r;++i)
{
if(a[i].v<=mid && a[i].op==)Add(a[i].y,a[i].d);
if(a[i].v>mid && a[i].op==)Ans[a[i].pos]+=Query(a[i].y)*a[i].d;
}
for(i=l;i<=r;++i)
if(a[i].v<=mid && a[i].op==)Add(a[i].y,-a[i].d); int l1=l,l2=mid+;
for(i=l;i<=r;++i)
{
if(a[i].v<=mid)temp[l1++]=a[i];
else temp[l2++]=a[i];
}
for(i=l;i<=r;++i)a[i]=temp[i];
CDQ(l,mid),CDQ(mid+,r);
return ;
} int main()
{
int i,op,x,y,z,xa,xb,ya,yb; scanf("%d%d",&s,&w);
while()
{
scanf("%d",&op);
if(op==)
{
scanf("%d%d%d",&x,&y,&z);
a[++cnt]=(node){cnt,x,y,,z,};
}
else if(op==)
{
scanf("%d%d%d%d",&xa,&ya,&xb,&yb);
a[++cnt]=(node){cnt,xb ,yb ,,+,++Ans[]};
a[++cnt]=(node){cnt,xb ,ya-,,-,Ans[]};
a[++cnt]=(node){cnt,xa-,yb ,,-,Ans[]};
a[++cnt]=(node){cnt,xa-,ya-,,+,Ans[]};
}
else break;
} sort(a+,a+cnt+); CDQ(,cnt); for(i=;i<=Ans[];++i)
printf("%d\n",Ans[i]); return ;
}

[bzoj1176]Mokia[CDQ分治]的更多相关文章

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

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

  2. BZOJ 1176 Mokia CDQ分治+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  3. BZOJ 1176[Balkan2007]Mokia(CDQ分治)

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 3381  Solved: 1520[Submit][S ...

  4. BZOJ 1176: [Balkan2007]Mokia [CDQ分治]

    题意: 有一个n * n的棋盘,每个格子内有一个数,初始的时候全部为0.现在要求维护两种操作: 1)Add:将格子(x, y)内的数加上A. 2)Query:询问矩阵(x0, y0, x1, y1)内 ...

  5. 洛谷P4390 Mokia CDQ分治

    喜闻乐见的CDQ分治被我搞的又WA又T..... 大致思路是这样的:把询问用二维前缀和的思想拆成4个子询问.然后施CDQ大法即可. 我却灵光一闪:树状数组是可以求区间和的,那么我们只拆成两个子询问不就 ...

  6. BZOJ1176: [Balkan2007]Mokia CDQ分治

    最近很不对啊=w= 写程序全是bug啊 ans数组开小了竟然一直不知道,小数据没问题大数据拍不过,交上去RE 蛋疼半天 这个主要把每次询问拆成3个询问. #include<cstdio> ...

  7. BZOJ 1176 [Balkan2007]Mokia ——CDQ分治

    [题目分析] 同BZOJ2683,只需要提前处理s对结果的影响即可. CDQ的思路还是很清晰的. 排序解决一维, 分治时间, 树状数组解决一维. 复杂度是两个log [代码] #include < ...

  8. BOI2007 Mokia | cdq分治求二维点数模板

    题目链接:戳我 也没什么,其实主要就是为了存一个求二维坐标上矩形内点的个数的模板.为了之后咕咕咕地复习使用 不过需要注意的一点是,树状数组传x的时候可千万不要传0了!要不然会一直死循环的...qwqw ...

  9. [bzoj] 1176 Mokia || CDQ分治

    原题 给出W×W的矩阵(S没有用,题目有误),给出无限次操作,每次操作的含义为: 输入1:你需要把(x,y)(第x行第y列)的格子权值增加a 输入2:你需要求出以左下角为(x1,y1),右上角为(x2 ...

随机推荐

  1. $CF55D [数位DP]$

    题面 数位DP+状压. 首先,按照数位DP的基本套路,每个个位数的最小公倍数为2520,所以只用考虑模2520的情况.考虑一个DP.dp[i][j][k]表示当前是第i位,2~9的数的集合为j,模25 ...

  2. 最大加权矩形 luogu1719

    题目链接:https://www.luogu.org/problemnew/show/P1719 这道题挺好做的 又是一道练前缀和的题 #include <bits/stdc++.h> # ...

  3. [SDOI2009]学校食堂

    题目描述 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满意的菜肴.当然,不同的人口味也不一定相同,但每个人的口味都可以用一个非负整数 ...

  4. 网络爬虫之scrapy框架(CrawlSpider)

    一.简介 CrawlSpider其实是Spider的一个子类,除了继承到Spider的特性和功能之外,还派生了其自己独有的更强大的特性和功能.其中最显著的功能就是"LinkExtractor ...

  5. 【[转】MySql模糊查询

    转自:http://chenpeng.info/html/2020 MySQL提供标准的SQL模式匹配,以及一种基于象Unix实用程序如vi.grep和sed的扩展正则表达式模式匹配的格式. 一.SQ ...

  6. [转]Windows Azure平台简介(一):定位与产品结构

    本文转自:http://blog.csdn.net/azurechina/article/details/5592236 http://blogs.msdn.com/b/azchina/archive ...

  7. 观察者模式(observer)c++实现

    1意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 2别名 依赖(Dependents), 发布-订阅(Publish-Subscribe ...

  8. mvc使用linq to sql进行sum统计遇到查询为null的问题

    mvc linq to sql,linq to entity,sum,null 昨天写了段sum的统计语句, decimal sums sums = ( from fac in db.Apply wh ...

  9. plc学习笔记

    防抖编程代码备份 如果定时到了还未检测到下降沿,则认为信号有效.这一端程序主要是针对现场装料杯在输送过程中由于传送带原因,电眼时常产生无效停机信号,需要过滤,因此需要在电眼检测中添加防抖功能 2018 ...

  10. 如何让一个div里面的div垂直居中?

    如何让一个div里面的div垂直居中? 如何让上面灰色有文字那个div和背景图标垂直居中,不管屏幕大小有好大,始终在垂直方向上的中间.上面有整个布局和样式表,谢谢高手指点 CSS3时代当然要用CSS3 ...