题解:

可修改的主席树

一开始,我就按照最暴力的方法,空间nlognlogn

然后zju上面过不了,bzoj没有权限号

然后,参考了往上的论文,发现可以把初始的主席树先建好

然后,每次只需要维护修改的就可以了

而且修改的内容只有2个数字

可以快那么一些

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ls(x) t[x].lc
#define rs(x) t[x].rc
typedef long long ll;
const int N=;
int read()
{
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int q1[N],t1,q2[N],t2,sz=,root[N],rt[N],n,Q,m,a[N],mp[N*],i,j,k;
char s[];
struct question
{
char s[];
int i,j,k,x,d;
}q[N];
struct node
{
int lc,rc,w;
}t[N*];
int Bin(int v)
{
int l=,r=m;
while (l<=r)
{
int mid=(l+r)>>;
if(mp[mid]==v) return mid;
if(mp[mid]>v) r=mid-;
else l=mid+;
}
return -;
}
void ins(int &x,int l,int r,int num,int v)
{
t[++sz]=t[x];x=sz;
t[x].w+=v;
if(l==r) return;
int mid=(l+r)>>;
if (num<=mid) ins(t[x].lc,l,mid,num,v);
else ins(t[x].rc,mid+,r,num,v);
}
void add(int p,int v)
{
int xx=Bin(a[p]);
for (int i=p;i<=n;i+=i&-i) ins(root[i],,m,xx,v);
}
int cal()
{
int sum1=,sum2=;
for (int i=;i<=t1;i++) sum1+=t[ls(q1[i])].w;
for (int i=;i<=t2;i++) sum2+=t[ls(q2[i])].w;
return sum2-sum1;
}
int query(int ql,int qr,int k)
{
int l=,r=m;t1=t2=;
for (int i=ql-;i;i-=i&-i) q1[++t1]=root[i];
for (int i=qr;i;i-=i&-i) q2[++t2]=root[i];
ql--;
ql=rt[ql];qr=rt[qr];
while (l<r)
{
int lsize=cal()+t[ls(qr)].w-t[ls(ql)].w,mid=(l+r)>>;
if (k<=lsize)
{
for (int i=;i<=t1;i++) q1[i]=t[q1[i]].lc;
for (int i=;i<=t2;i++) q2[i]=t[q2[i]].lc;
ql=ls(ql);qr=ls(qr);
r=mid;
}
else
{
for (int i=;i<=t1;i++) q1[i]=t[q1[i]].rc;
for (int i=;i<=t2;i++) q2[i]=t[q2[i]].rc;
ql=rs(ql);qr=rs(qr);
l=mid+;k-=lsize;
}
}
return l;
}
int main()
{
int T=read();
while (T--)
{
m=sz=;
memset(q,,sizeof q);
memset(t,,sizeof t);
memset(rt,,sizeof rt);
memset(root,,sizeof root);
n=read();Q=read();
for (int i=;i<=n;i++)a[i]=mp[++m]=read();
for (int i=;i<=Q;i++)
{
scanf("%s",q[i].s);
if (q[i].s[]=='Q') q[i].i=read(),q[i].j=read(),q[i].k=read();
else q[i].x=read(),q[i].d=mp[++m]=read();
}
sort(mp+,mp++m);
int p=;
for (int i=;i<=m;i++) if(mp[i]!=mp[i-]) mp[++p]=mp[i];
m=p;
for (int i=;i<=n;i++) rt[i]=rt[i-],ins(rt[i],,m,Bin(a[i]),);
for (int i=;i<=Q;i++)
{
if(q[i].s[]=='Q')
printf("%d\n",mp[query(q[i].i,q[i].j,q[i].k)]);
else
{
add(q[i].x,-);
a[q[i].x]=q[i].d;
add(q[i].x,);
}
}
}
return ;
}

zoj2112&&bzoj1901的更多相关文章

  1. [主席树]ZOJ2112 && BZOJ1901 Dynamic Rankings

    题意:n个数,q个询问 (n<=50000, q<=10000) Q x y z 代表询问[x, y]区间里的第z小的数 C x y    代表将(从左往右数)第x个数变成y 上篇介绍了在 ...

  2. ZOJ2112 BZOJ1901 Dynamic Rankings 树套树 带修改的区间第k小

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112 树套树,线段树套splay或者主席树套树状数组,我抄了一下hzwer ...

  3. bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统)

    bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统) cogs zoj bzoj-权限 题解 bzoj和zoj都是骗访问量的233,我没有 ...

  4. BZOJ1901 ZOJ2112 线段树+treap (线段树套线段树)

    BZOJ1901: 线段树套线段树做法: (外层线段树 里层动态开节点的权值线段树) 有一个小小的trick 可以省掉二分变成nlog^2n的 就是把查询的区间都取出来- logn个一起走- 2016 ...

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

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

  6. 可修改的区间第K大 BZOJ1901 ZOJ2112

    http://blog.csdn.net/u014492306/article/details/47981315 //变相离线做法 离散化缩小区间范围,做两大个线段树,第一个就是普通的持久化树,有个前 ...

  7. 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings

    谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...

  8. [BZOJ1901]Zju2112 Dynamic Rankings

    [BZOJ1901]Zju2112 Dynamic Rankings 试题描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i ...

  9. zoj2112

    题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112 经典的动态区间第K大. 用树状数组套线段树. 对原数组建一个树 ...

随机推荐

  1. Python3基础 逻辑运算 and or not 示例

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  2. HDU 3404 Switch lights(Nim积)题解

    题意:在一个二维平面中,有n个灯亮着并告诉你坐标,每回合需要找到一个矩形,这个矩形xy坐标最大的那个角落的点必须是亮着的灯,然后我们把四个角落的灯状态反转,不能操作为败 思路:二维Nim积,看不懂啊, ...

  3. BZOJ4401: 块的计数 思维题

    Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构——块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对这种事情毫无兴趣,只是 ...

  4. spark-shuffle分析

    前言 shuffle是分布式计算系统中最重要的一部分,spark和mapreduce的shuffle的大体思路类似,在实现上有一些区分.Spark提供了插件式的接口,使用者可以通过继承ShuffleM ...

  5. 《算法竞赛入门经典》习题及反思 -<2>

    数组 Master-Mind Hints,Uva 340 题目:给定答案序列和用户猜的序列,统计有多少数字对应正确(A),有多少数字在两个序列都出现过但位置不对. 输入包括多组数据.每组输入第一行为序 ...

  6. UVa 10954 全部相加(Huffman编码)

    https://vjudge.net/problem/UVA-10954 题意:有n个数的集合S,每次可以从S中删除两个数,然后把它们的和放回集合,直到剩下一个数.每次操作的开销等于删除的两个数之和, ...

  7. ros 查找包路径

    rospack find 包名

  8. Index.cshtml”处的视图必须派生自 WebViewPage 或 WebViewPage<TModel>。

    解决方案: 1,在每个视图上面添加 @inherits System.Web.Mvc.WebViewPage 2,将views中的web.config COPY到新的视图模版文件夹下,就可以了

  9. MSVC_代码优化

    测试环境: Win7x64 cn_visual_studio_2010_ultimate_x86_dvd_532347.iso qt-opensource-windows-x86-msvc2010_o ...

  10. python的print

    grid=[['.', '.', '.', '.', '.', '.'], [', '.', '.', '.'], [', '.', '.'], [', '.'], ['], [', '.'], [' ...