【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-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(树套树)的更多相关文章
- BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...
- bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)
带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀. 对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了. 3k4人AC的题#256...应该不算慢 #incl ...
- BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9094 Solved: 3808[Submit][Status][Discuss] Descript ...
- [BZOJ1901]Zju2112 Dynamic Rankings
[BZOJ1901]Zju2112 Dynamic Rankings 试题描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i ...
- [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】
题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...
- 主席树初探--BZOJ1901: Zju2112 Dynamic Rankings
n<=10000的序列做m<=10000个操作:单点修改,查区间第k小. 所谓的主席树也就是一个值域线段树嘛..不过在这里还是%%fotile 需要做一个区间查询,由于查第k小,需要一些能 ...
- BZOJ 1901: Zju2112 Dynamic Rankings( BIT 套 BST )
BIT 套 splay 其实也是不难...每个 BIT 的结点保存一颗 splay , 询问就二分答案然后判断rank... ------------------------------------- ...
- BZOJ1901——Zju2112 Dynamic Rankings
1.题目大意:区间第k小,有单点修改 2.分析:这个是树状数组套线段树,也是主席树....为什么主席树这么多QAQ 就是树套树的那种插入什么的,注意啊,一定要动态开内存..不然会爆.. 然后算答案有两 ...
- 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- ...
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
随机推荐
- 深入理解计算机系统第二版习题解答CSAPP 2.4
不进行数字转换为二进制和十六进制,计算结果. A. 0x503C + 0x8 = 0x5044 B. 0x503C - 0x40 = 0x4FFC C. 0x503C + 64 = 0x503C + ...
- C++ notes for beginners(2)
作者:马 岩(Furzoom) (http://www.cnblogs.com/furzoom/)版权声明:本文的版权归作者与博客园共同所有.转载时请在明显地方注明本文的详细链接,未经作者同意请不要删 ...
- 解决 kindle 书籍字体颜色偏淡问题的方法
现象 通过Markdown转换而来的mobi格式书籍都有一个大问题:字体偏淡,放在kindle上看对比度很差. 原因分析: 导致这种问题的原因,可能是因为在制作电子书的过程中,这些内容是被标注了彩色或 ...
- nyoj 202 红黑树
红黑树 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 什么是红黑树呢?顾名思义,跟枣树类似,红黑树是一种叶子是黑色果子是红色的树... 当然,这 ...
- NSObject中的isa到底是个什么?
首先看一下NSObject的定义: @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; } 官方解释:Eve ...
- HUD加载动画支持gif
下载地址 https://pan.baidu.com/s/1c2E7QW4
- 关于IOS网络通信的学习
最近由于需要在看关于网络通信方面的知识,所以在网上找了找关于网络解释方面的知识.找了半天没有找到一篇能详细解释通讯流程的,心里忍不住就万马奔腾了.没办法,谁让自己想学呢!于是又找了找,觉得没有满意的. ...
- iOS开发——生成二维码——工具类
啥也不说,直接上源码,拷过去就能用.生成二维码的工具类使用方法在ProduceQRCode.h里有示例说明 分别将下面的ProduceQRCode.h和ProduceQRCode.m对应的代码考到自己 ...
- iOS开发——音频篇——音效的播放
一.简单介绍 简单来说,音频可以分为2种 (1)音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中的“背景音乐”,一般播放时间较 ...
- MVVM学习笔记
MVVM学习笔记 1.MVVM的简介 MVVM模式是Model-View-ViewModel模式的简称,也就是由模型(Model).视图(View).视图模型(ViewModel),其目的是为了实现将 ...