题目链接

动态区间第k小,但是这道题的话用主席树+树状数组套线段树的空间复杂度是O(nlog2n)会爆掉。

另一种替代的方法是用树状数组套平衡树,空间复杂度降到了O(nlogn),但我感觉平衡树是个挺恶心的东西,而且时间复杂度是O(nlog3n),比主席树还多了个logn。

最高效的方法是用一个叫整体二分的东西算法,它的基本思想是这样的:

假设当前所有查询的答案范围都在[l,r]之间,设mid=(l+r)/2,那么我们只处理所有修改后的值在[l,mid]中的修改操作,把不需要执行的修改操作全部扔到后半区间,那么对于每个询问操作都可以知道它的答案是在[l,mid]之间还是(mid+1,r]之间,这样就把所有的询问划分到了两个独立的区间,然后递归处理即可。本质上是将原序列转化成01序列,这样处理起来就方便多了。与CDQ分治较为类似,是个很神奇的算法。

空间复杂度O(n),时间复杂度O(nlog2n)

 #include<bits/stdc++.h>

 using namespace std;
const int inf=0x3f3f3f3f;
const int N=1e5+;
struct QR {
int f,l,r,k,u,x,dx;
} qr[N<<]; int a[N],c[N],b[N<<],lq[N<<],rq[N<<],nq,tot,ans[N],n,m;
int lowbit(int x) {return x&-x;}
void add(int u,int x) {
for(; u<=n; u+=lowbit(u))c[u]+=x;
}
int query(int u) {
int ret=;
for(; u; u-=lowbit(u))ret+=c[u];
return ret;
} void solve(int l,int r,int L,int R) {
if(L>R)return;
if(l==r) {
for(int i=L; i<=R; ++i)if(qr[b[i]].f)ans[qr[b[i]].u]=l;
return;
}
int nl=,nr=,mid=(l+r)>>;
for(int i=L; i<=R; ++i) {
if(!qr[b[i]].f) {
if(qr[b[i]].x<=mid)add(qr[b[i]].u,qr[b[i]].dx),lq[nl++]=b[i];
else rq[nr++]=b[i];
} else {
int t=query(qr[b[i]].r)-query(qr[b[i]].l-);
if(qr[b[i]].k<=t)lq[nl++]=b[i];
else qr[b[i]].k-=t,rq[nr++]=b[i];
}
}
for(int i=; i<nl; ++i)if(!qr[lq[i]].f)add(qr[lq[i]].u,-qr[lq[i]].dx);
for(int i=; i<nl; ++i)b[L+i]=lq[i];
for(int i=; i<nr; ++i)b[L+nl+i]=rq[i];
solve(l,mid,L,L+nl-);
solve(mid+,r,L+nl,R);
} int main() {
while(scanf("%d",&n)==) {
nq=tot=;
memset(c,,sizeof c);
int maxn=;
for(int i=; i<=n; ++i) {
scanf("%d",&a[i]);
maxn=max(maxn,a[i]);
qr[nq++]=(QR) {,,,,i,a[i],};
}
scanf("%d",&m);
while(m--) {
int f;
scanf("%d",&f);
if(f==) {
int u,x;
scanf("%d%d",&u,&x);
qr[nq++]=(QR) {,,,,u,a[u],-};
qr[nq++]=(QR) {,,,,u,a[u]=x,};
maxn=max(maxn,a[u]);
} else {
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
qr[nq++]=(QR) {,l,r,k,tot++,,};
}
}
for(int i=; i<nq; ++i)b[i]=i;
solve(,maxn,,nq-);
for(int i=; i<tot; ++i)printf("%d\n",ans[i]);
}
return ;
}

最新文章

  1. 火狐和IE浏览器的兼容问题汇总
  2. HDU 2059 龟兔赛跑
  3. Datazen 自定义地图--中国地图
  4. PHP-Phalcon框架中的数据库操作
  5. 洛谷 P1169 [ZJOI2007]棋盘制作
  6. 嵌入式系统关机/Embeded System PowerOff HowTo?
  7. [九度OJ]1137.浮点数加法
  8. 接口中的成员变量必须是static
  9. linux File Handling commands &#39;ls&#39;.
  10. 【基础教程】推荐10+必备的 WordPress 常用插件
  11. linux虚拟主机管理系统wdcp系列教程之三
  12. 点击显示子菜单,离开隐藏子菜单(onmouseout下包含a标签的js解决方法)
  13. oracle复制表数据,复制表结构
  14. Http学习之使用HttpURLConnection发送post和get请求(3)
  15. vue px 转rem
  16. Hexo server报错TypeError: Cannot read property &#39;utcOffset&#39; of null解决方法
  17. Windows 10 IoT Serials 11 – 如何设置微软认知服务中EndPoint
  18. java类文件
  19. centos适用的国内yum源:网易、搜狐
  20. python3内存存储几种数据类型对差异

热门文章

  1. django-admin 登录之后显示页面,表是否显示
  2. JAVA学习笔记----【转】 java.toString() ,(String),String.valueOf的区别
  3. python中的标识符长度能有多长
  4. LDAP注入
  5. iOS JS 和 OC交互 / JS 和 native 相互调用
  6. matlab 读取nc
  7. php token 生成
  8. 建议37:按需选择sort或sorted
  9. SOA 面向服务架构 阅读笔记(三)
  10. 跨平台移动开发 Xuijs超轻量级的框架+Emile CSS动画