BZOJ 1901 Dynamic Rankings (整体二分+树状数组)
题目大意:略
洛谷传送门 这道题在洛谷上数据比较强
貌似这个题比较常见的写法是树状数组套主席树,动态修改
我写的是整体二分
一开始的序列全都视为插入
对于修改操作,把它拆分成插入和删除两个操作
像$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 (整体二分+树状数组)的更多相关文章
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9094 Solved: 3808[Submit][Status][Discuss] Descript ...
- BZOJ.1901.Dynamic Rankings(整体二分)
题目链接 BZOJ 洛谷 (以下是口胡) 对于多组的询问.修改,我们可以发现: 假设有对p1,p2,p3...的询问,在这之前有对p0的修改(比如+1),且p0<=p1,p2,p3...,那么我 ...
- BZOJ 2527 [POI2011]MET-Meteors (整体二分+树状数组)
题目大意:略 洛谷传送门 整体二分裸题 考虑只有一个国家的情况如何处理 对询问数量二分答案,暴力$O(m)$打差分,求前缀和验证,时间是$O(mlogK)$ 如果有$n$个国家,就是$O(nmlogK ...
- BZOJ 2527 [Poi2011]Meteors (整体二分+树状数组)
整体二分板题,没啥好讲的-注意是个环-还有所有贡献会爆longlong,那么只要在加之前判断一下有没有达到需要的值就行了- CODE #include <set> #include < ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组
BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
随机推荐
- 楼控-西门子-insight使用-软件重新授权
在insight的使用中,可能会碰到insight的软件授权失败,此时需要重新将原授权删除,再重新将软件授权. 先看一下软件授权失效会出现什么: 再看看如何删除原来的密钥,再注册新的密钥.
- POJ 3281(Dining-网络流拆点)[Template:网络流dinic]
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbmlrZTBnb29k/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- 自己主动化的在程序中显示SVN版本号
有时候会有这种情况,策划拿着应用过来提一个bug,但我们却不好确定策划的手机上装的应用相应的是那个代码版本号. 为了解决问题.我们希望能在应用上显示出当前应用所相应的代码版本号,即svn版本号. 构想 ...
- 关系型数据库与HBase的数据储存方式差别
现在Bigtable型(列族)数据库应用越来越广,功能也非常强大. 可是非常多人还是把它当做关系型数据库在使用,用原来关系型数据库的思维建表.存储.查询. 本文以hbase举例讲述数据模式的变化. 传 ...
- 安卓离线SDK Windows版 资源包下载地址全集
1.Tools https://dl-ssl.google.com/android/repository/platform-tools_r19.0.1-windows.zip https://d ...
- ubuntu修改capslock键,单独使用为esc,组合使用时为ctrl+
一.下面这部分可以将capslock与ctrl互换 将下面的代码放入-/.Xmodmap中, remove Lock = Caps_Lock remove Control = Control_L ke ...
- js 获取现在时间一个月(N天)后的日期
欢迎加入前端交流群交流知识&&获取视频资料:749539640 let today = new Date().getTime() let lastDay = getTimeByDay( ...
- WPF中StringToImage和BoolToImage简单用法
在WPF的绑定控件操作中,经常会通过bool值或者某些特定的string值做出相应动作.但UI层控件的很多属性对应的都不是Bool值或者对应的只是固定的String值. 这个时候有两方法解决该问题. ...
- php navigat备份
点击查询->新建查询->写sql查询出更新的数据部分(根据时间等条件) -> 点击上方工具菜单栏的导出向导 ,然后就可以根据选择导出文件了可以导出sql脚本excel等很多,绝对有你 ...
- 09-JavaScript高级
今日知识 1. Dom(文档对象模型) 2. Bom(浏览器对象模型) 3. 总结 Dom 1. 获取id为div1的元素对象. * var result=document.getElementByI ...