BZOJ 2683 简单题 cdq分治+树状数组
题意:链接
**方法:**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分治+树状数组的更多相关文章
- BZOJ2683: 简单题(cdq分治 树状数组)
Time Limit: 50 Sec Memory Limit: 128 MBSubmit: 2142 Solved: 874[Submit][Status][Discuss] Descripti ...
- 【bzoj1176】[Balkan2007]Mokia/【bzoj2683】简单题 CDQ分治+树状数组
bzoj1176 题目描述 维护一个W*W的矩阵,初始值均为S(题目描述有误,这里的S没有任何作用!).每次操作可以增加某格子的权值,或询问某子矩阵的总权值.修改操作数M<=160000,询问数 ...
- BZOJ 2683: 简单题(CDQ 分治)
题面 Time Limit: 50 Sec Memory Limit: 128 MB Description 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: ...
- BZOJ 2683 简单题 ——CDQ分治
[题目分析] 感觉CDQ分治和整体二分有着很本质的区别. 为什么还有许多人把他们放在一起,也许是因为代码很像吧. CDQ分治最重要的是加入了时间对答案的影响,x,y,t三个条件. 排序解决了x ,分治 ...
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...
- BZOJ 2683: 简单题 [CDQ分治]
同上题 那你为什么又发一个? 因为我用另一种写法又写了一遍... 不用排序,$CDQ$分治的时候归并排序 快了1000ms... #include <iostream> #include ...
- 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 ...
随机推荐
- fetch 如何请求数据
fetch 如何请求数据 在 传统Ajax 时代,进行 API 等网络请求都是通过XMLHttpRequest或者封装后的框架进行网络请求,然而配置和调用方式非常混乱,对于刚入门的新手并不友好 二 与 ...
- HDU 4323 Contest 3
编辑距离,经典的了.动态规划枚举即过. #include <iostream> #include <cstdio> #include <string.h> #inc ...
- 玩转iOS开发 - Runloop 具体解释
Runloop 具体解释
- 取消记录tableView选中效果
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self. ...
- STM32IAP升级-----编写IAP升级遇到的问题总结
IAP的源代码等资料我上传了,压缩包内有12个文件.,http://download.csdn.net/detail/f907279313/7524849(要积分的辛苦收集的你们就给点积分吧) 还有还 ...
- JAVA设计模式之【建造者模式】
建造者模式 建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品 角色 Builder抽象建造者 buildPartX getResult ConcreteBuilder具体建 ...
- CNN tflearn处理mnist图像识别代码解说——conv_2d参数解释,整个网络的训练,主要就是为了学那个卷积核啊。
官方参数解释: Convolution 2D tflearn.layers.conv.conv_2d (incoming, nb_filter, filter_size, strides=1, pad ...
- httputil用http获取请求的工具类
package com.xiaocan.demo.util; import java.io.IOException; import java.io.InputStream; import java.u ...
- 记录一下c++的一点指针所得
c++有两种传值可以改变外部参数,一种是传递指针,另一种是传递引用,对于前者,可以用Ugly(but explicitly),对于后者,Clean(but hidden),在传递的时候有一种值得注意的 ...
- 循环访问 TreeView 控件的所有节点
创建测试每个节点的递归过程 . private void PrintRecursive(TreeNode treeNode) { // Print the node. System.Diagnosti ...