待我玩会游戏整理下思绪(分明是想摸鱼

cdq分治是一种用于降维和处理对不同子区间有贡献的离线分治算法

对于常见的操作查询题目而言,时间总是有序的,而cdq分治则是耗费\(O(logq)\)的代价使动态操作化为静态查询问题(the world!

考虑无修改的求逆序对问题

每个元素可定义为\((pos_i,val_i)\),求对每个\((pos_i,val_i)\)有多少个\((pos_j,val_j)\),满足\(pos_j<pos_i,val_j>val_i\)

cdq分治的过程就是令其中一维有序(pos),计算出贡献消除该维度的影响,后面对已遍历的元素只需得知\(val\)的关系即可

因此对于归并过程的merge中假设\([l,mid]\)和\([mid+1,r]\)的子区间已经统计完,保证了两个子区间分别有序,那只需再求左子区间对右子区间的贡献即可

比如左子区间中的下标\(p\)和右子区间中的下标\(q\)满足\(val_p>val_q\),那么可以得出\(val_{[p...mid]}>val_q\),左区间对于右区间中的\(q\)的贡献为\(mid-p+1\),统计完后继续维护大区间的有序并pushup即可

而对于有修改(既存在时间变量)的操作,我们需要维护左子区间的修改对右区间查询的影响(因为对于分治,左区间存在是右区间存在的前提),对于查询则需要标记时间的维度\(ansid\)

注意如果\(p\)和\(q\)优先越界的处理上的不同

以及区间查询时一分为二的做法


练手题 Luogu - P3374

题意:m次操作,单点更新,区间查询

我们把原数组的初始值当作插入修改来处理,时间复杂度\(O((m+n)log(m+n))\)

#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define print(a) printf("%lld",(ll)(a))
#define printbk(a) printf("%lld ",(ll)(a))
#define println(a) printf("%lld\n",(ll)(a))
using namespace std;
const int MAXN = 1.5e6+11;
typedef long long ll;
const ll MOD = 1e9+7;
const ll INF = 1ll<<60;
unsigned int SEED = 19260817;
ll read(){ll x=0,f=1;register char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}struct QUERY{int pos,val,type;bool operator < (const QUERY &rhs) const{if(pos!=rhs.pos) return pos<rhs.pos;return type<rhs.type;}
}Q[MAXN],tmp[MAXN];
ll ans[MAXN];
void solve(int l,int r){if(l==r)return;int mid=l+r>>1;solve(l,mid);solve(mid+1,r);int p=l,q=mid+1,cnt=0;ll sum=0;while(p<=mid&&q<=r){if(Q[p]<Q[q]){if(Q[p].type==1) sum+=Q[p].val;tmp[++cnt]=Q[p++];}else{if(Q[q].type==2) ans[Q[q].val]-=sum;if(Q[q].type==3) ans[Q[q].val]+=sum;tmp[++cnt]=Q[q++];}}while(p<=mid) tmp[++cnt]=Q[p++];while(q<=r){if(Q[q].type==2) ans[Q[q].val]-=sum;if(Q[q].type==3) ans[Q[q].val]+=sum;tmp[++cnt]=Q[q++];}rep(i,1,cnt) Q[i+l-1]=tmp[i];
}
int main(){int m,n;while(cin>>n>>m){int cnt=0,ansid=0;rep(i,1,n){Q[++cnt].pos=i;Q[cnt].val=read();Q[cnt].type=1;}rep(i,1,m){int op=read();if(op==1){Q[++cnt].pos=read();Q[cnt].val=read();Q[cnt].type=1;}else{int l=read();int r=read();Q[++cnt].pos=l-1;Q[cnt].val=++ansid;Q[cnt].type=2;Q[++cnt].pos=r;Q[cnt].val=ansid;Q[cnt].type=3;}}solve(1,cnt);rep(i,1,ansid) println(ans[i]);}return 0;
}

转载于:https://www.cnblogs.com/caturra/p/9387626.html

[摸鱼]cdq分治 学习笔记相关推荐

  1. cdq分治 学习笔记

    什么是 c d q cdq cdq 分治 一种很优美的分治,具体来说,我们解决 [ l , r ] [l,r] [l,r] 这个,跟普通的分治大体思路一样,也是先分治 [ l , m i d ] [l ...

  2. CDQ分治——学习笔记

    前言 因为中国集训队的大佬们总会发明一些新的东西,所以中国的计算机竞赛水平才会一直处于国际前沿,而cdq分治也是某一年的集训队成员发明的算法. 什么是CDQ分治 cdq分治是一种分治(这不是废话嘛), ...

  3. CDQ分治学习及例题总结

    文章目录 1.**使用cdq分治的条件:** 2.**cdq分治的性质:** 3. **cdq使用步骤:** 4.**自己对cdq分治学习的一些感悟:** 5. cdq分治的详细讲解(转自[stdca ...

  4. 小鱼鱼的 Python 学习笔记(第一周)

    前言:百无聊赖之下,小鱼鱼开始学习Python , 并且尝试做一定的输出,整理和回顾所学知识.学习资源为慕课上北京理工大学嵩天老师极其团队讲授的课程,博文内容基本为上课所学的再现. ~~ 这是一条正经 ...

  5. 边分治学习笔记(bzoj2870)

    如果点分治的话,那个取最小点权操作很难合并,不过树可以点分治,那自然也可以边分治.我们每次找到一条边,使得删掉这条边后的两个连通块中最大的那个的大小尽可能小,然后处理经过这条边的路径信息-- 桥豆麻袋 ...

  6. 2022年,前端er们都在看哪些网站?(含面试、接活、学习、摸鱼等)

    关注公众号 前端开发博客,领27本电子书 回复加群,自助秒进前端群 众所周知,前端内卷严重, 没办法,很多前端人真的就是被迫 day day up (),好在呢,互联网时代,知识满天飞, 想学还是很容 ...

  7. 曝光,程序员的 10 个摸鱼神器

    问:程序员该不该上班摸鱼? 答:认真上班是劳动换取报酬,上班摸鱼才是从老板那赚钱. 曝光,程序员的 10 个摸鱼神器 摸鱼一时爽,一直摸一直爽 方案一:实物摸鱼 方案二:命令行斗地主 方案三:假装系统 ...

  8. 2022年5月20日最全摸鱼游戏导航

    ?? 个人网站:[海拥][摸鱼小游戏][开发文档导航] ?? 风趣幽默的人工智能学习网站:??人工智能 ?? 想寻找共同学习交流的小伙伴,请点击[全栈技术交流群] ?? 免费且实用的计算机相关知识题库 ...

  9. 曝光,程序员大佬们的的 10 个摸鱼神器

    问:程序员该不该上班摸鱼? 答:认真上班是劳动换取报酬,上班摸鱼才是从老板那赚钱. 摸鱼一时爽,一直摸一直爽 虽说摸鱼舒服,但是摸得不好,很容易 摸鱼一时爽,没有年终奖. 那如何高级的摸鱼呢? 方案一 ...

最新文章

  1. 第二批重磅嘉宾已就位,邀你共探AI行业新机遇 | MEET2022智能未来大会
  2. 利用注解 + 反射消除重复代码(Java项目)
  3. Ubuntu18.04深度学习环境配置(简易方式)
  4. JVM源码分析之javaagent原理完全解读
  5. JVM体系结构101:了解您的虚拟机
  6. 前端学习(2767):下拉刷新的学习
  7. 在springboot中一些框架和插件的配置
  8. 机器学习降维之主成分分析
  9. JSP的九种内置对象
  10. comsol频域模拟
  11. Guava Joiner
  12. 软件工程师为什么单身的六宗罪
  13. 【办公基本软件】万彩办公大师教程丨PDF压缩工具
  14. 天猫用户重复购买预测之特征工程
  15. 数据库基础 之 “视图”
  16. 高校实验室仪器设备管理系统/实验室管理系统
  17. Java语言编写简单分数计算器
  18. iPhoneX(刘海屏)适配
  19. Java反序列化之反射机制
  20. matlab毕达哥拉斯质数,毕达哥拉斯质数

热门文章

  1. javascript笔记整理(对象基础)
  2. 学习:SQL Server的BUILTIN\Administrators用户
  3. .NET混淆器 Dotfuscator如何保护应用程序?控制流了解一下!
  4. js 日期星期 带农历
  5. WPF自定义控件与样式(1)-矢量字体图标(iconfont)
  6. Linux命令-目录处理命令:mkdir
  7. Web Service实现分布式服务的基本原理
  8. Linux 下的多线程下载工具
  9. 计算机科学数学理论浅谈 (转载)
  10. 数据结构与算法--1.整型变量值互换