模板:整体二分

所谓整体二分,就是对整体进行二分

(逃)

前言

又是一个狂艹树套树的小清新分治算法
但是树套树不需要动脑啊
整体二分有一些比较重要的条件:

  1. 修改对判定答案的贡献互相独立,修改之间互不影响效果
  2. 修改如果对判定答案有贡献,则贡献为一确定的与判定标准无关的值
  3. 贡献满足交换律结合律,具有可加性
  4. 允许离线

解析

作为一个偏思想的轻算法,流程较为易于理解
为了方便阐述,直接以动态区间第k大为例(个人感觉那些抽象的流程总结并没有一个示例有效)

我们可以把所有的信息都看作顺次进行的操作
操作分为修改和查询
而修改又分为插入和删除
比如,一开始给出的数列相当于n次插入
每次修改值就等价于一次删除和一次插入

考虑一个递归分治函数:solve(l,r,ql,qr)
表示答案区间在 (l,r) ,处理的操作区间是 (ql,qr)
首先,如果 ql>qr,没有需要操作的区间了,直接返回
若 l=r,说明答案已经确定,记录答案并返回

否则,二分一个答案为 mid

对于所有修改,若其不超过 mid,就在树状数组上对应位置+1并把操作归于左区间
否则把操作归于右区间

对于所有查询 (l,r,) 的第 k 大,若树状数组 (l,r) 的和大于 k ,就归于左区间,否则把 k 减去树状数组里的数,并归到右区间

最后,把所有的树状数组修改撤销,并向两个区间递归即可

递归结构是一棵深度为(log值域)的满的二叉树,再加上树状数组的复杂度,总复杂度 O(nlogwlogn)O(nlogwlogn)O(nlogwlogn)

代码

#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=4e5+100;
const int mod=1e9+7;
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;
int f[N];
inline void add(int p,int w){for(;p<=n;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;
}
struct ope{int x,y,id,k,op;
}q[N],q1[N],q2[N];
int ans[N];
void solve(int l,int r,int ql,int qr){//printf("(%d %d) (%d %d)\n",l,r,ql,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)>>1,n1(0),n2(0);for(int i=ql;i<=qr;i++){if(q[i].op==1){if(q[i].x<=mid) add(q[i].id,q[i].y),q1[++n1]=q[i];else q2[++n2]=q[i];}else{int w=ask(q[i].y)-ask(q[i].x-1);if(w>=q[i].k) q1[++n1]=q[i];else{q[i].k-=w;q2[++n2]=q[i];}}}for(int i=1;i<=n1;i++){if(q1[i].op==1) add(q1[i].id,-q1[i].y);}for(int i=1;i<=n1;i++) q[ql+i-1]=q1[i];for(int i=1;i<=n2;i++) q[ql+n1+i-1]=q2[i];solve(l,mid,ql,ql+n1-1);solve(mid+1,r,ql+n1,qr);return;
}
int tot,cnt;
int a[N];
signed 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++) q[++tot]=(ope){a[i]=(int)read(),1,i,0,1};for(int i=1;i<=m;i++){char c;scanf(" %c",&c);if(c=='Q'){q[++tot]=(ope){(int)read(),(int)read(),++cnt,(int)read(),2};}else{int pl=read(),val=read();q[++tot]=(ope){a[pl],-1,pl,0,1};q[++tot]=(ope){val,1,pl,0,1};a[pl]=val;}}solve(-1e9,1e9,1,tot);for(int i=1;i<=cnt;i++) printf("%d\n",ans[i]);return 0;
}
/*
21
abcaaaaabbcbacbabcbcb*/

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

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

相关文章

JavaWeb --第二章 Tomact详情

JavaWeb --第二章 Tomact详情 文章目录Tomcat安装TomcatTomcat启动和配置配置发布一个web网站Tomcat 安装Tomcat 去官方下载 https://tomcat.apache.org Tomcat启动和配置 文件夹作用&#xff1a; 启动/关闭 Tomcat&#xff1a; 文件夹bin/startup.bat 开启 网址&#x…

P8352-[SDOI/SXOI2022]小N的独立集【dp套dp】

正题 题目链接:https://www.luogu.com.cn/problem/P8352 题目大意 给出一棵树&#xff0c;每个点的权值是[1,k][1,k][1,k]之间的一个数&#xff0c;对于i∈[1,nk]i\in[1,nk]i∈[1,nk]求令这棵树的最大独立集权值为iii的方案数。 1≤n≤1000,1≤k≤51\leq n\leq 1000,1\leq k\…

开源的类似于Apache ab的压力测试命令行工具SuperBenchmarker

SuperBenchmarker 是ㄧ个开源的类似于Apache ab的压力测试命令行工具。可以在 .NET 4.52 或者 .NET Core 2.0 平台上运行。可支持Get、Post、Put、Delete这些调用方式&#xff0c;调用时能指定Concurrent user、Request数、Header template…等。可以从Github、Chocolatey这两种…

CodeForces:643(VK cup)

文章目录前言CF643A Bear and ColorsDescription\text{Description}DescriptionSolution\text{Solution}SolutionDescription\text{Description}DescriptionCF643B Bear and Two PathsDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}…

一二三系列之优先队列、st表——Battle,Heapsort,A Magic Lamp

文章目录BattleHeapsortA Magic LampBattle source 如果怪兽先死&#xff0c;那么英雄血量不足也没关系 反悔贪心 每次都先杀怪兽再说&#xff0c;如果血量不够了&#xff0c;就倒回去从怪兽打出伤害由高到低反悔&#xff0c;选择抵御或者加血&#xff0c;肯定哪个加的更多…

JavaWeb --第三章 HTTP协议详解

JavaWeb --第三章 HTTP协议详解 Http 什么是HTTP HTTP&#xff1a; 超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上。 文本&#xff1a;html&#xff0c;字符串&#xff0c…

AT2382-[AGC015D]A or...or B Problem

正题 题目链接:https://www.luogu.com.cn/problem/AT2382 题目大意 询问在[L,R][L,R][L,R]中选取一个或多个数&#xff0c;将它们按位或后能得到多少种不同的结果。 1≤L≤R<2601\leq L\leq R<2^{60}1≤L≤R<260 解题思路 我们先把高位的LLL和RRR都有的111都删除&a…

数据结构一【树状数组】普通、二维、离线树状数组的(单点修改,单点查询,区间修改,区间查询)模板及应用例题总结

文章目录树状数组lowbit线段树与树状数组单点修改区间查询区间修改区间求和二维树状数组离线树状数组例题POJ&#xff1a;starsMooFest[SDOI2009]HH的项链Turing TreeCounting SequencesZip-line树状数组 用于快速高效的计算与前缀和相关的信息 lowbit int lowbit( int i ) …

如何优雅的利用Windows服务来部署ASP.NET Core程序

上一篇文章中我给大家讲述了五种部署ASP.NET Core网站的方法&#xff0c;其中有一种方式是通过Windows服务来进行部署&#xff0c;这样既可以做到开启自启动&#xff0c;又不会因为iis的反向代理而损失部分性能。但是美中不足的是需要借助第三方软件nssm来进行&#xff0c;那么…

JavaWeb --第四章Maven详解

JavaWeb --第四章Maven详解 文章目录MavenMaven架构管理工具下载安装Maven配置环境变量阿里云镜像本地仓库在IDEA中使用Maven创建一个普通的Maven项目在IDEA中标记文件夹功能在IDEA中配置tomcatpom文件IDEA操作解决遇到的问题Maven 为什么要学这个技术&#xff1f; 在javaweb…

P3242 [HNOI2015] 接水果(整体二分、扫描线、dfs序)

解析 一道有点毒瘤的题 也是一道感觉真的可以出现在考场上的很综合的题 做的还可以 除了一开始把盘子和水果看反白写了各树套树之外 为什么盘子是水果的子路径啊 由于是做专题爬过来的多次询问区间第k小&#xff0c;想到整体二分 那么重点就是子路径的判定问题 发现&#xff…

UOJ#748-[UNR #6]机器人表演【dp】

正题 题目链接:https://uoj.ac/problem/748 题目大意 有一个长度为nnn的010101序列&#xff0c;然后ttt次插入一个000和一个111&#xff0c;要求000在111前面&#xff0c;求最终能得到多少种本质不同的串。 1≤n,t≤3001\leq n,t\leq 3001≤n,t≤300 解题思路 我们考虑一个n…

夯实基础项目工程之图论——Uncle Bogdan and Country Happiness,Graph Coloring,How Many Paths?,Array Differentiation

文章目录做题情况项目报告Uncle Bogdan and Country HappinessGraph ColoringHow Many Paths?Array Differentiation做题情况项目报告 T1,T3T1,T3T1,T3一眼题&#xff0c;在实现上&#xff0c;T3T3T3耗时略长&#xff08;有些情况未考虑到位&#xff09; T4T4T4感觉题&#xf…

Codeforces Round #716 (Div. 2)

Codeforces Round #716 (Div. 2) CodeForces 1514 题号题目知识点难度APerfectly Imperfect ArrayBAND 0, Sum BigCProduct 1 Modulo NDCut and StickEBaby Ehab’s Hyper Apartment

用StyleCop规范团队代码

前言编码风格&#xff0c;每个人都是有不同的特点&#xff0c;风格各异&#xff0c;而且一个人在不同的时期&#xff0c;编码风格的差异也可能是非常大的&#xff0c;好比学生时代&#xff0c;刚工作的时候&#xff0c;工作一段时间后等。在一个团队中&#xff0c;或一个项目中…

CodeForces:103(div1)104(div2)

文章目录前言CF104A BlackjackDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF103A Testing Pants for SadnessDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF103B CthulhuDe…

UOJ#749-[UNR #6]稳健型选手【贪心,分治,主席树】

正题 题目链接:https://uoj.ac/problem/749 题目大意 如果有序列aaa&#xff0c;你每次取走一个数字后然后这个序列最前面的数字会被别人取走&#xff0c;直到序列为空。此时f(a)f(a)f(a)表示你最大能取走的权值和。 给出一个长度为nnn的序列aaa&#xff0c;qqq次询问区间[l…

A. And Then There Were K

A. And Then There Were K 题意&#xff1a; 给你一个n&#xff0c;让你求一个k&#xff0c;使得满足下列式子&#xff1a; n & (n-1) & (n-2) &…&(k) 0 问k最小是多少&#xff1f; 题解&#xff1a; 找规律 比如n的二进制为&#xff1a;1111 那么n-1就是…

一键发布部署vs插件[AntDeploy],让net开发者更幸福

一键发布工具(ant deploy tool)插件下载地址&#xff1a;https://marketplace.visualstudio.com/items?itemNamenainaigu.AntDeploy1.iis一键发布自动部署 (iis deploy support)支持netcore 和 netframework发布 (支持mvc webapi)支持website自动创建ps:需要在windows 服务器上…

数据结构二之线段树Ⅰ——Count Color,Hotel,Transformation,Tree Generator™

普通的下标线段树Count ColorHotelTransformationTree Generator™Count Color POJ2777 查询区间内颜色种类数&#xff0c;观察到颜色种类数只有30&#xff0c;完全可以状压成整型存储&#xff0c;没有必要开30棵线段树 区间内有这颜色就置为111&#xff0c;没有这个颜色就是…