整体二分

news/2026/1/24 15:34:36/文章来源:https://www.cnblogs.com/MeltingPot/p/19526641

整体二分

搞完这个专题就要开dp和数学了,诶诶

前言

整体二分是一种离线处理时间轴的技术,对于特定问题可以做到 \(O(n\log^2 n)\) 复杂度(假设 \(n\) \(V\) 同阶),可惜常规写法复杂度有点大,不过经过优化常数较小。

简单分析一下思路,这类问题一般是将”操作/询问“离线处理,然后对答案二分(这就要求了答案具有某种单调性质),每层计算左区间答案所产生的贡献,以贡献为标准将“操作/询问”分类进入左右区间,最后类似于 \(CDQ\) 分治递归得到子答案。

接下来以几道题为例:

P3834 【模板】可持久化线段树 2

虽说是可持久化线段树的例题,但是我们不妨用整体二分来考虑一下:

我们记录数据下标,以权值为关键字排序,再离线询问,接着二分离散值域,每层计算贡献将询问分类,具体而言,就是从小到大对离散权值单点加,再对询问区间查询,如果满足当前询问排名,归入左区间进一步缩小范围,如果满足询问排名就进入右区间进一步缩小范围。最后记住消除当前层的贡献。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
int n,q;
int ans[N];
namespace BIT{#define lowbit(x) (x&(-x))int t[N];void add(int pos,int v){for(int i=pos;i<=N-10;i+=lowbit(i)) t[i]+=v;}int query(int pos){int res(0);for(int i=pos;i;i-=lowbit(i))res+=t[i];return res;}
}
struct Node{int l,r,k,pos;
}opt[N],lset[N],rset[N];
struct Point{int val,pos;bool operator<(const Point A)const{return val^A.val?val<A.val:pos<A.pos;}
}a[N];
void sol(int ql,int qr,int vl,int vr){if(ql>qr) return;if(vl==vr){for(int i=ql;i<=qr;++i) ans[opt[i].pos]=a[vl].val;return;}int mid((vl+vr)>>1),lz(0),rz(0);for(int i=vl;i<=mid;++i) BIT::add(a[i].pos,1);for(int i=ql;i<=qr;++i){int sas(BIT::query(opt[i].r)-BIT::query(opt[i].l-1));if(sas>=opt[i].k) lset[++lz]=opt[i];else opt[i].k-=sas,rset[++rz]=opt[i];}for(int i=1;i<=lz;++i) opt[ql+i-1]=lset[i];for(int i=1;i<=rz;++i) opt[ql+lz+i-1]=rset[i];for(int i=vl;i<=mid;++i) BIT::add(a[i].pos,-1);sol(ql,ql+lz-1,vl,mid);sol(ql+lz,qr,mid+1,vr);
}
signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>q;for(int i=1;i<=n;++i){cin>>a[i].val;a[i].pos=i;}for(int i=1;i<=q;++i){cin>>opt[i].l>>opt[i].r>>opt[i].k;opt[i].pos=i;}sort(a+1,a+n+1);sol(1,q,1,n);for(int i=1;i<=n;++i) cout<<ans[i]<<endl;}

显然对于静态区间第 \(k\) 小,这样的复杂度我们无法接受,我们来思考一下究竟是哪里造成了复杂度的浪费:每次对于序列状态的暴力刷新,因此我们考虑使用双指针维护这个前缀,可以消去一个 \(\log\)不过这还是整体二分吗)。

P2617 Dynamic Rankings

区间带修改第 \(k\) 小。让我们来想想经典的主席树做法,为了维护“主席树前缀和”,我们使用了树状数组管理根节点,这是因为主席树本身就维护了一种”前缀和“,但是在这里我们显然不用考虑这些,因为我们在原始写法中本身就牺牲了一个 \(\log\) 的复杂度来离线处理单点,所以在操作时直接穿插询问和修改即可。

发现修改操作可以直接理解为从原数列中删去一个数再添加一个数,那么把操作放在二分过程中即可实现动态操作。

#include<bits/stdc++.h>
#define N 200001
#define lowbit(x) (x&(-x))
using namespace std;
int n,m,M,M2;
int a[N],ls[N<<1],siz,ans[N<<1],op2[N<<1];
int t[N<<1];
struct Q{int op,l,r,k,x,y,id;
}q[N<<1],q1[N<<1],q2[N<<1];
void upd(int x,int y){for(int i=x;i<=siz;i+=lowbit(i)) t[i]+=y;
}
int que(int x){int sum=0;for(int i=x;i>=1;i-=lowbit(i)) sum+=t[i];return sum;
}
void solve(int l,int r,int ql,int qr){if(ql>qr) return;if(l==r){for(int i=ql;i<=qr;i++)if(q[i].op==2) ans[q[i].id]=l;return;        }int mid=(l+r)/2,L=0,R=0;for(int i=ql;i<=qr;i++){if(!q[i].op){if(q[i].y<=mid) L++,q1[L]=q[i],upd(q[i].x,1);else R++,q2[R]=q[i];}else if(q[i].op==1){if(q[i].y<=mid) L++,q1[L]=q[i],upd(q[i].x,-1);else R++,q2[R]=q[i];}else{int nw=que(q[i].r)-que(q[i].l-1);if(nw>=q[i].k) L++,q1[L]=q[i];else R++,q2[R]=q[i],q2[R].k-= nw;}}for(int i=ql;i<=qr;i++){if(q[i].op==0&&q[i].y<=mid) upd(q[i].x,-1);if(q[i].op==1&&q[i].y<=mid) upd(q[i].x,1);}int i=ql;for(int j=1;j<=L;i++,j++) q[i]=q1[j];for(int j=1;j<=R;i++,j++) q[i]=q2[j];solve(l,mid,ql,ql+L-1),solve(mid+1,r,ql+L,qr);
}
int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];ls[++siz]=a[i];q[++M].id=M,q[M].op=0;q[M].x=i,q[M].y=a[i];}int l,r,k,x,y;char op;for(int i=1;i<=m;i++){cin>>op;if(op=='C'){cin>>x>>y;ls[++siz]=y;q[++M].op=1,q[M].x=x,q[M].y=a[x];q[++M].op=0,q[M].x=x;q[M].y=y,a[x]=y;}else{cin>>l>>r>>k;q[++M].op=2;q[M].id=++M2,q[M].l=l;q[M].r=r,q[M].k=k;}}sort(ls+1,ls+siz+1);siz=unique(ls+1,ls+siz+1)-ls-1;for(int i=1;i<=M;i++) if(!q[i].op||q[i].op) q[i].y=lower_bound(ls+1,ls+siz+1,q[i].y)-ls;solve(1,siz,1,M);for(int i=1;i<=M2;i++) cout<<ls[ans[i]]<<endl;
}

P1527 [国家集训队] 矩阵乘法

把树状数组换成二维的即可,几乎没有什么区别。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10;
int n,q,m;
int ans[N];
namespace BIT{#define lowbit(x) (x&(-x))const int M=550;int t[M][M];void add(int posx,int posy,int v){for(int i=posx;i<=M-10;i+=lowbit(i)) for(int j=posy;j<=M-10;j+=lowbit(j))t[i][j]+=v;}int query(int posx,int posy){int res(0);for(int i=posx;i;i-=lowbit(i))for(int j=posy;j;j-=lowbit(j))res+=t[i][j];return res;}int qry(int x1,int y1,int x2,int y2){int s1,s2,s3,s4;s1=query(x2,y2),s2=query(x1-1,y1-1);s3=query(x1-1,y2),s4=query(x2,y1-1);return s1-s3-s4+s2;}
}
struct Node{int x1,y1,x2,y2,k,pos;
}opt[N],lset[N],rset[N];
struct Point{int val,posx,posy;bool operator<(const Point A)const{return val<A.val;}
}a[N];
void sol(int ql,int qr,int vl,int vr){if(ql>qr) return;if(vl==vr){for(int i=ql;i<=qr;++i) ans[opt[i].pos]=a[vl].val;return;}int mid((vl+vr)>>1),lz(0),rz(0);for(int i=vl;i<=mid;++i)BIT::add(a[i].posx,a[i].posy,1);for(int i=ql;i<=qr;++i){int sas=BIT::qry(opt[i].x1,opt[i].y1,opt[i].x2,opt[i].y2);if(sas>=opt[i].k) lset[++lz]=opt[i];else opt[i].k-=sas,rset[++rz]=opt[i];}for(int i=1;i<=lz;++i) opt[ql+i-1]=lset[i];for(int i=1;i<=rz;++i) opt[ql+i+lz-1]=rset[i];for(int i=vl;i<=mid;++i) BIT::add(a[i].posx,a[i].posy,-1);sol(ql,ql+lz-1,vl,mid);sol(ql+lz,qr,mid+1,vr);
}
signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>q;for(int i=1;i<=n;++i){for(int j=1;j<=n;++j){cin>>a[++m].val;a[m].posx=i;a[m].posy=j;}}for(int i=1;i<=q;++i){cin>>opt[i].x1>>opt[i].y1>>opt[i].x2>>opt[i].y2>>opt[i].k;opt[i].pos=i;}sort(a+1,a+m+1);sol(1,q,1,m);for(int i=1;i<=q;++i) cout<<ans[i]<<endl;
}

P3527 [POI 2011] MET-Meteors

首先经典的操作,二倍扩充环的长度破环成链,二分时间轴,也就是陨石,我们注意到这里每场陨石会对序列产生一个区间加值的操作。同时每层对国家进行分类,而每个国家应对其管辖的单点进行查询,因此治理需要一个维护区间加值,单点查询的数据结构,这里选用差分树状数组。整体时间复杂度 \(O(n\log^2 n)\)

当然还有一些细节,比如存在无法达成目标的国家,所以我们提前创造一个保证可以达成目标的“超级陨石雨”,利用其进行可行性判断即可。其次,别忘记对链上的两个节点同时查询之和才是环上节点的真实数值。

#include<bits/stdc++.h>
#define int unsigned long long
#define inf LLONG_MAX
using namespace std;
const int N=6e5+10;
int n,m,k;
int ans[N];
int head[N],nxt[N],to[N];
struct Eve{int l,r,a,pos;
}e[N];
struct Con{int cnt,pos;
}con[N],lset[N],rset[N];
namespace BIT{#define lowbit(x) (x&(-x))int t[N];void add(int pos,int v){for(int i=pos;i<=N-10;i+=lowbit(i)) t[i]+=v;}int query(int pos){int res(0);for(int i=pos;i;i-=lowbit(i)) res+=t[i];return res;}
}
void add(int u,int v){to[++to[0]]=v,nxt[to[0]]=head[u],head[u]=to[0];
}
void sol(int ql,int qr,int vl,int vr){if(ql>qr) return;if(vl==vr){for(int i=ql;i<=qr;++i)ans[con[i].pos]=e[vl].pos;return;}int mid((vl+vr)>>1),lz(0),rz(0);for(int i=vl;i<=mid;++i){BIT::add(e[i].l,e[i].a);BIT::add(e[i].r+1,-e[i].a);}for(int i=ql;i<=qr;++i){int sas(0);for(int j=head[con[i].pos];j;j=nxt[j]){sas+=BIT::query(to[j]);sas+=BIT::query(to[j]+m);}if(sas>=con[i].cnt) lset[++lz]=con[i];else con[i].cnt-=sas,rset[++rz]=con[i];}for(int i=1;i<=lz;++i) con[ql+i-1]=lset[i];for(int i=1;i<=rz;++i) con[ql+i+lz-1]=rset[i];for(int i=vl;i<=mid;++i){BIT::add(e[i].l,-e[i].a);BIT::add(e[i].r+1,e[i].a);}sol(ql,ql+lz-1,vl,mid);sol(ql+lz,qr,mid+1,vr);
}
signed main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>n>>m;for(int i=1,o;i<=m;++i)cin>>o,add(o,i);for(int i=1;i<=n;++i)cin>>con[i].cnt,con[i].pos=i;cin>>k;for(int i=1;i<=k;++i){cin>>e[i].l>>e[i].r>>e[i].a;if(e[i].l>e[i].r) e[i].r+=m;e[i].pos=i;}e[k+1]={1,m<<1,inf,k+1};sol(1,n,1,k+1);for(int i=1;i<=n;++i){if(ans[i]==k+1) cout<<"NIE"<<endl;else cout<<ans[i]<<endl;}
}

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

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

相关文章

权威榜单|2026 雅思网课口碑排名推荐 直播课高效备考技巧拆解

本次测评由中国教育评估协会联合英国文化教育协会(BC)授权测评团队开展,依据《2026雅思培训服务质量规范》,覆盖46个城市175个区县,结合24000+考生及家长实测反馈、198家雅思网课机构全维度考核结果,形成这份兼具…

说说灭菌过滤器国产品牌,哪个比较靠谱?

2026年工业制造领域高质量发展提速,压缩空气净化与气体提纯设备已成为保障生产安全、提升产品品质的核心支撑。无论是满足食品医药行业严苛要求的灭菌过滤器国产品牌,还是适配多粉尘环境的高效除尘过滤器国产品牌,抑…

酸奶杯制造商哪家做工好,雄县普联成是优选

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆酸奶杯制造企业,围绕酸奶杯厂哪家品质好、酸奶杯制造商哪家做工好、酸奶杯供应企业哪家做工好三大核心需求,为餐饮、乳制品、烘焙等行业企业选型提供客观…

RustFS MCP server 介绍

RustFS MCP&#xff0c;这是一个高性能的 模型上下文协议 (Model Context Protocol, MCP) 服务器。 核心功能与目的: 桥梁作用: RustFS MCP 充当 AI 助手&#xff08;如 Claude Desktop&#xff09;和 S3 兼容对象存储服务&#xff08;如 RustFS、MinIO 等&#xff09;之间的桥…

RustFS Docker 部署指南 (SNSD)

RustFS Docker 安装指南 (SNSD) 本篇博文博主将详细介绍如何使用 Docker 在单节点单磁盘 (Single Node Single Disk, SNSD) 模式下安装和部署 RustFS。 概述: RustFS 定义: 一个高性能、100% S3 兼容的开源分布式对象存储系统。SNSD 模式: 单节点单磁盘部署模式。其后端不使…

探讨郑州西点烘焙培训学校,新东方培训学校费用多少钱?

随着西式烘焙行业的快速发展,越来越多对甜品制作感兴趣的人开始寻找专业的学习渠道,学西点烘焙哪家专业专业的西点烘焙学校也成了不少人搜索的高频问题。本文将围绕这些问题展开问答,帮助大家清晰了解如何选择合适的…

分析浙江灌装机生产商哪家好,筛选优质之选

2026年食品饮料制造业持续升级,灌装机作为生产链路的核心装备,其适配性、精度与稳定性直接决定企业的产能效率、原料成本与品控水平。无论是初创水厂的小批量灵活生产、中型饮料厂的多品类快速换产,还是大型企业的规…

专业的玻璃温室供应商怎么选择?

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家标杆企业,为农业生产者选型提供客观依据,助力精准匹配适配的温室工程服务伙伴。 TOP1 推荐:青州市冠丰温室园艺工程有限公司 推荐指数:★★★★★ | 口碑评…

AI科学家Kosmos:数小时完成数月科研,引发行业热议

人工智能能够处理大量数据&#xff0c;但它能做科学吗&#xff1f;一种AI科学家可以独立工作数小时&#xff0c;完成人类需要数月才能完成的研究&#xff0c;并且据其创造者称&#xff0c;已经在科学领域做出了多项“新颖贡献”&#xff0c;但其他人对此则更加怀疑。 该系统名…

Type-C 140W一拖二,双接EPR扩展功率分配

在笔记本、平板、智能手机成为生活刚需的今天&#xff0c;“充电焦虑” 已成为用户普遍痛点&#xff1a;传统单口线材无法满足多设备并行需求&#xff0c;普通一拖二线材又深陷功率分配失衡、快充效率打折的瓶颈。在此背景下&#xff0c;支持 USB PD3.1 协议的 140W 一拖二快充…

图的概念

图论: 图:点用边连起来叫做图 严格说,图是数据结构,定义为:graph=(V,E) V是一个非空有限集合,代表节点,E代表边集(V非空,意味着图中最少有1个节点,但是E可以空,说明图可以没有边) 有向图:图的边有方向,只…

2026长春市雅思网课一对一权威测评排行榜:优质提分方案深度解析

在雅思备考赛道中,长春市朝阳区、南关区、二道区等核心区县的考生,正普遍面临雅思培训选课迷茫、优质教育机构甄别困难的核心痛点。多数考生渴望通过靠谱的网课一对一模式实现高分提分,却受困于缺乏权威的口碑排名参…

供应链进销存源码uniapp全开源ERP多仓库管理系统pc+app手机端 - 教程

供应链进销存源码uniapp全开源ERP多仓库管理系统pc+app手机端 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &qu…

四川电梯广告市场洞察:口碑公司助力品牌升级,机场广告/影院广告/电梯广告/社区门禁广告/高铁广告,电梯广告价格口碑推荐

随着城市化进程加速与消费场景多元化,电梯广告凭借其高频次、强触达的特性,成为品牌抢占社区消费场景的核心媒介。尤其在四川市场,电梯广告已从单一展示向场景化、数字化方向演进。本文基于市场调研与公开数据,梳理…

2026长春市雅思培训补习班权威测评排行榜:优质机构深度解析,精准匹配高分提分方案

在雅思考试热度持续攀升的2026年,长春地区雅思考生数量同比增长显著,但多数考生深陷备考困境:基础差异悬殊难以匹配个性化方案,面对鱼龙混杂的教育机构陷入选课迷茫,盲目堆砌技巧却忽视体系化提分,难以精准判断优…

2026长春市雅思一对一培训深度测评排行榜:优质机构精选与提分指南

在雅思培训的备考赛道上,长春市考生常陷入多重困境:基础差异显著却难寻个性化方案,教育机构鱼龙混杂导致选课迷茫,盲目跟风技巧学习却忽视体系化提分,优质机构的性价比难以精准判断。雅思考试的严谨性决定了考生必…

长春市全国雅思培训排行:2026权威深度测评,优质提分机构精选

在雅思培训热潮席卷长春的当下,众多考生却深陷选课困境:基础差异显著难以匹配个性化方案,市面上教育机构鱼龙混杂导致选择迷茫,盲目跟风技巧学习却忽视体系化提分,优质机构的性价比难以精准判断。雅思考试的严谨性…

2026长春雅思培训机构权威测评排行榜:优质提分方案深度解析

在雅思备考热潮中,长春考生普遍面临诸多困境:选课迷茫不知如何筛选靠谱教育机构,考试中口语卡顿、写作逻辑断层等问题频发,缺乏优质个性化提分技巧,难以找到性价比与提分效果兼具的实用方案。据权威调研数据显示,…

郑州实力强的蛋糕培训机构靠谱吗?新东方培训学校口碑不错

问题1:想学习蛋糕制作,怎么选到靠谱的蛋糕培训学院?有什么关键判断标准吗? 选择蛋糕培训学院,核心要看实操落地性、师资专业性、创就业保障三个维度,避免踩理论多实操少、设备老旧、结业不管就业的坑。首先看实操…

2026年新东方烹饪学校专业排名,靠谱的烹饪培训别错过

在餐饮行业蓬勃发展的当下,专业烹饪技能已成为就业创业的核心竞争力。面对市场上鱼龙混杂的烹饪培训选择,许多人会疑惑:新东方烹饪学校专业不专业?新东方烹饪的培训模式怎么样?新东方餐饮培训怎么样?下面结合行业…