模板:CDQ分治

文章目录

  • 前言
    • upd
  • 例题
    • P3810 【模板】三维偏序(陌上花开)
    • P2487 [SDOI2011]拦截导弹

所谓CDQ分治,就是和由Conprour、Doctorjellyfish、QE添一同发明的分治算法

(逃)

前言

神奇的乱搞黑科技
CDQ分治能够通过更小的时间常数和更简单的代码难度完爆一些大算法,如树套树、splay凸包等。
应用条件:询问离线,修改独立

upd

from KHIN:
归并排序的时候可以直接调用 c++98 中的 inplace_merge(l,mid,r,cmp)
表示把 [l,mid)[mid,r) 的有序数组按照 cmp 排序。

例题

P3810 【模板】三维偏序(陌上花开)

有n个元素,每个元素有三个特征值,元素a大于元素b当且仅当a的三个特征值都大于等于b
设 f(i) 表示a大于的元素数量(不含自己),对于每一个 i ,求出 f(x)=i 的 x 的数目
n≤2×105n\le 2\times10^5n2×105

CDQ分治的经典套路:先递归求左右内部贡献,再求左右对互相的贡献
先按照x排序,然后每次合并的时候两边分别按照y排序,利用双指针维护树状数组累加答案即可
时间复杂度O(nlog⁡2n)O(n\log^2n)O(nlog2n)
细节上,注意完全相同的元素需要特殊处理,树状数组不要忘记清空

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=2e5+100;
const int mod=998244353;
inline ll read() {ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m,k;
struct node{int a,b,c,id,w;
}p[N],P[N];
bool cmpa(node u,node v){if(u.a!=v.a) return u.a<v.a;else if(u.b!=v.b) return u.b<v.b;return u.c<v.c;
}	
bool cmpb(node u,node v){if(u.b!=v.b) return u.b<v.b;else return u.c<v.c;
}int f[N];
inline void add(int p,int w){for(;p<=m;p+=p&-p) f[p]+=w;return;
}
inline int ask(int p){int res(0);for(;p;p-=p&-p) res+=f[p];return res;
}int ans[N],bac[N];
void solve(int l,int r){if(l==r) return;int mid=(l+r)>>1;solve(l,mid);solve(mid+1,r);//printf("\nsolve:(%d %d)\n",l,r);sort(p+l,p+mid+1,cmpb);sort(p+mid+1,p+r+1,cmpb);int pl=l;for(int i=mid+1;i<=r;i++){while(pl<=mid&&p[pl].b<=p[i].b){add(p[pl].c,p[pl].w);//printf("  add: (%d %d %d) w=%d\n",p[pl].a,p[pl].b,p[pl].c,p[pl].w);++pl;}ans[p[i].id]+=ask(p[i].c);//printf("  query: (%d %d %d) add=%d\n",p[i].a,p[i].b,p[i].c,ask(p[i].c));}for(int i=l;i<pl;i++) add(p[i].c,-p[i].w);return;
}
int main(){
#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);
#endifn=read();m=read();for(int i=1;i<=n;i++){P[i]=(node){(int)read(),(int)read(),(int)read()};}sort(P+1,P+1+n,cmpa);int tot(0);for(int i=1;i<=n;i++){if(i>1&&P[i-1].a==P[i].a&&P[i-1].b==P[i].b&&P[i-1].c==P[i].c) p[tot].w++;else{p[++tot]=P[i];p[tot].w=1;p[tot].id=tot;}}swap(tot,n);solve(1,n);for(int i=1;i<=n;i++){bac[ans[p[i].id]+p[i].w-1]+=p[i].w;//printf("(%d %d %d) ans=%d\n",p[i].a,p[i].b,p[i].c,ans[p[i].id]);}for(int i=0;i<tot;i++) printf("%d\n",bac[i]);return 0;
}
/*
*/

P2487 [SDOI2011]拦截导弹

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度、并且能够拦截任意速度的导弹,但是以后每一发炮弹都不能高于前一发的高度,其拦截的导弹的飞行速度也不能大于前一发。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
在不能拦截所有的导弹的情况下,我们当然要选择使国家损失最小、也就是拦截导弹的数量最多的方案。但是拦截导弹数量的最多的方案有可能有多个,如果有多个最优方案,那么我们会随机选取一个作为最终的拦截导弹行动蓝图。
我方间谍已经获取了所有敌军导弹的高度和速度,你的任务是计算出在执行上述决策时,每枚导弹被拦截掉的概率。

利用CDQ分治优化1D-1D的DP
先递归处理出左半区间的dp值,然后尝试用左半区间的dp值更新右半区间,再递归处理右半区间
利用树状数组维护前/后缀最大值保证复杂度
时间复杂度O(nlog⁡2n)O(n\log^2n)O(nlog2n)
注意:在递归处理右半区间之前,需要先按照下标重新sort一下使右半区间重新变得有序

#include<bits/stdc++.h>
using namespace std;
#define ll __int128
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N=2e5+100;
const int mod=1e9;
inline ll read() {ll x(0),f(1);char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}int n,m,k;
int q[N],cnt;
struct node{int a,b,id;bool operator < (const node o){return a>o.a;}
}p[N];
bool cmp(node u,node v){return u.id<v.id;
}
struct Dp{int val;ll num;
}dp1[N],dp2[N];
void operator += (Dp &a,Dp b){if(b.val>a.val) a=b;else if(b.val==a.val) a.num+=b.num;return;
}Dp f[N];
inline void Upd(int p,Dp w){for(;p<=cnt;p+=p&-p) f[p]+=w;return;
}
inline Dp Ask(int p){Dp res=(Dp){0,0};for(;p;p-=p&-p) res+=f[p];return res;
}
inline void Clear(int p){for(;p<=cnt;p+=p&-p) f[p]=(Dp){0,0};return;
}
void solve2(int l,int r){if(l==r){++dp2[l].val;return;}int mid=(l+r)>>1;solve2(mid+1,r);//printf("\nsolve: (%d %d)\n",l,r);sort(p+l,p+mid+1);sort(p+mid+1,p+r+1);int pl=r;for(int i=mid;i>=l;i--){while(pl>mid&&p[pl].a<=p[i].a){Upd(p[pl].b,dp2[p[pl].id]);//printf("  add: i=%d DP:(%d %d)\n",p[pl].id,dp2[pl].val,(int)dp2[pl].num);--pl;}dp2[p[i].id]+=Ask(p[i].b);//printf("  update: i=%d DP:(%d %d)\n",p[i].id,dp2[i].val,(int)dp2[i].num);}for(int i=r;i>pl;i--) Clear(p[i].b);sort(p+l,p+mid+1,cmp);solve2(l,mid);return;
}inline void upd(int p,Dp w){p=cnt-p+1;for(;p<=cnt;p+=p&-p) f[p]+=w;return;
}
inline Dp ask(int p){p=cnt-p+1;Dp res=(Dp){0,0};for(;p;p-=p&-p) res+=f[p];return res;
}
inline void clear(int p){p=cnt-p+1;for(;p<=cnt;p+=p&-p) f[p]=(Dp){0,0};return;
}
void solve1(int l,int r){if(l==r){++dp1[l].val;return;}int mid=(l+r)>>1;solve1(l,mid);sort(p+l,p+mid+1);sort(p+mid+1,p+r+1);//printf("\nsolve: (%d %d)\n",l,r);int pl=l;for(int i=mid+1;i<=r;i++){while(pl<=mid&&p[pl].a>=p[i].a){upd(p[pl].b,dp1[p[pl].id]);++pl;//printf("  add: i=%d DP:(%d %d)\n",p[i].id,dp1[i].val,(int)dp1[i].num);}dp1[p[i].id]+=ask(p[i].b);//printf("  update: i=%d DP:(%d %d)\n",p[i].id,dp1[i].val,(int)dp1[i].num);}for(int i=l;i<pl;i++) clear(p[i].b);sort(p+mid+1,p+r+1,cmp);solve1(mid+1,r);return;
}int main(){
#ifndef ONLINE_JUDGE//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);
#endifn=read();for(int i=1;i<=n;i++){p[i].a=read();p[i].b=read();p[i].id=i;dp1[i].num=dp2[i].num=1;q[++cnt]=p[i].a;q[++cnt]=p[i].b;}sort(q+1,q+1+cnt);cnt=unique(q+1,q+1+cnt)-q-1;for(int i=1;i<=n;i++){p[i].a=lower_bound(q+1,q+1+cnt,p[i].a)-q;p[i].b=lower_bound(q+1,q+1+cnt,p[i].b)-q;}solve1(1,n);sort(p+1,p+1+n,cmp);solve2(1,n);ll sum=0;int ans(0);for(int i=1;i<=n;i++){if(dp1[i].val>ans){ans=dp1[i].val;sum=dp1[i].num;}else if(dp1[i].val==ans){sum+=dp1[i].num;}}printf("%d\n",ans);for(int i=1;i<=n;i++){//printf("i=%d dp1=(%d %d) dp2=(%d %d)\n",i,dp1[i].val,(int)dp1[i].num,dp2[i].val,(int)dp2[i].num);if(dp1[i].val+dp2[i].val-1==ans){printf("%.5lf ",1.0*dp1[i].num*dp2[i].num/sum);}else printf("0.00000 ");}return 0;
}
/*
10
23 7
63 14
84 57
40 74
96 79
20 27
48 37
86 70
66 28
86 47
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NET CORE微服务一条龙应用】第二章 配置中心使用

背景系列目录&#xff1a;【NET CORE微服务一条龙应用】开始篇与目录在分布式或者微服务系统里&#xff0c;通过配置文件来管理配置内容&#xff0c;是一件比较令人痛苦的事情&#xff0c;再谨慎也有湿鞋的时候&#xff0c;这就是在项目架构发展的过程中&#xff0c;配置中心存…

D - ABC Conjecture Gym - 102798D

D - ABC Conjecture Gym - 102798D 题意&#xff1a; 规定rad(n)n的所有质因子的乘积 给你一个c&#xff0c;问能否构造a和b使得abc且rad(abc)<c 题解&#xff1a; 先说结论&#xff0c;如果c可以拆分出两个一样的质因子&#xff0c;则能构造a和b 即 np1a1 * p2a2 . . .…

P7560-[JOISC 2021 Day1]フードコート【吉司机线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P7560 题目大意 有nnn个队列&#xff0c;要求支持操作&#xff1a; 往[L,R][L,R][L,R]的队列中插入kkk个ccc。出队[L,R][L,R][L,R]中的kkk个元素。&#xff08;如果不足kkk个就全部出队&#xff09;求第aaa个队列中的第bbb个…

“幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】

刘德华 有一首歌叫《马桶》&#xff0c;其中有一句歌词是&#xff1a;每一个马桶都是英雄。EFCore也有一个英雄&#xff0c;在幕后默默地任劳任怨。它就叫 "支持字段" (Backing Fields):中文版&#xff1a;https://docs.microsoft.com/zh-cn/ef/core/modeling/backin…

P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治、暴力)

解析 之前用KDtree做的一道题 由于懒不想再码一遍了 考虑CDQ分治 关键就是如何拿掉绝对值 如果只维护左下角的&#xff0c;显然就是一个经典的三维偏序问题了 但是本题不一定在左下角&#xff0c;也可能在左上、右下、右上 怎么办&#xff1f; 把坐标翻转翻转直接暴力做四遍即…

数论练习二之BSGS算法——随机数生成器,Matrix,Lunar New Year and a Recursive Sequence,Fermat‘s Last Theorem

[SDOI2013] 随机数生成器 description solution 肯定是非常想找一个通项公式来表示第nnn个数的 依据形式&#xff0c;考虑化成等比数列 xi1ka(xik)a⋅xibt⇒kba−1x_{i1}ka(x_ik)ax_ibt\Rightarrow k\frac{b}{a-1}xi1​ka(xi​k)a⋅xi​bt⇒ka−1b​ ⇒xiba−1ai−1(x1ba−…

L - Clock Master Gym - 102798L

L - Clock Master Gym - 102798L 题意&#xff1a; 给定一个数字n&#xff0c;令na1a2a3…求lcm(a1,a2,a3,…)的最大值,以loge(x)的形式输出 题解&#xff1a; lcm要求尽可能大&#xff0c;我们就要保证a1,a2,a3…尽可能为质数或质数的整数次幂&#xff0c;我们假设a1是p1x…

P7739-[NOI2021]密码箱【Splay,矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/P7739 题目描述 懒得概括&#xff0c;摸了。 Yelekastee 是 U 国著名的考古学家。在最近的一次考古行动中&#xff0c;他发掘出了一个远古时期的密码箱。经过周密而严谨的考证&#xff0c;Yelekastee 得知密码箱的密码和某一…

NetCore下模拟和使用Modbus工业通信协议

Tips&#xff1a;1、目前NetCore下与Modbus通信的框架主要选择了 Modbus.Net https://github.com/parallelbgls/Modbus.Net2、modbus是常用的工业通信协议&#xff0c;在软件调试时可以通过modbus pollslave模拟通信通过达到调试目的&#xff0c;下图是我使用软件1&#xff09…

codeforces:65

文章目录前言CF65A Harry Potter and Three SpellsDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF65B Harry Potter and the History of MagicDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\…

C - Rencontre Gym - 102798C

C - Rencontre Gym - 102798C 参考题解&#xff1a; 参考一 参考二 题意&#xff1a; 有一棵树&#xff0c;树上的点分为三种&#xff0c;&#xff08;一个点可以为多种&#xff09;&#xff0c;现在分别在三种点中随机选一点a&#xff0c;b&#xff0c;c&#xff0c;然后找到…

API标准化成为技术团队面临的最大挑战

调查表明&#xff0c;API 标准化成为了技术团队面临的最大挑战。SmartBear 发布了 2019 年 API 状态报告“The State of API 2019”&#xff0c;此报告旨在为 API 行业建立关于软件团队在 2019 年规划、设计、开发、测试、记录和监控 API 的方法、实践和工具的基准。此次调查有…

线性代数五之高斯消元——[SDOI2010]外星千足虫,[HNOI2013]游走,[HNOI2011]XOR和路径,[hdu 4035]Maze

多类型高斯消元杂题[SDOI2010]外星千足虫descriptionsolutioncode[HNOI2013]游走descriptionsolutioncode[HNOI2011]XOR和路径descriptionsolutioncodeMaze(树上高斯消元)problemsolutioncode[SDOI2010]外星千足虫 description solution 高斯消元的模板题 虽然感觉问了个最…

P6117-[JOI 2019 Final]コイン集め【贪心】

正题 题目链接:https://www.luogu.com.cn/problem/P6117 题目大意 平面上有2n2n2n的硬币&#xff0c;要给每个硬币匹配一个x∈[1,n],y∈[1,2]x\in[1,n],y\in[1,2]x∈[1,n],y∈[1,2]的位置&#xff08;不能重复&#xff09;。 使得所有硬币和它们匹配位置的曼哈顿距离之和最小…

CF788789(div1div2)

文章目录前言CF789A Anastasia and pebblesDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF789B Masha and geometric depressionDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}Cod…

【HDU-2376】Average distance

【HDU-2376】Average distance 题意&#xff1a; 给你一个树&#xff0c;求树上任意两个点之间的距离的平均值 题解&#xff1a; 就是求出任意两点之间的距离和然后除以边数 ”任意两点之间的距离“ 和怎么算&#xff1f; 我们去考虑边的贡献情况&#xff1a; 对于边(u,v)&…

Ocelot 资源汇总

前言最近一两年.NET Core的关注度持续上升, 微服务及云原生应用开发上采用.NET Core也越来越多&#xff0c;Ocelot 作为.NET Core平台下一款开源的API 网关开发库越来越得到社区的认可&#xff0c;应用到生产中的案例也有好几百了。春节抽空整理了现有网上公开的Ocelot相关的资…

P6698-[BalticOI 2020 Day2]病毒【AC自动机,dp,SPFA】

正题 题目链接:https://www.luogu.com.cn/problem/P6698 题目大意 有一个包含0∼G−10\sim G-10∼G−1的字符集&#xff0c;其中有nnn种变换&#xff0c;能够将一个字符ai(ai>1)a_i(a_i>1)ai​(ai​>1)变为一串字符bib_ibi​&#xff0c;当一个字符串中只剩下000和1…

[TJOI2017]城市(未解决)

[TJOI2017]城市 题意&#xff1a; 一棵树&#xff0c;现在要求你将一条边改变他的位置&#xff0c;&#xff08;即改变左右所连接的端点&#xff0c;权值不变&#xff09;&#xff0c;修改后任意两点相互可达&#xff0c;且使得两个点之间的最大交通费用最小 题解: 有O(n^2…

数论三之组合数学Ⅰ-Max-Min Sums,Binomial Coefficient is Fun,Strivore,Bubble Sort,放棋子,LOJ6671,Iroha and a Grid

组合计数我最爱Max-Min SumsdescriptionsolutioncodeBinomial Coefficient is FundescriptionsolutioncodeStrivoredescriptionsolutioncodeBubble Sortdescriptionsolutioncode[HAOI2016]放棋子descriptionsolutioncodeEntropyIncreaser 与 MinecraftdescriptionsolutioncodeD…