题目传送门(权限题)

一道类似的非权限题

题意

N个数的序列,每次修改一个数或者询问区间里的第K小。可以离线。

简要做法

假如要求在线,可以树状数组套个线段树~

但是这题是可以离线的,就可以乱搞整体二分啦~

非常好写好调。(图文无关)

细节

  • 可以把一个修改拆成+1和-1两个操作
  • 数组要开到30000左右,如果初始数组也当做操作的话

代码

#include <bits/stdc++.h>
#define TR(x) cerr<<#x<<'='<<x<<endl
using namespace std;
const int MAXN=30005, INF=0x3f3f3f3f;
void rd(int &x){
x=0; int ch=getchar();
while(ch<'0'||'9'<ch) ch=getchar();
while('0'<=ch&&ch<='9') x=x*10+ch-'0', ch=getchar();
}
int N, M, nq;
int A[MAXN], c[MAXN], id[MAXN], q1[MAXN], q2[MAXN], ans[MAXN];
void add(int x, int k){for(;x<=N;x+=x&-x)c[x]+=k;}
int sum(int x){int r=0;for(;x;x-=x&-x)r+=c[x];return r;}
struct Qry{
int t,a,b,k;
Qry(int t,int a,int b,int k):t(t),a(a),b(b),k(k){}
Qry(){}
}Q[MAXN];
void solve(int *a, int n, int l, int r){
if(!n) return;
if(l==r){
for(int i=0; i<n; ++i) ans[a[i]]=l;
return;
}
int mid=(l+r)>>1, n1=0, n2=0;
for(int i=0; i<n; ++i){
Qry &q=Q[a[i]];
if(q.t==0){
if(q.b<=mid) add(q.a,q.k),q1[n1++]=a[i];
else q2[n2++]=a[i];
}else{
int t=sum(q.b)-sum(q.a-1);
if(q.k<=t) q1[n1++]=a[i];
else q.k-=t,q2[n2++]=a[i];
}
}
for(int i=0; i<n; ++i){
Qry &q=Q[a[i]];
if(q.t==0&&q.b<=mid) add(q.a,-q.k);
}
memcpy(a,q1,sizeof(int)*n1);
memcpy(a+n1,q2,sizeof(int)*n2);
solve(a,n1,l,mid);
solve(a+n1,n2,mid+1,r);
}
int main(){
rd(N),rd(M);
for(int i=1; i<=N; ++i) rd(A[i]),Q[nq++]=Qry(0,i,A[i],1);
for(int i=1; i<=M; ++i){
char o[3]; scanf("%s",o);
int a,b,k;
if(o[0]=='Q'){
rd(a),rd(b),rd(k);
Q[nq++]=Qry(1,a,b,k);
}else{
rd(a),rd(k);
Q[nq++]=Qry(0,a,A[a],-1);
Q[nq++]=Qry(0,a,A[a]=k,1);
}
}
for(int i=0; i<nq; ++i) id[i]=i;
solve(id,nq,0,INF);
for(int i=0; i<nq; ++i)if(Q[i].t)printf("%d\n",ans[i]);
return 0;
}

【题解】BZOJ 1901: Zju2112 Dynamic Rankings的更多相关文章

  1. Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6321  Solved: 2628[Su ...

  2. bzoj 1901: Zju2112 Dynamic Rankings(树套树)

    1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...

  3. BZOJ 1901 Zju2112 Dynamic Rankings

    树阵主席设置树.维护间隔动态K大. .. ZOJ到空间太小,太大,仅仅能到BZOJ上交 1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memor ...

  4. BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7143  Solved: 2968[Su ...

  5. Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6471  Solved: 2697[Su ...

  6. BZOJ 1901: Zju2112 Dynamic Rankings( 树状数组套主席树 )

    裸的带修改主席树.. 之前用BIT套Splay( http://www.cnblogs.com/JSZX11556/p/4625552.html )A过..但是还是线段树好写...而且快(常数比平衡树 ...

  7. BZOJ 1901: Zju2112 Dynamic Rankings( BIT 套 BST )

    BIT 套 splay 其实也是不难...每个 BIT 的结点保存一颗 splay , 询问就二分答案然后判断rank... ------------------------------------- ...

  8. bzoj 1901: Zju2112 Dynamic Rankings -- 主席树,树状数组,哈希

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...

  9. BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树

    [题目分析] BZOJ这个题目抄的挺霸气. 主席树是第一时间想到的,但是修改又很麻烦. 看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树. 学到了新的姿势,2333o(* ̄▽ ̄*)ブ [代 ...

随机推荐

  1. 使用Arduino驱动基于ST7533芯片的TFT屏

    在合宙通信买了一个1.8寸的TFT屏,驱动芯片是ST7533,本来打算使用Air800直接驱动,但由于其他原因,放弃了.于是尝试使用arduino驱动,为了屏幕刷新速度更快,采用硬件SPI. 硬件连接 ...

  2. springboot项目的创建

    创建springboot项目 包名和项目名 选择需要使用的框架,web 然后再点击下一步,完成即可创建springboot项目

  3. Windows下多线程编程(二)

    线程的分类 1.     有消息循环线程 MFC中有用户界面线程,从CWinThread派生出一个新的类作为UI线程类CUIThread,然后调用AfxBeginthread(RUNTIME_CLAS ...

  4. hdu 6183 Color it (线段树 动态开点)

    Do you like painting? Little D doesn't like painting, especially messy color paintings. Now Little B ...

  5. MT【181】横穿四象限

    设函数$f(x)=\dfrac{1}{x-a}-\dfrac{\lambda}{x-2}$,其中$a,\lambda\in R$记$A_1=\{(x,y)|x>0,y>0\},A_2=\{ ...

  6. 【转】spi测试自发自收(中断通信方式)

    1.初始化spi时钟 void spiRccinit(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); RCC_APB2Peri ...

  7. bzoj3920: Yuuna的礼物(莫队+分块套分块)

    思路挺简单的,但是总感觉好难写...码力还是差劲,最后写出来也挺丑的 这题显然是个莫队题,考虑怎么转移和询问... 根据莫队修改多查询少的特点,一般用修改快查询慢的分块来维护.查第$k_1$小的出现次 ...

  8. 【洛谷P1491】集合位置

    题目大意:求给定的一张无向带权图的次短路. 题解:先跑一遍 spfa 求出从起点到终点的最短路,记录路径.接着枚举删边,并重新跑 spfa,统计最小值即可. 至于为什么 dp 做法不行,暂时还不清楚. ...

  9. IIS并发连接数及性能优化

    如果要查看IIS连接数,最简单方便的方法是通过“网站统计”来查看,“网站统计”的当前在线人数可以认为是当前IIS连接数.然而,“网站统计”的当前在线人数统计时间较长,一般为10分钟或15分钟,再加上统 ...

  10. python之旅:面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...