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大的数 ...
随机推荐
- 神奇的JAVA多态
以前理解了基本思想,这版本的演示和应用比较真实. 顺路下来抽象方法和类,接口,就顺理成章啦... JAVA文件放一块了,分别对照前一个帖子的文件名: ///////////////////////// ...
- mysql备份恢复中的常见错误
从A主机备份到B主机 mysqldump -uroot -p vw>vw.sql 现备份数据库文件,需要恢复到目标机B,B的数据库版本为5.5.23,A机器的mysql版本为5.0.2 ...
- POJ 1198/HDU 1401
双向广搜... 呃,双向广搜一般都都用了HASH判重,这样可以更快判断两个方向是否重叠了.这道题用了双向的BFS,有效地减少了状态.但代码太长了,不写,贴一个别人的代码.. #include<i ...
- 使用URL在线语音合成
近期一直在做手机的项目,用到了语音合成与识别的功能.就找了几个网址做了分析,这里只实现了内容的合成.并不包括语音识别. 首先看一下谷歌的语音合成地址: http://translate.google. ...
- adb命令查看报名和查看手机分辨率
打开所要查看的应用包名: $ adb shell dumpsys activity top | head -n 10 TASK com.ss.android.article.news id=5 ACT ...
- Codeforces Round #253 (Div. 1)-A,B
A题: 由题意可知,最多翻10次就能够(事实上8次就够了).那么我们就用状态压缩表示状态. 对于某种状态,假设某一位为0,那么代表这一位不翻,否则代表这一位翻. 对于某一种翻的状态: 假设牌中有G3, ...
- atitit.浏览器插件解决方式----ftp插件 attilax 总结
atitit.浏览器插件解决方式----ftp插件 attilax 总结 1. 界面概览 D:云盘同步目录p5p5f tp.demo.html1 2. 初始化1 3. 事实调用2 4. 參考2 1 ...
- Django 介绍、安装配置、基本使用、Django 用户注冊样例
Django介绍 Django 是由 Python 开发的一个免费的开源站点框架.能够用于高速搭建高性能.优雅的站点. DjangoMTV 的思想项目架构图 ...
- div向右偏移设置 css让div靠右移一定距离
转自:https://www.thinkcss.com/shili/1372.shtml div对象盒子向右偏移设置,使用css让div靠右一定距离-div向右移教程实例篇 div向右偏移一定距离,可 ...
- Objective-C浮点数转化整数(向上取整、向下取整)
Objective-C拓展了C,自然很多用法是和C一致的.比如浮点数转化成整数,就有以下四种情况. 1.简单粗暴,直接转化 float f = 1.5; int a; a = (int)f; NSLo ...