南通网站建设服务罗永浩做的网站
南通网站建设服务,罗永浩做的网站,html后台网站模板,wordpress$.getjson(所谓整体二分#xff0c;就是对整体进行二分 #xff08;逃#xff09;
前言
又是一个狂艹树套树的小清新分治算法 但是树套树不需要动脑啊 整体二分有一些比较重要的条件#xff1a;
修改对判定答案的贡献互相独立#xff0c;修改之间互不影响效果修改如果对判定答案有… 所谓整体二分就是对整体进行二分 逃
前言
又是一个狂艹树套树的小清新分治算法 但是树套树不需要动脑啊 整体二分有一些比较重要的条件
修改对判定答案的贡献互相独立修改之间互不影响效果修改如果对判定答案有贡献则贡献为一确定的与判定标准无关的值贡献满足交换律结合律具有可加性允许离线
解析
作为一个偏思想的轻算法流程较为易于理解 为了方便阐述直接以动态区间第k大为例个人感觉那些抽象的流程总结并没有一个示例有效
我们可以把所有的信息都看作顺次进行的操作 操作分为修改和查询 而修改又分为插入和删除 比如一开始给出的数列相当于n次插入 每次修改值就等价于一次删除和一次插入
考虑一个递归分治函数solve(l,r,ql,qr) 表示答案区间在 (l,r) 处理的操作区间是 (ql,qr) 首先如果 qlqr没有需要操作的区间了直接返回 若 lr说明答案已经确定记录答案并返回
否则二分一个答案为 mid
对于所有修改若其不超过 mid就在树状数组上对应位置1并把操作归于左区间 否则把操作归于右区间
对于所有查询 (l,r,) 的第 k 大若树状数组 (l,r) 的和大于 k 就归于左区间否则把 k 减去树状数组里的数并归到右区间
最后把所有的树状数组修改撤销并向两个区间递归即可
递归结构是一棵深度为log值域的满的二叉树再加上树状数组的复杂度总复杂度 O(nlogwlogn)O(nlogwlogn)O(nlogwlogn)
代码
#includebits/stdc.h
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
const int N4e5100;
const int mod1e97;
inline ll read(){ll x(0),f(1);char cgetchar();while(!isdigit(c)){if(c-)f-1;cgetchar();}while(isdigit(c)){x(x1)(x3)c-0;cgetchar();}return x*f;
}
int n,m;
int f[N];
inline void add(int p,int w){for(;pn;pp-p) f[p]w;return;
}
inline int ask(int p){int res(0);for(;p;p-p-p) resf[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(qlqr) return;if(lr){for(int iql;iqr;i){if(q[i].op2) ans[q[i].id]l;}return;}int mid(lr)1,n1(0),n2(0);for(int iql;iqr;i){if(q[i].op1){if(q[i].xmid) add(q[i].id,q[i].y),q1[n1]q[i];else q2[n2]q[i];}else{int wask(q[i].y)-ask(q[i].x-1);if(wq[i].k) q1[n1]q[i];else{q[i].k-w;q2[n2]q[i];}}}for(int i1;in1;i){if(q1[i].op1) add(q1[i].id,-q1[i].y);}for(int i1;in1;i) q[qli-1]q1[i];for(int i1;in2;i) q[qln1i-1]q2[i];solve(l,mid,ql,qln1-1);solve(mid1,r,qln1,qr);return;
}
int tot,cnt;
int a[N];
signed main() {
#ifndef ONLINE_JUDGE//freopen(a.in,r,stdin);//freopen(a.out,w,stdout);
#endifnread();mread();for(int i1;in;i) q[tot](ope){a[i](int)read(),1,i,0,1};for(int i1;im;i){char c;scanf( %c,c);if(cQ){q[tot](ope){(int)read(),(int)read(),cnt,(int)read(),2};}else{int plread(),valread();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 i1;icnt;i) printf(%d\n,ans[i]);return 0;
}
/*
21
abcaaaaabbcbacbabcbcb*/
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88746.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!