题目大意:略

洛谷传送门 这道题在洛谷上数据比较强

貌似这个题比较常见的写法是树状数组套主席树,动态修改

我写的是整体二分

一开始的序列全都视为插入

对于修改操作,把它拆分成插入和删除两个操作

像$CDQ$分治一样,用结构体记录操作的位置,修改的权值等

假设为需要处理的询问分配了一个答案$mid$

查询区间第$K$小,我们只需要查询区间内权值为$[l,mid]$的数有几个

每次插入/删除,都看这次操作修改的权值是否$\in[l,mid]$

如果是,说明这个它对答案有贡献,在它在原序列的位置上$+1$,那么某个区间权值为$[l,mid]$的数就是查询前缀和,用树状数组维护

反之都是没贡献的

如果超过了$K$个,说明第$K$小的数小于等于$mid$,把它扔到左区间递归

如果小于$K$个,说明第$K$小的数一定大于$mid$,$K-=mid$,把它扔到右区间递归

插入删除操作也要按权值分左右区间递归

注意不要破坏时间序!

 #include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 105000
#define M1 205000
#define ll long long
#define dd double
#define inf 233333333
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
int n,m,nn;
struct BIT{
int sum[N1];
void update(int x,int w){ for(int i=x;i<=n;i+=(i&(-i))) sum[i]+=w; }
int query(int x){ int ans=; for(int i=x;i;i-=(i&(-i))) ans+=sum[i]; return ans;}
void clr(int x){ for(int i=x;i<=n;i+=(i&(-i))) sum[i]=; }
}s;
struct node{int i,j,k,t,id;}a[N1+M1],tmp[N1+M1];
int w[M1],ma,que[N1+M1],tl,f[N1],c[N1],use[N1+M1]; void alldic(int l,int r,int ql,int qr)
{
if(l>r||ql>qr) return;
int mid=(l+r)>>,i,j,S=ql,E,sum;
for(i=ql;i<=qr;i++)
{
if(!a[i].k){
if(a[i].j<=mid){ s.update(a[i].i,); que[++tl]=a[i].i; use[i]=; }
if(a[i].j<mid) tmp[S++]=a[i];
}else if(a[i].k==-){
if(a[i].j<=mid){ s.update(a[i].i,-); que[++tl]=a[i].i; use[i]=; }
if(a[i].j<mid) tmp[S++]=a[i];
}else{
sum=s.query(a[i].j)-s.query(a[i].i-);
if(sum<a[i].k){ a[i].k-=sum; }
else{ f[a[i].t]=w[mid]; tmp[S++]=a[i]; use[i]=; }
}
}
for(i=ql,E=S;i<=qr;i++)
{
if(use[i]) use[i]=;
else tmp[E++]=a[i];
}
while(tl){ s.clr(que[tl--]); }
for(i=ql;i<=qr;i++) a[i]=tmp[i];
alldic(l,mid-,ql,S-); alldic(mid+,r,S,E-);
}
char str[]; int main()
{
scanf("%d%d",&n,&m);
int i,j;
for(i=;i<=n;i++){ nn++; a[nn].j=gint(); a[nn].i=i; w[++ma]=a[nn].j; c[i]=a[i].j; }
for(i=;i<=m;i++)
{
scanf("%s",str);
if(str[]=='Q'){
nn++; a[nn].i=gint(); a[nn].j=gint(); a[nn].k=gint(); a[nn].t=i;
}else{
nn++; a[nn].k=-; a[nn].i=gint(); a[nn].j=c[a[nn].i];
nn++; a[nn].k=; a[nn].i=a[nn-].i; a[nn].j=gint();
c[a[nn].i]=a[nn].j; w[++ma]=a[nn].j;
}
f[i]=-;
}
sort(w+,w+ma+); ma=unique(w+,w+ma+)-(w+);
for(i=;i<=nn;i++) if(a[i].k<=) a[i].j=lower_bound(w+,w+ma+,a[i].j)-w;
alldic(,ma,,nn);
for(i=;i<=m;i++) if(f[i]>=) printf("%d\n",f[i]);
return ;
}

BZOJ 1901 Dynamic Rankings (整体二分+树状数组)的更多相关文章

  1. [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  2. BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9094  Solved: 3808[Submit][Status][Discuss] Descript ...

  3. BZOJ.1901.Dynamic Rankings(整体二分)

    题目链接 BZOJ 洛谷 (以下是口胡) 对于多组的询问.修改,我们可以发现: 假设有对p1,p2,p3...的询问,在这之前有对p0的修改(比如+1),且p0<=p1,p2,p3...,那么我 ...

  4. BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)

    题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...

  5. BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)

    整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...

  6. 【BZOJ-2527】Meteors 整体二分 + 树状数组

    2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 306[Submit][Stat ...

  7. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  8. BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组

    BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...

  9. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

随机推荐

  1. 楼控-西门子-insight使用-软件重新授权

    在insight的使用中,可能会碰到insight的软件授权失败,此时需要重新将原授权删除,再重新将软件授权. 先看一下软件授权失效会出现什么: 再看看如何删除原来的密钥,再注册新的密钥.

  2. POJ 3281(Dining-网络流拆点)[Template:网络流dinic]

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmlrZTBnb29k/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  3. 自己主动化的在程序中显示SVN版本号

    有时候会有这种情况,策划拿着应用过来提一个bug,但我们却不好确定策划的手机上装的应用相应的是那个代码版本号. 为了解决问题.我们希望能在应用上显示出当前应用所相应的代码版本号,即svn版本号. 构想 ...

  4. 关系型数据库与HBase的数据储存方式差别

    现在Bigtable型(列族)数据库应用越来越广,功能也非常强大. 可是非常多人还是把它当做关系型数据库在使用,用原来关系型数据库的思维建表.存储.查询. 本文以hbase举例讲述数据模式的变化. 传 ...

  5. 安卓离线SDK Windows版 资源包下载地址全集

    1.Tools    https://dl-ssl.google.com/android/repository/platform-tools_r19.0.1-windows.zip https://d ...

  6. ubuntu修改capslock键,单独使用为esc,组合使用时为ctrl+

    一.下面这部分可以将capslock与ctrl互换 将下面的代码放入-/.Xmodmap中, remove Lock = Caps_Lock remove Control = Control_L ke ...

  7. js 获取现在时间一个月(N天)后的日期

    欢迎加入前端交流群交流知识&&获取视频资料:749539640 let today = new Date().getTime() let lastDay = getTimeByDay( ...

  8. WPF中StringToImage和BoolToImage简单用法

    在WPF的绑定控件操作中,经常会通过bool值或者某些特定的string值做出相应动作.但UI层控件的很多属性对应的都不是Bool值或者对应的只是固定的String值. 这个时候有两方法解决该问题. ...

  9. php navigat备份

    点击查询->新建查询->写sql查询出更新的数据部分(根据时间等条件) -> 点击上方工具菜单栏的导出向导 ,然后就可以根据选择导出文件了可以导出sql脚本excel等很多,绝对有你 ...

  10. 09-JavaScript高级

    今日知识 1. Dom(文档对象模型) 2. Bom(浏览器对象模型) 3. 总结 Dom 1. 获取id为div1的元素对象. * var result=document.getElementByI ...