cdq分治妙啊

(被改过题面的)原题:

dydxh所出的题目是这样的:
有一个N*N矩阵,给出一系列的修改和询问,修改是这样的:将(x,y)中的数字加上k,而询问是这样的:求(x1,y1)到(x2,y2)这个子矩阵内所有数字的和。
虽然这么高级的数据结构题mzx这种菜逼当然不会,但是由于dydxh给mzx留了一条没有强制在线的生路,所以mzx决定挑战一下这道题。

1<=N<=500000,操作数不超过200000个,操作1中的k为正整数,且不超过2000

思路很妙,知道为什么要这样做但是感觉考场上想不出来QAQ

首先询问容斥成4个前缀和问题,设时间轴为z,问题就变成询问z<qz,x<qx,y<qy里面的数总和是多少

然后就跟数星星很像了,排序x,这样右边的x保证比左边的x大,cdq分治z,树状数组y

看网上的做法和我之前想的有点不一样,我之前想的是想归并排序那样从将右边的队头和左边的队头比较,小的出队,先递归,再计算

网上比较多的做法是,先计算,左边的修改给右边的查询贡献,然后把时间轴<=mid的放到mid左边,>mid的放到右边,再递归下一层

感觉第二种对于我来说更好理解吧,比较贴合cdq分治的本质,现在还不能理解这两种写法的联系

听闵神说递归的效率非常低?我和山神的递归2.2s,闵神迭代0.4s……

还需要想一下迭代的写法啊

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;
int read(){int z=,mark=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mark=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mark;
}
struct cdd{int x,y,z,v,mk;}a[]; int tp=;
int n;
int e[],lbt[];
cdd q[]; int hd=;
int ans[];
int t=;
void gtlbt(){for(int i=;i<=;++i)lbt[i]=i&-i;}
void mdf(int x,int y){while(x<=n) e[x]+=y,x+=lbt[x];}
int qr(int x){int bwl=; while(x) bwl+=e[x],x-=lbt[x]; return bwl;}
//int qr(int x){int bwl=0; while(x) bwl+=e[x],x-=lbt[x];}
void dfs(int l,int r){
if(l==r) return ;
int md=(l+r)>>;
for(int i=l;i<=r;++i){
if(!a[i].mk && a[i].z<=md) mdf(a[i].y,a[i].v);
else if(a[i].mk && a[i].z>md)
ans[a[i].v]+=a[i].mk*qr(a[i].y);
}
for(int i=l;i<=r;++i)if(!a[i].mk && a[i].z<=md) mdf(a[i].y,-a[i].v);
int t1=l,t2=md+;
for(int i=l;i<=r;++i) q[(a[i].z<=md?t1:t2)++]=a[i];
for(int i=l;i<=r;++i) a[i]=q[i];
dfs(l,md),dfs(md+,r);
}
bool cmp(cdd x,cdd y){return (x.x==y.x)?((x.z==y.z)?x.y<y.y:x.z<y.z):x.x<y.x;}
int main(){//freopen("ddd.in","r",stdin);
gtlbt();
cin>>n;
int mk,x,y,z,v;
while((mk=read())!=){
if(mk==) a[++tp].mk=,a[tp].x=read(),a[tp].y=read(),a[tp].v=read(),a[tp].z=tp;
else{
x=read(),y=read(),z=read(),v=read();
a[++tp].mk=,a[tp].x=z,a[tp].y=v,a[tp].z=tp,a[tp].v=++t;
a[++tp].mk=,a[tp].x=x-,a[tp].y=y-,a[tp].z=tp,a[tp].v=t;
a[++tp].mk=-,a[tp].x=z,a[tp].y=y-,a[tp].z=tp,a[tp].v=t;
a[++tp].mk=-,a[tp].x=x-,a[tp].y=v,a[tp].z=tp,a[tp].v=t;
}
}
sort(a+,a+tp+,cmp);
dfs(,tp);
for(int i=;i<=t;++i) printf("%d\n",ans[i]);
return ;
}

【BZOJ2683】简单题的更多相关文章

  1. [BZOJ2683]简单题/[BZOJ1176][BalkanOI2007]Mokia

    [BZOJ2683]简单题 题目大意: 一个\(n\times n(n\le5\times10^5)\)的矩阵,初始时每个格子里的数全为\(0\).\(m(m\le2\times10^5)\)次操作, ...

  2. Bzoj2683 简单题

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1071  Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...

  3. bzoj2683简单题 cdq分治

    2683: 简单题 Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1803  Solved: 731[Submit][Status][Discuss] ...

  4. bzoj2683简单题

    #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> ...

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

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

  6. BZOJ2683 简单题(CDQ分治)

    传送门 之前听别人说CDQ分治不难学,今天才知道果真如此.之前一直为自己想不到CDQ的方法二很不爽,今天终于是想出来了一道了,太弱-- cdq分治主要就是把整段区间分成两半,然后用左区间的值去更新右区 ...

  7. Bzoj2683 简单题 [CDQ分治]

    Time Limit: 50 Sec  Memory Limit: 128 MBSubmit: 1071  Solved: 428 Description 你有一个N*N的棋盘,每个格子内有一个整数, ...

  8. 【对询问分块】【主席树】bzoj2683 简单题

    对操作序列分块,每S次暴力重建主席树. 当S=sqrt(n*log(n))时,复杂度为O(m*sqrt(n*log(n))). 在线的. #include<cstdio> #include ...

  9. cdq分治——bzoj2683简单题

    https://www.lydsy.com/JudgeOnline/problem.php?id=2683 知识点:1.以操作的顺序进行分治  2.cdq分治维护矩阵 3.计算比mid小的给比mid大 ...

  10. [BZOJ2683][BZOJ4066]简单题

    [BZOJ2683][BZOJ4066]简单题 试题描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x ...

随机推荐

  1. LeetCode--067--二进制求和

    问题描述: 给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1&quo ...

  2. 页面title改变浏览器兼容性问题

    前一阵子客户在界面上改了下小小的需求,需要点不同的文章title显示不同的模块名称(之前没有区分,统一叫新闻图片),很简单的一个需求但是测试的时候并没有注意到不兼容IE7和IE8.在客户那被尴尬的发现 ...

  3. ubuntu修改root密码

    1.我们在安装系统的时候我们会把系统的密码设置的比较简单,所以导致后面我们别人很容易操作我们的电脑.所以,我们就可以修改密码,你只要在系统上输入: sudo passwd root

  4. HDU-1232 畅通工程 (并查集、判断图中树的棵数)

    Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相 ...

  5. Ajax中Delete请求参数 后台无法获取的解决方法(Restful风格)

    方法一: 在ajax中写入data来传参时,直接把参数拼接到url后面 例如: $.ajax({ url: '/cyberspace/vrv/event/delete/1002?startTime=& ...

  6. quartz---的SimpleTrigger

    quartz---的SimpleTrigger package com.imooc.demo.helloQuartz; import java.text.SimpleDateFormat; impor ...

  7. @Resource与@Autowired注解的区别

    一.写本博文的原因 年初刚加入到现在的项目时,在使用注解时我用的@Resource.后来,同事:你怎么使用@Resource注解?我:使用它有错吗?同事:没错,但是现在都使用@Autowired.我: ...

  8. python中异常处理--raise的使用

    https://www.cnblogs.com/zhangyin6985/p/7229553.html 当程序出现错误,python会自动引发异常,也可以通过raise显示地引发异常.一旦执行了rai ...

  9. learning docker steps(3) ----- docker services 初次体验

    参考:https://docs.docker.com/get-started/part3/#docker-composeyml docker 的 service样例, 我们可以理解成是一个本地负载均衡 ...

  10. [译].Net 4.5 的五项强大新特性

    本文原文:Five Great .NET Framework 4.5 Features 译者:冰河魔法师 目录 介绍 特性一:async和await 特性二:Zip压缩 特性三:正则表达式执行超时 特 ...