__stdcall大佬的讲解

这里贴的代码写的是点修改、区间查询的题。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define LL long long
  5. #define rg register
  6. #define N 2000010
  7. #define mid ((l+r)>>1)
  8. using namespace std;
  9. int n,m,cnt,tot,ans[N];
  10. struct rec{
  11. int pos,val,type;
  12. //对于修改操作,val表示增量,对于查询操作,val表示它是第几个询问;
  13. //type为0表示修改,1表示区间左端点(开),2表示区间右端点
  14. bool operator<(const rec&x)const{return pos==x.pos?type<x.type:pos<x.pos;}
  15. }a[N],tmp[N];
  16. inline int read(){
  17. int k=,f=; char c=getchar();
  18. while(c<''||c>'')c=='-'&&(f=-),c=getchar();
  19. while(''<=c&&c<='')k=k*+c-'',c=getchar();
  20. return k*f;
  21. }
  22. void cdq(int l,int r){
  23. if(l>=r) return;
  24. cdq(l,mid),cdq(mid+,r);
  25. LL sum=; int p1=l,p2=mid+,cnt=;
  26. while(p1<=mid&&p2<=r){
  27. if(a[p1]<a[p2]){
  28. if(!a[p1].type) sum+=a[p1].val; tmp[++cnt]=a[p1++];
  29. }
  30. else{
  31. if(a[p2].type==) ans[a[p2].val]-=sum;
  32. else if(a[p2].type==) ans[a[p2].val]+=sum;
  33. tmp[++cnt]=a[p2++];
  34. }
  35. }
  36. for(rg int i=p1;i<=mid;i++) tmp[++cnt]=a[i];
  37. for(rg int i=p2;i<=r;i++){
  38. if(a[i].type==) ans[a[i].val]-=sum;
  39. else if(a[i].type==) ans[a[i].val]+=sum;
  40. tmp[++cnt]=a[i];
  41. }
  42. for(rg int i=l;i<=r;i++) a[i]=tmp[i-l+];
  43. }
  44. int main(){
  45. n=read(); m=read();
  46. for(rg int i=;i<=n;i++) a[++tot]=(rec){i,read(),};
  47. for(rg int i=;i<=m;i++){
  48. int opt=read(),x=read(),y=read();
  49. if(opt==) a[++tot]=(rec){x,y,};
  50. else a[++tot]=(rec){x-,++cnt,},a[++tot]=(rec){y,cnt,};
  51. }
  52. cdq(,tot);
  53. for(rg int i=;i<=cnt;i++) printf("%d\n",ans[i]);
  54. }

【模板】CDQ分治的更多相关文章

  1. [模板] CDQ分治&&BZOJ3262:陌上花开

    简介 CDQ分治是分治的一种, 可以看做归并排序的扩展, 利用离线将一些 \(O(n)\) 的暴力优化到 \(O(log n)\). 它可以用来顶替一些高级(log)数据结构等. 一般地, CDQ分治 ...

  2. BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)

    题目链接 BZOJ3262 洛谷P3810 /* 5904kb 872ms 对于相邻x,y,z相同的元素要进行去重,并记录次数算入贡献(它们之间产生的答案是一样的,但不去重会..) */ #inclu ...

  3. bryce1010专题训练——CDQ分治

    Bryce1010模板 CDQ分治 1.与普通分治的区别 普通分治中,每一个子问题只解决它本身(可以说是封闭的) 分治中,对于划分出来的两个子问题,前一个子问题用来解决后一个子问题而不是它本身 2.试 ...

  4. 【洛谷4721】【模板】分治FFT(CDQ分治_NTT)

    题目: 洛谷 4721 分析: 我觉得这个 "分治 FFT " 不能算一种特殊的 FFT ,只是 CDQ 分治里套了个用 FFT (或 NTT)计算的过程,二者是并列关系而不是偏正 ...

  5. P3810 【模板】三维偏序(陌上花开)cdq分治

    传送门:https://www.luogu.org/problemnew/show/P3810 cdq分治的模板题,第一层外部排序,第二层cdq归并排序,这个时候不用考虑第一次的顺序,第三次用树状数组 ...

  6. P3810 【模板】三维偏序(陌上花开)(CDQ分治)

    题目背景 这是一道模板题 可以使用bitset,CDQ分治,K-DTree等方式解决. 题目描述 有 nn 个元素,第 ii 个元素有 a_iai​.b_ibi​.c_ici​ 三个属性,设 f(i) ...

  7. CDQ 分治算法模板

    CDQ分治 1.三维偏序问题:三维偏序(陌上花开) #include<bits/stdc++.h> #define RG register #define IL inline #defin ...

  8. CDQ分治嵌套模板:多维偏序问题

    CDQ分治2 CDQ套CDQ:四维偏序问题 题目来源:COGS 2479 偏序 #define LEFT 0 #define RIGHT 1 struct Node{int a,b,c,d,bg;}; ...

  9. 洛谷.3374.[模板]树状数组1(CDQ分治)

    题目链接 简易CDQ分治教程 //每个操作分解为一个有序数对(t,p),即(时间,操作位置),时间默认有序,用CDQ分治处理第二维 //对于位置相同的操作 修改优先于查询 //时间是默认有序的 所以可 ...

  10. P3810 【模板】三维偏序(陌上花开)(cdq分治)

    思路 看到这种偏序类的题目,而且不要求强制在线,可以立刻想到cdq分治 注意这题有一个问题,就是询问的是小于等于而不是小于,如果相等的话两个元素会相互贡献,而cdq的特点是右区间不能对左边有影响,所以 ...

随机推荐

  1. Github配置SSH连接

    安装git.exe,打开Git Bash 1.检查是否已经有SSH Key. $cd /.ssh 2.生成一个新的SSH. $ ssh-keygen -t rsa -C "email@git ...

  2. Lightoj 1038 - Race to 1 Again (概率DP)

    题目链接: Lightoj  1038 - Race to 1 Again 题目描述: 给出一个数D,每次可以选择数D的一个因子,用数D除上这个因子得到一个新的数D,为数D变为1的操作次数的期望为多少 ...

  3. bryce1010专题训练——树状数组

    Bryce1010模板 1.一维树状数组 https://vjudge.net/contest/239647#problem/A[HDU1556] #include<bits/stdc++.h& ...

  4. Chef and Graph Queries CodeChef - GERALD07

    https://vjudge.net/problem/CodeChef-GERALD07 可以用莫队+带撤销并查集做 错误记录: 1.调试时数组开小了,忘了改大就交了 2.88行和91行少了备份num ...

  5. 分享一个实用任意路数PWM函数

    一.什么是PWM? 1.科普一下什么是PWM,嘿嘿,莫闲啰嗦,好好看看,可能大多数人听过,但可能没详细了解过,至此不妨花费几分钟,详细了解哈,PWM中文译名为:脉冲宽度调制,即控制电路在输出频率不变的 ...

  6. C# 修改DataTable 列的 DataType

    /// <summary> ///当DataTable中有值时,是不允许修改列的DataType /// 修改数据表DataTable某一列的数据类型和记录值 /// </summa ...

  7. SQL系列函数——字符串函数

    1.charindex函数用来寻找一个指定的字符(串)在另一个字符串中的起始位置,返回一个整数,没找到就返回0. select CHARINDEX('SQL','Microsoft SQL SERVE ...

  8. [BZOJ1050][HAOI2006]旅行comf 枚举+并查集

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1050 将边排序,枚举边权最小的边,依次加边直到S和T连通,更新答案. #include&l ...

  9. 【学习笔记】using namespace std 的作用

    C++编程时几乎每次都敲上using namespace std;但这行代码究竟有什么作用呢? C++标准程序库中的所有标识符都被定义于一个名为std的namespace中. 早些的编码将标准库功能定 ...

  10. mysql单向自动同步

    mysql自动同步 以下教程均使用mysql自带的自动同步功能 全库单向自动同步 本例把192.168.3.45上名称为ewater_main的数据库自动同步到192.168.3.68的ewater_ ...