题目传送门(权限题)

一道类似的非权限题

题意

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. Windows 下 Docker 的简单学习使用过程之三 创建images 导出images

    1. 创建images 主要有两种方法, 一种是docker commit 一种是docker build 其中有一个很明显的区别: docker commit 是将运行状态的虚拟机 进行 生成ima ...

  2. CopyOnWriteArrayList、CopyOnWriteArraySet、ConcurrentHashMap的实现原理和适用场景

    ConcurrentHashMap代替同步的Map(Collections.synchronized(new HashMap())),众所周知,HashMap是根据散列值分段存储的,同步Map在同步的 ...

  3. 【版本管理】git分支管理

    创建与合并分支: 首先,我们创建dev分支,然后切换到dev分支: git checkout -b dev,命令加上-b参数表示创建并切换, 相当于以下两条命令: git branch dev: gi ...

  4. 使用AutoMapper实现Dto和Model的自由转换(上)

    在实际的软件开发项目中,我们的“业务逻辑”常常需要我们对同样的数据进行各种变换.例如,一个Web应用通过前端收集用户的输入成为Dto,然后将Dto转换成领域模型并持久化到数据库中.另一方面,当用户请求 ...

  5. stacking算法原理及代码

    stacking算法原理 1:对于Model1,将训练集D分为k份,对于每一份,用剩余数据集训练模型,然后预测出这一份的结果 2:重复上面步骤,直到每一份都预测出来.得到次级模型的训练集 3:得到k份 ...

  6. AOP 环绕通知 集成了前置 后置 返回通知等功能

    AOP 环绕通知 集成了前置 后置 返回通知等功能

  7. Palindrome Numbers UVA - 12050(第几个回文数)

    长度为k的回文串个数有9*10^(k-1) #include <iostream> #include <cstdio> #include <sstream> #in ...

  8. AtCoder Grand Contest 009

    AtCoder Grand Contest 009 A - Multiple Array 翻译 见洛谷 题解 从后往前考虑. #include<iostream> #include< ...

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

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

  10. 解题:POJ 2888 Magic Bracelet

    题面 这题虽然很老了但是挺好的 仍然套Burnside引理(因为有限制你并不能套Polya定理),思路和这个题一样,问题主要是如何求方案. 思路是把放珠子的方案看成一张图,然后就巧妙的变成了一个经典的 ...