Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap
1901: Zju2112 Dynamic Rankings
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 6471 Solved: 2697
[Submit][Status][Discuss]
Description
给定一个含有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。
Input
对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。
Output
Sample Input
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3
Sample Output
6
HINT
20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。
Source
- #include<bits/stdc++.h>
- using namespace std;
- #define MAXN 10010
- struct node
- {
- int left,right,val,size,rnd,count;
- }tree[MAXN*];
- int tmp,SIZE,root[MAXN*],a[MAXN];
- int read()
- {
- int s=,fh=;char ch=getchar();
- while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
- while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
- return s*fh;
- }
- void Update(int k){tree[k].size=tree[tree[k].left].size+tree[tree[k].right].size+tree[k].count;}
- void Lturn(int &k){int t=tree[k].right;tree[k].right=tree[t].left;tree[t].left=k;tree[t].size=tree[k].size;Update(k);k=t;}
- void Rturn(int &k){int t=tree[k].left;tree[k].left=tree[t].right;tree[t].right=k;tree[t].size=tree[k].size;Update(k);k=t;}
- void Insert(int &k,int x)
- {
- if(k==)
- {
- SIZE++;k=SIZE;
- tree[k].val=x;tree[k].size=tree[k].count=;tree[k].rnd=rand();
- return;
- }
- tree[k].size++;
- if(x==tree[k].val){tree[k].count++;return;}
- if(x<tree[k].val){Insert(tree[k].left,x);if(tree[tree[k].left].rnd<tree[k].rnd)Rturn(k);}
- else {Insert(tree[k].right,x);if(tree[tree[k].right].rnd<tree[k].rnd)Lturn(k);}
- }
- void Del(int &k,int x)
- {
- if(k==)return;
- if(tree[k].val==x)
- {
- if(tree[k].count>){tree[k].size--;tree[k].count--;return;}
- if(tree[k].left*tree[k].right==)k=tree[k].left+tree[k].right;
- else if(tree[tree[k].left].rnd<tree[tree[k].right].rnd){Rturn(k);Del(k,x);}
- else {Lturn(k);Del(k,x);}
- }
- else if(x<tree[k].val){tree[k].size--;Del(tree[k].left,x);}
- else {tree[k].size--;Del(tree[k].right,x);}
- }
- void Find(int k,int x)
- {
- if(k==)return;
- if(tree[k].val<=x){tmp+=(tree[tree[k].left].size+tree[k].count);Find(tree[k].right,x);}
- else Find(tree[k].left,x);
- }
- void Build(int k,int l,int r,int lr,int B)
- {
- Insert(root[k],B);
- if(l==r)return;
- int mid=(l+r)/;
- if(lr<=mid)Build(k*,l,mid,lr,B);
- else Build(k*+,mid+,r,lr,B);
- }
- void Query(int k,int l,int r,int ql,int qr,int Q)
- {
- if(l==ql&&r==qr){Find(root[k],Q);return;}
- int mid=(l+r)/;
- if(qr<=mid)Query(k*,l,mid,ql,qr,Q);
- else if(ql>mid)Query(k*+,mid+,r,ql,qr,Q);
- else {Query(k*,l,mid,ql,mid,Q);Query(k*+,mid+,r,mid+,qr,Q);}
- }
- void Change(int k,int l,int r,int lr,int C1,int C2)
- {
- Del(root[k],C1);
- Insert(root[k],C2);
- if(l==r)return;
- int mid=(l+r)/;
- if(lr<=mid)Change(k*,l,mid,lr,C1,C2);
- else Change(k*+,mid+,r,lr,C1,C2);
- }
- int main()
- {
- int n,m,i,l,r,k,L,R,mid,ii,ans;
- char zs;
- n=read();m=read();
- for(i=;i<=n;i++)a[i]=read();
- for(i=;i<=n;i++)Build(,,n,i,a[i]);
- for(i=;i<=m;i++)
- {
- scanf("\n%c",&zs);
- if(zs=='Q')
- {
- l=read();r=read();k=read();
- L=;R=;ans=;
- while(L<=R)
- {
- mid=(L+R)/;
- tmp=;
- Query(,,n,l,r,mid);
- if(tmp<k)L=mid+;
- else {ans=mid;R=mid-;}
- //else {ans=mid;break;}
- //if(tmp>=k)R=mid-1;
- //else L=mid+1;
- }
- //printf("%d\n",L);
- printf("%d\n",ans);
- }
- else
- {
- ii=read();k=read();
- Change(,,n,ii,a[ii],k);
- a[ii]=k;
- }
- }
- fclose(stdin);
- fclose(stdout);
- return ;
- }
Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap的更多相关文章
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7143 Solved: 2968[Su ...
- BZOJ 1901: Zju2112 Dynamic Rankings( BIT 套 BST )
BIT 套 splay 其实也是不难...每个 BIT 的结点保存一颗 splay , 询问就二分答案然后判断rank... ------------------------------------- ...
- bzoj 1901: Zju2112 Dynamic Rankings(树套树)
1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...
- BZOJ 1901: Zju2112 Dynamic Rankings( 树状数组套主席树 )
裸的带修改主席树.. 之前用BIT套Splay( http://www.cnblogs.com/JSZX11556/p/4625552.html )A过..但是还是线段树好写...而且快(常数比平衡树 ...
- Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6321 Solved: 2628[Su ...
- bzoj 1901: Zju2112 Dynamic Rankings -- 主席树,树状数组,哈希
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...
- BZOJ 1901 Zju2112 Dynamic Rankings
树阵主席设置树.维护间隔动态K大. .. ZOJ到空间太小,太大,仅仅能到BZOJ上交 1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memor ...
- 【题解】BZOJ 1901: Zju2112 Dynamic Rankings
题目传送门(权限题) 一道类似的非权限题 题意 N个数的序列,每次修改一个数或者询问区间里的第K小.可以离线. 简要做法 假如要求在线,可以树状数组套个线段树~ 但是这题是可以离线的,就可以乱搞整体二 ...
- BZOJ 1901: Zju2112 Dynamic Rankings 区间k大 带修改 在线 线段树套平衡树
之前写线段树套splay数组版..写了6.2k..然后弃疗了.现在发现还是很水的..嘎嘎.. zju过不了,超时. upd:才发现zju是多组数据..TLE一版才发现.然后改了,MLE...手写内存池 ...
随机推荐
- Universal Naming Convention (UNC)
Quote from: http://compnetworking.about.com/od/windowsnetworking/g/unc-name.htm Definition: UNC is a ...
- 【ADO.NET】8、DataSet的使用
一.DataSet的查询 SqlDataReader 适用于大型数据的读取,它是一条一条的读取,读取出来的数据是存放在服务器上当正在读取数据的时候,突然与服务中断,将无法读取后面的数据DataSet ...
- Debian vim没有颜色的解决办法
最近在研究Linux kali 3.12-kali1-amd64 Debian 3.12.6-2kali1 x86_64 GNU/Linux Debian的内核 发现vim竟然没有颜色,root或 ...
- thinkphp 杂乱笔记(1)
部署模式可用两个单入口表示前后台thinkphpUploadspublic Home(前台)Admin(后台)index.php(前台入口文件)admin.php(后台入口文件)上面两个项目目录 也可 ...
- [CLR VIA C#] chapter2 building,packaging,deploying, and administering
今天整理一下 assembly, 总感觉第一章 到 第三章 没怎么仔细看, 导致后面作者说前面说过的, 我就心里不舒服, 前面3章很干很涩, 好好啃啃, 先作一些简单笔记, 最后再来 整体整理, 反正 ...
- “父窗口拖动的时候Popup不随着父窗口移动”问题的解决方案
我们用WPF用的Popup时候会发现,当 StaysOpen=True 的时候,因为Popup不会消失,在父窗口移走的时候Popup仍旧在原地...作者在国外网站上无意间发现了这个解决方案,拿出来给大 ...
- zend studio 9.0.4 安装破解
转载于 http://www.geekso.com/ZendStudio9-key 注册破解步骤第一步:如果已经安装过Zend Studio 9.0.4的,请打开Zend Studio 9.0.4,在 ...
- STM32下载方法
一.JLINK下载方法 1.硬件设置 Boot0,Boot1 = 0,*(测试通过) Boot0,Boot1 = 1,0或者0,1(未测试) 2.软件设置 MDK设置 ① 选择Project -> ...
- WiFi无线模块学习1——HLK-M30使用
产品概述 概述: 通过该模块,传统的串口设备在不需要更改任何配置的情况下,即可通过Internet 网络传输自己的数据.为用户的串口设备提供完整快读的解决方案. 技术参数 可查询技术规格表 主要应用领 ...
- web服务编码设置
response设置编码. <%@ page contentType="text/html;charset=UTF-8" %> 是服务器端java程序运行时的输出编码, ...