整体二分:

对于每一个修改操作,标记为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 1107:搬水果 (贪心)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5190 解决:1747 题目描述: 在一个果园里,小明已经将所有的水果打了下来,并按水果的不同种类分成了若干堆,小明决定把所有的水果合成一堆 ...

  2. Nothing but the key 属性全部依赖于主键 third norm form

    全依赖 Designs that Violate 1NF CustomerCustomer ID First Name Surname Telephone Number123 Pooja Singh ...

  3. ElasticSearch(一)什么是全文检索?

    全文检索 全文检索,即倒排索引.

  4. 第一节 麒麟系统安装+基础环境搭建(JDK+Scala)

    本文重点对没有Linux基础的人员提供高速上手的指导,假设你的开发环境已经搭建好,能够略过本章所讲内容,内容来源于网络.也谢谢这些默默讲自己经验分享的人!近期在学习大数据,有喜欢的朋友能够一起研究. ...

  5. java中科学计数法数字转字符串

    开发过程中有可能会遇到很小的数字,在显示过程中就转换成了科学计数法,这种不利于人的观看,于是就有必要转成字符串形式的.so. 将科学计数法的数字转换成字符串: 使用的是java.math的BigDec ...

  6. 【LeetCode】Rotate List

    Given a list, rotate the list to the right by k places, where k is non-negative. For example:Given 1 ...

  7. XMPP学习笔记 -- RFC 6120

    XMPP - Extensible Messaging and Presence Protocol 1. 中文版3920 http://wiki.jabbercn.org/RFC3920 2. 大部分 ...

  8. Tomcat之catalina.out日志分割

    可参考:http://meiling.blog.51cto.com/6220221/1911769 本人尚未验证.

  9. HDU1873 看病要排队 —— 优先队列(STL)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1873 题解: 题目已经说出了解题方法:优先队列.但是之前没有学过优先队列,而且这题还是在现场赛做的.由 ...

  10. FFmpeg音视频编解码实践总结

    PS:由于目前开发RTSP服务器传输模块时用到了h264文件,所以攻了一段时间去实现h264的视频编解码,借用FFmpeg SDK实现了任意文件格式之间的转换,并实现了流媒体实时播放,目前音视频同步需 ...