【题意】

  给定一个含有n个数的序列a[1],a[2],a[3]……a[n],

  程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令。

  对于每一个询问指令,你必须输出正确的回答。

  第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。

  分别表示序列的长度和指令的个数。第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。接下来的m行描述每条指令,每行的格式是下面两种格式中的一种。

   Q i j k 或者 C i t Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t。

【分析】

  带修改的区间第k大。

  如果只是询问区间的第k大的话,就是可持久化字母树。

  然后,其实我想了挺久。。。。可以看看GDXB的题解。。http://www.cnblogs.com/KonjakJuruo/p/6031832.html

  她打的是树状数组套线段树。 其实就是树状数组搞区间,然后线段树搞数值。

  因为带修改的话,是动态的。相当于不修改的时候,我们只要记录前缀和,就可以知道某段区间的和(两个前缀相减),但是修改了之后,就要用树状数组或者线段树等维护。

  这个也是这个道理,用数据结构维护区间。

  本蒟蒻打的是线段树套字母树(区间第k大,深爱字母树,耶!)

  其实树状数组套字母树应该更简单??

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 10010
#define Maxd 32 int a[Maxn],nw[Maxn],al;
char s[]; struct trie
{
int son[],cnt;
}tr[Maxn**];int tot; void upd(int x)
{
tr[x].son[]=tr[x].son[]=;
tr[x].cnt=;
} void add(int now,int y,int c)
{
for(int i=Maxd;i>=;i--)
{
int ind=y>>i-;
y=y%(<<i-);
if(!tr[now].son[ind])
{
tr[now].son[ind]=++tot;
upd(tot);
}
now=tr[now].son[ind];
tr[now].cnt+=c;
}
} int query(int k)
{
int ans=;
for(int i=Maxd;i>=;i--)
{
int ls=;
for(int j=;j<=al;j++) ls+=tr[tr[nw[j]].son[]].cnt;
if(ls>=k)
{
for(int j=;j<=al;j++) nw[j]=tr[nw[j]].son[];
}
else
{
k-=ls;
ans+=(<<i-);
for(int j=;j<=al;j++) nw[j]=tr[nw[j]].son[];
}
}
return ans;
} struct node
{
int l,r,lc,rc,rt;
}t[Maxn*];int len; int build(int l,int r)
{
int x=++len;
t[x].l=l;t[x].r=r;t[x].rt=++tot;
upd(tot);
if(l!=r)
{
int mid=(l+r)>>;
t[x].lc=build(l,mid);
t[x].rc=build(mid+,r);
}
else t[x].lc=t[x].rc=;
return x;
} void change(int x,int y,int z)
{
add(t[x].rt,z,);
if(a[y]!=-) add(t[x].rt,a[y],-);
if(t[x].l==t[x].r) return;
int mid=(t[x].l+t[x].r)>>;
if(y<=mid) change(t[x].lc,y,z);
else change(t[x].rc,y,z);
} void ffind(int x,int l,int r)
{
if(t[x].l==l&&t[x].r==r)
{
nw[++al]=t[x].rt;
return;
}
int mid=(t[x].l+t[x].r)>>;
if(r<=mid) ffind(t[x].lc,l,r);
else if(l>mid) ffind(t[x].rc,l,r);
else
{
ffind(t[x].lc,l,mid);
ffind(t[x].rc,mid+,r);
}
} int n,m;
void init()
{
len=;tot=;
scanf("%d%d",&n,&m);
build(,n);
memset(a,-,sizeof(a));
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
change(,i,x);
a[i]=x;
}
} int main()
{
init();
for(int i=;i<=m;i++)
{
scanf("%s",s);
if(s[]=='C')
{
int x,y;
scanf("%d%d",&x,&y);
change(,x,y);
a[x]=y;
}
else
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
al=;
ffind(,x,y);
printf("%d\n",query(k));
}
}
return ;
}

2016-11-08 14:33:10

话说树套树的离线题可以用CDQ分治??

不会。。

【BZOJ1901】 Zju2112 Dynamic Rankings(树套树)的更多相关文章

  1. BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...

  2. bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)

    带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀.  对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了.  3k4人AC的题#256...应该不算慢 #incl ...

  3. BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 9094  Solved: 3808[Submit][Status][Discuss] Descript ...

  4. [BZOJ1901]Zju2112 Dynamic Rankings

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

  5. [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】

    题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...

  6. 主席树初探--BZOJ1901: Zju2112 Dynamic Rankings

    n<=10000的序列做m<=10000个操作:单点修改,查区间第k小. 所谓的主席树也就是一个值域线段树嘛..不过在这里还是%%fotile 需要做一个区间查询,由于查第k小,需要一些能 ...

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

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

  8. BZOJ1901——Zju2112 Dynamic Rankings

    1.题目大意:区间第k小,有单点修改 2.分析:这个是树状数组套线段树,也是主席树....为什么主席树这么多QAQ 就是树套树的那种插入什么的,注意啊,一定要动态开内存..不然会爆.. 然后算答案有两 ...

  9. BZOJ1901 Zju2112 Dynamic Rankings 【树状数组套主席树】

    题目 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[j]中第k小的数是多少(1≤k≤j- ...

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

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

随机推荐

  1. java.util.Stack类简介

    Stack是一个后进先出(last in first out,LIFO)的堆栈,在Vector类的基础上扩展5个方法而来 Deque(双端队列)比起Stack具有更好的完整性和一致性,应该被优先使用 ...

  2. Oracle常用查询命令

    Oracle查询完整格式如下: Select  *  from XX where XX group by YY having XX order by YY Select count(*), XX fr ...

  3. window nodejs 版本切换 nvmw

    参考文档:https://cnodejs.org/topic/5338c5db7cbade005b023c98 nvmw 下载到本地 git clone https://github.com/hako ...

  4. 20160331javaweb 之JSP page 指令

  5. 小技巧之指定refer

    在当前页面A的控制台输入window.location.href='要跳去的页面B',B页面的refer即为A页面.

  6. java三大特性性:封装、继承和多态

    一.封装 封装是指隐藏对象的属性及实现细节,对外仅提供接口可见.封装实现了信息隐藏,利于软件复用.其优点是达到了模块化的标准,从而提高了代码的复用程度.在某种程度上,封装也大大改善了软件开发的可维护性 ...

  7. 初步认识 Web Service

     Web Service初步认识   Web Service:不是框架,不是一种技术,而是一种跨平台,跨语言的规范. 作用:异构平台之间的交互,解决了不同平台,不同语言所编写的应用之间的相互调用.(远 ...

  8. 时间处理得到UTC时间

    在工作过程遇到了时间处理的问题,因为需要统一将时间处理按照utc时间进行处理,因此,不能简单的通过系统运行直接得到时间的毫秒数,这样会在不同时区得到的值是不同的. import java.text.P ...

  9. error signing assembly unknown error

    用VS2010 编译 C#工程,出现 Cryptographic failure while signing assembly 'Assembly.dll' -- 'Unknown error (80 ...

  10. 利用php获取图片完整Exif信息类 获取图片详细完整信息类

    <?php /** * @Author: TonyLevid * @Copyright: TonyLevid.com * @Name: Image Exif Class * @Version: ...