题意:链接

**方法:**cdq分治+树状数组

解析:

首先对于这道题,看了范围之后。二维的数据结构是显然不能过的。于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好的体现它的作用。

首先,对于每个询问求和,显然是x在它左边的而且出现时间在它之前的全部的change对他可能会有影响。

我们依照x第一关键字,y第二关键字,操作第三关键字来排序全部的询问。然后在cdq的时候,每次递归处理左半区间,依照x动态的将y这一列的值加到树状数组里。来更新右半边的全部询问,注意这里的树状数组是须要清的,也就是每次cdq都是採用不同的树状数组。

另:这题神坑。数组开小不是RE而是WA

数组范围是要开到200000*4的,由于对于每个1操作。是一个操作,而2操作依据容斥原理,是4个操作。

所以复杂度大概是多少呢O(nlog^2(n))cdq+树状数组。n<=800000

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 800010
#define Q q[tot]
using namespace std;
struct node
{
int opt,x,y,A,no,belong;
}q[N],nq[N];
int n;
int jd,tot,T;
int ans[N];
int c[N];
int lowbit(int x){return x&(-x);}
int getsum(int x){int ret=0;while(x){ret+=c[x],x-=lowbit(x);}return ret;}
void update(int x,int v){while(x<=n){c[x]+=v;x+=lowbit(x);}}
int cmp(node a,node b)
{
if(a.x==b.x&&a.y==b.y)return a.opt<b.opt;
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
void sov(int l,int r)
{
if(l==r)return;
int mid=(l+r)>>1,l1=l,l2=mid+1;
for(int i=l;i<=r;i++)
{
if(q[i].no<=mid&&q[i].opt==1)update(q[i].y,q[i].A);
if(q[i].no>mid&&q[i].opt==2)ans[q[i].belong]+=getsum(q[i].y);
}
for(int i=l;i<=r;i++)
{
if(q[i].no<=mid&&q[i].opt==1)update(q[i].y,-q[i].A);
}
l1=l,l2=mid+1;
for(int i=l;i<=r;i++){if(q[i].no<=mid)nq[l1++]=q[i];else nq[l2++]=q[i];}
for(int i=l;i<=r;i++)q[i]=nq[i];
sov(l,mid),sov(mid+1,r);
}
int main()
{
scanf("%d",&n);
while(scanf("%d",&jd)&&jd^3)
{
if(jd==1){int x,y,a;scanf("%d%d%d",&x,&y,&a);q[++tot].opt=1,Q.x=x,Q.y=y,Q.A=a,Q.no=tot;}
else
{
int x1,x2,y1,y2;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
q[++tot].opt=2,Q.x=x1-1,Q.y=y1-1,Q.A=1,Q.no=tot,Q.belong=++T;
q[++tot].opt=2,Q.x=x1-1,Q.y=y2,Q.A=-1,Q.no=tot,Q.belong=T;
q[++tot].opt=2,Q.x=x2,Q.y=y1-1,Q.A=-1,Q.no=tot,Q.belong=T;
q[++tot].opt=2,Q.x=x2,Q.y=y2,Q.A=1,Q.no=tot,Q.belong=T;
}
}
sort(q+1,q+1+tot,cmp);
sov(1,tot);
for(int i=1;i<=T;i++)printf("%d\n",ans[i]);
}

BZOJ 2683 简单题 cdq分治+树状数组的更多相关文章

  1. BZOJ2683: 简单题(cdq分治 树状数组)

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 2142  Solved: 874[Submit][Status][Discuss] Descripti ...

  2. 【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组

    bzoj1176 题目描述 维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. python 添加自定义库

    首先,写一个库文件aaa.py 格式,在python安装目录下面创建一个空的文件夹命名Function 或者其他文件名, 然后将文件保存在python 安装目录下面的一个Function文件夹下面. ...

  2. [luogu] P3210 [HNOI2010]取石头游戏(贪心)

    P3210 [HNOI2010]取石头游戏 题目描述 A 公司正在举办一个智力双人游戏比赛----取石子游戏,游戏的获胜者将会获得 A 公司提供的丰厚奖金,因此吸引了来自全国各地的许多聪明的选手前来参 ...

  3. 2.WHERE中使用=,>,>=,<,<=,<>,!=比较符号

        //查询工资大于等于2000的人   select * from person salary >= 2000;   //查询名字等于scott的人   select * from per ...

  4. angular-基础

    AngularJs特点: 1.依赖注入 2.模块化 3.双向绑定 4.语义化标签 当网页加载完毕,AngularJS 自动开启. ng-app 指令告诉 AngularJS,<div> 元 ...

  5. spring boot pom

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  6. [HTML5] Inlining images with SVG and data URIs

    The main reason you want to do I"nlining images with SVG and data URIs" is to reduce http ...

  7. MapReduce运行流程具体解释

    在hadoop中.每一个mapreduce任务都会被初始化为一个Job. 每一个Job又能够分为两个阶段:map阶段和reduce阶段.这两个阶段分别用两个函数来表示,即map函数和reduce函数. ...

  8. 安卓更新Toast流程图

    今天照着书写了个程序为了理解更深刻特意画了一个流程图分享给大家 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc29uZ2p1bnlhbg==/font/5 ...

  9. python写个简单的文件上传是有多难,要么那么复杂,要么各种,,,老子来写个简单的

    def upload(url,params): ''' 上传文件到server,不适合大文件 @params url 你懂的 @params {"action":"xxx ...

  10. windows+ubuntu双系统,在windows中访问ubuntu文件

    今天被告知ubuntu磁盘空间不足,百度得知可以通过autoremove命令清理,然而,,再也进不去ubuntu系统了,具体表现为第一次选择ubuntu之后一直是空白紫屏,如果强制关机再开机后选择ub ...