整体二分:

对于每一个修改操作,标记为1,并且加一个标记为-1的这个位置原来值,并且对于a数列每个点都当成修改操作

然后整体二分,扫当前操作区间lr,把在值域区间标记为1和-1的操作都在树状数组对应位置上加/减出来,然后询问操作根据k和询问答案大小决定放在哪部分传下去

#include<iostream>
#include<cstdio>
using namespace std;
const int N=1000005;
int n,m,a[N],tot,ans[N],con,t[N],p[N];
char s[5];
struct qwe
{
int o,l,r,v,k;
qwe(int O=0,int L=0,int R=0,int V=0,int K=0)
{
o=O,l=L,r=R,v=V,k=K;
}
}q[N],ql[N],qr[N];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
void update(int x,int v)
{
for(int i=x;i<=n;i+=(i&(-i)))
t[i]+=v;
}
int ques(int x)
{
int r=0;
for(int i=x;i>=1;i-=(i&(-i)))
r+=t[i];
return r;
}
void wk(int ll,int rr,int l,int r)
{//cerr<<ll<<" "<<rr<<" "<<l<<" "<<r<<endl;
if(l>r)
return;
if(ll==rr)
{
for(int i=l;i<=r;i++)
if(q[i].o==0)
ans[q[i].v]=ll;
return;
}
int mid=(ll+rr)>>1;
for(int i=l;i<=r;i++)
{
if(q[i].o==0)
p[i]=ques(q[i].r)-ques(q[i].l-1);
else if(q[i].v<=mid)
update(q[i].l,q[i].o);
}
for(int i=l;i<=r;i++)
if(q[i].o&&q[i].v<=mid)
update(q[i].l,-q[i].o);
int tl=0,tr=0,tot=l;
for(int i=l;i<=r;i++)
{
if(q[i].o==0)
{
if(q[i].k<=p[i])
ql[++tl]=q[i];
else
{
q[i].k-=p[i];
qr[++tr]=q[i];
}
}
else
{
if(q[i].v<=mid)
ql[++tl]=q[i];
else
qr[++tr]=q[i];
}
}
for(int i=1;i<=tl;i++)
q[tot++]=ql[i];
for(int i=1;i<=tr;i++)
q[tot++]=qr[i];
wk(ll,mid,l,l+tl-1);
wk(mid+1,rr,l+tl,r);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
a[i]=read(),q[++tot]=qwe(1,i,0,a[i],0);
for(int i=1;i<=m;i++)
{
scanf("%s",s+1);
if(s[1]=='Q')
{
int l=read(),r=read(),k=read();
q[++tot]=qwe(0,l,r,++con,k);
}
else
{
int p=read(),v=read();
q[++tot]=qwe(-1,p,0,a[p],0);
q[++tot]=qwe(1,p,0,v,0);
a[p]=v;
}
}
wk(0,1e9,1,tot);
for(int i=1;i<=con;i++)
printf("%d\n",ans[i]);
return 0;
}

主席树:

主席树维护的是前缀和,然后单点修改就很麻烦

考虑前缀和数组是怎么解决这个问题的,就是用树状数组,每次修改改log个位置即可

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int N=20005;
int n,m,v[N],a[N],con,h[N],tot,rt[N],cnt,l[30],r[30],x,y;
char c[5];
map<int,int>mp;
struct qwe
{
bool f;
int x,y,k;
}q[N];
struct xianduanshu
{
int ls,rs,sum;
}t[2200001];
int read()
{
int r=0,f=1;
char p=getchar();
while(p>'9'||p<'0')
{
if(p=='-')
f=-1;
p=getchar();
}
while(p>='0'&&p<='9')
{
r=r*10+p-48;
p=getchar();
}
return r*f;
}
// int zhao(int x)
// {
// int l=1,r=tot,mid;
// while(l<=r)
// {
// int mid=(l+r)>>1;
// if(h[mid]<x)
// l=mid+1;
// else
// r=mid-1;
// }
// return l;
// }
int lb(int x)
{
return x&(-x);
}
void update(int la,int l,int r,int &rt,int w,int x)
{
rt=++con;
t[rt].sum=t[la].sum+x;
t[rt].ls=t[la].ls;
t[rt].rs=t[la].rs;
if(l==r)
return;
int mid=(l+r)>>1;
if(w<=mid)
update(t[la].ls,l,mid,t[rt].ls,w,x);
else
update(t[la].rs,mid+1,r,t[rt].rs,w,x);
}
int ques(int ll,int rr,int k)
{
if(ll==rr)
return ll;
int sl=0,sr=0;
for(int i=1;i<=x;i++)
sl+=t[t[l[i]].ls].sum;
for(int i=1;i<=y;i++)
sr+=t[t[r[i]].ls].sum;
int mid=(ll+rr)>>1;
if(sr-sl>=k)
{
for(int i=1;i<=x;i++)
l[i]=t[l[i]].ls;
for(int i=1;i<=y;i++)
r[i]=t[r[i]].ls;
return ques(ll,mid,k);
}
else
{
for(int i=1;i<=x;i++)
l[i]=t[l[i]].rs;
for(int i=1;i<=y;i++)
r[i]=t[r[i]].rs;
return ques(mid+1,rr,k-(sr-sl));
}
}
int main()
{
n=read(),m=read();
con=n;
for(int i=1;i<=n;i++)
v[i]=read(),a[i]=v[i];
for(int i=1;i<=m;i++)
{
scanf("%s",c);
q[i].x=read(),q[i].y=read();
if(c[0]=='Q')
{
q[i].f=1;
q[i].k=read();
}
else
a[++con]=q[i].y;
}
sort(a+1,a+1+con);
h[++tot]=a[1];
for(int i=2;i<=con;i++)
if(a[i]!=a[i-1])
h[++tot]=a[i],mp[a[i]]=tot;
for(int i=1;i<=n;i++)
{
int tmp=mp[v[i]];
for(int j=i;j<=n;j+=lb(j))
update(rt[j],1,tot,rt[j],tmp,1);
}
for(int i=1;i<=m;i++)
{
if(q[i].f)
{
x=0,y=0;
q[i].x--;
for(int j=q[i].x;j>0;j-=lb(j))
l[++x]=rt[j];
for(int j=q[i].y;j>0;j-=lb(j))
r[++y]=rt[j];
printf("%d\n",h[ques(1,tot,q[i].k)]);
}
else
{
int tmp=mp[v[q[i].x]];
for(int j=q[i].x;j<=n;j+=lb(j))
update(rt[j],1,tot,rt[j],tmp,-1);
v[q[i].x]=q[i].y;
tmp=mp[q[i].y];
for(int j=q[i].x;j<=n;j+=lb(j))
update(rt[j],1,tot,rt[j],tmp,1);
}
}
return 0;
}

bzoj 1901: Zju2112 Dynamic Rankings【整体二分+树状数组||主席树+树状数组】的更多相关文章

  1. BZOJ 1901 Zju2112 Dynamic Rankings ——整体二分

    [题目分析] 上次用树状数组套主席树做的,这次用整体二分去水. 把所有的查询的结果一起进行二分,思路很好. [代码] #include <cstdio> #include <cstr ...

  2. BZOJ 1901: Zju2112 Dynamic Rankings 区间k大 带修改 在线 线段树套平衡树

    之前写线段树套splay数组版..写了6.2k..然后弃疗了.现在发现还是很水的..嘎嘎.. zju过不了,超时. upd:才发现zju是多组数据..TLE一版才发现.然后改了,MLE...手写内存池 ...

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

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

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

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

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

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

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

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

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

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

  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

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

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

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

随机推荐

  1. 九度OJ 1122:吃糖果 (递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1522 解决:1200 题目描述: 名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N ...

  2. Xcode6 新特性

    苹果在WWDC 2014上对新版Xcode(Xcode 6 Beta版)并没有提及过多.但它却是开发人员不能忽视的一部分.Xcode 6 Beta版为设计和创建软件引入了新方法,更加关注功能和一些改善 ...

  3. UIView封装动画--iOS利用系统提供方法来做转场动画

    UIView封装动画--iOS利用系统提供方法来做转场动画 UIViewAnimationOptions option; if (isNext) { option=UIViewAnimationOpt ...

  4. linux CentOS7.2配置LNMP

    转自http://www.centoscn.com/CentosServer/www/2014/0904/3673.html 准备篇: CentOS 7.0系统安装配置图解教程 http://www. ...

  5. apache配置文件详解及虚拟主机的搭建

    1.404跳转: <IfModule dir_module>    DirectoryIndex index.php index.html /error.php</IfModule& ...

  6. (linux)struct inode 和 struct file

    转自:http://www.cnblogs.com/QJohnson/archive/2011/06/24/2089414.html 1.struct inode──字符设备驱动相关的重要结构介绍 内 ...

  7. shared SDK 微信开放平台遇到的问题

    shared sdk是用于集成到app中,方便快速社交化分享的组件,其使用方法比较简单,参考官网的快速集成步骤就能搞定.稍微麻烦一点的就是需要到各个开放平台去注册你的APP. 在各个开放平台注册好之后 ...

  8. [bzoj 3720] Gty的妹子树 (树上分块)

    树上分块(块状树) Description 我曾在弦歌之中听过你, 檀板声碎,半出折子戏. 舞榭歌台被风吹去, 岁月深处尚有余音一缕-- Gty神(xian)犇(chong)从来不缺妹子-- 他来到了 ...

  9. jzyz集训 0228

    早上考了一波. 出题人是wangyurzee王队长,题目亲民,数据很水(除了第二题).用来做比赛很不错.(尽管我只有第一题A了). 第一题大意是给你n个操作,每个操作是将你手上的数字区间集合与给出的区 ...

  10. platform_set_drvdata()/platform_get_drvdata()/container_of()【转】

    本文转载自:http://blog.csdn.net/angle_birds/article/details/8443695 platform_set_drvdata(struct platform_ ...