BZOJ3196: Tyvj 1730 二逼平衡树
主席树的常数蜜汁优越,在BZOJ上跑了rnk1。
做法很简单,主席树套BIT。
1-3做法很简单,第四个和第五个做法转换成前两个就行了。
//BZOJ 3196 //by Cydiater //2016.12.10 #include <iostream> #include <queue> #include <map> #include <ctime> #include <cmath> #include <cstring> #include <string> #include <iomanip> #include <algorithm> #include <cstdlib> #include <cstdio> #include <bitset> #include <set> #include <vector> using namespace std; #define ll long long #define up(i,j,n) for(int i=j;i<=n;i++) #define down(i,j,n) for(int i=j;i>=n;i--) #define cmax(a,b) a=max(a,b) #define cmin(a,b) a=min(a,b) #define FILE "psh" const int MAXN=5e4+5; const int oo=0x3f3f3f3f; inline int read(){ char ch=getchar();int x=0,f=1; while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int N,M,root[MAXN<<1],arr[MAXN],fsort[MAXN<<1],rnum,cnt=0,top[2],preL[MAXN],preR[MAXN],tmpL[MAXN],tmpR[MAXN],TMP; struct Chair_man_Tree{ int son[2],sum; }t[MAXN<<6]; struct Query{ int opt,L,R,pos,K; }query[MAXN]; namespace solution{ inline int lowbit(int i){return ((i)&(-i));} int NewNode(int sum,int son0,int son1){ t[++cnt].sum=sum;t[cnt].son[0]=son0;t[cnt].son[1]=son1; return cnt; } void insert(int leftt,int rightt,int &Root,int last,int pos){ Root=NewNode(t[last].sum+1,t[last].son[0],t[last].son[1]); int mid=(leftt+rightt)>>1; if(leftt==rightt) return; if(pos<=mid) insert(leftt,mid,t[Root].son[0],t[last].son[0],pos); else insert(mid+1,rightt,t[Root].son[1],t[last].son[1],pos); } void PushTree(int L,int R){ top[0]=top[1]=0; preL[++top[0]]=root[(L-1==0?0:(N+L-1))]; preR[++top[1]]=root[R+N]; for(int j=L-1;j>=1;j-=lowbit(j)) preL[++top[0]]=root[j]; for(int j=R;j>=1;j-=lowbit(j)) preR[++top[1]]=root[j]; } void ChooseLeft(){ up(i,1,top[0])preL[i]=t[preL[i]].son[0]; up(i,1,top[1])preR[i]=t[preR[i]].son[0]; } void ChooseRight(){ up(i,1,top[0])preL[i]=t[preL[i]].son[1]; up(i,1,top[1])preR[i]=t[preR[i]].son[1]; } int Col(){ int sum=0; up(i,1,top[0])sum-=t[t[preL[i]].son[0]].sum; up(i,1,top[1])sum+=t[t[preR[i]].son[0]].sum; return sum; } void Prepare(){ rnum=N=read();M=read(); up(i,1,N)arr[i]=fsort[i]=read(); up(i,1,M){ query[i].opt=read(); if(query[i].opt==3){ query[i].pos=read();query[i].K=read(); fsort[++rnum]=query[i].K;continue; } query[i].L=read();query[i].R=read();query[i].K=read(); if(query[i].opt==4||query[i].opt==5) fsort[++rnum]=query[i].K; } sort(fsort+1,fsort+rnum+1); rnum=unique(fsort+1,fsort+rnum+1)-(fsort+1); up(i,1,N){ arr[i]=lower_bound(fsort+1,fsort+rnum+1,arr[i])-fsort; insert(1,rnum,root[i+N],root[i+N-1],arr[i]); } } int Rank(int leftt,int rightt,int pos){ if(leftt==rightt){ TMP=0; up(i,1,top[0])TMP-=t[preL[i]].sum; up(i,1,top[1])TMP+=t[preR[i]].sum; return 1; } int sum=0,mid=(leftt+rightt)>>1; sum=Col(); if(pos<=mid){ ChooseLeft(); return Rank(leftt,mid,pos); }else{ ChooseRight(); return sum+Rank(mid+1,rightt,pos); } } int Get(int leftt,int rightt,int rnk){ int sum,mid=(leftt+rightt)>>1; if(leftt==rightt) return fsort[leftt]; sum=Col(); if(rnk<=sum){ ChooseLeft(); return Get(leftt,mid,rnk); }else{ ChooseRight(); return Get(mid+1,rightt,rnk-sum); } } void Insert(int leftt,int rightt,int &Root,int pos,int tag){ if(!Root)Root=NewNode(0,0,0); t[Root].sum+=tag; if(leftt==rightt) return; int mid=(leftt+rightt)>>1; if(pos<=mid) Insert(leftt,mid,t[Root].son[0],pos,tag); else Insert(mid+1,rightt,t[Root].son[1],pos,tag); } void Slove(){ up(i,1,M){ int opt=query[i].opt; if(opt==1){ int L=query[i].L,R=query[i].R,K=lower_bound(fsort+1,fsort+rnum+1,query[i].K)-fsort; PushTree(L,R); printf("%d\n",Rank(1,rnum,K)); } if(opt==2){ int L=query[i].L,R=query[i].R,K=query[i].K; PushTree(L,R); printf("%d\n",Get(1,rnum,K)); } if(opt==3){ int Pos=query[i].pos,K=query[i].K; for(int j=Pos;j<=N;j+=lowbit(j)) Insert(1,rnum,root[j],arr[Pos],-1); arr[Pos]=lower_bound(fsort+1,fsort+rnum+1,K)-fsort; for(int j=Pos;j<=N;j+=lowbit(j)) Insert(1,rnum,root[j],arr[Pos],1); } if(opt==4){ int L=query[i].L,R=query[i].R,K=lower_bound(fsort+1,fsort+rnum+1,query[i].K)-fsort; PushTree(L,R); int rank=Rank(1,rnum,K); PushTree(L,R); printf("%d\n",Get(1,rnum,rank-1)); } if(opt==5){ int L=query[i].L,R=query[i].R,K=lower_bound(fsort+1,fsort+rnum+1,query[i].K)-fsort; PushTree(L,R); int rank=Rank(1,rnum,K); PushTree(L,R); printf("%d\n",Get(1,rnum,rank+TMP)); } } } } int main(){ using namespace solution; Prepare(); Slove(); return 0; }
BZOJ3196: Tyvj 1730 二逼平衡树的更多相关文章
- bzoj3196: Tyvj 1730 二逼平衡树 树套树
地址:http://www.lydsy.com/JudgeOnline/problem.php?id=3196 题目: 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec ...
- 【线段树套平衡树】【pb_ds】bzoj3196 Tyvj 1730 二逼平衡树
线段树套pb_ds里的平衡树,在洛谷OJ上测试,后三个测试点TLE #include<cstdio> #include<algorithm> #include<ext/p ...
- [bzoj3196]Tyvj 1730 二逼平衡树——线段树套平衡树
题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查 ...
- [bzoj3196][Tyvj 1730][二逼平衡树] (线段树套treap)
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查询k在 ...
- 【分块】bzoj3196 Tyvj 1730 二逼平衡树
分块 或 树套树. 在每个块中维护一个有序表,查询时各种二分,全都是分块的经典操作,就不详细说了. 块的大小定为sqrt(n*log2(n))比较快. #include<cstdio> # ...
- 【带修莫队】【权值分块】bzoj3196 Tyvj 1730 二逼平衡树
这题用了三种算法写: 分块+二分:O(n*sqrt(n*log(n)) 函数式权值分块:O(n*sqrt(n)) 带修莫队+权值分块:O(n5/3) 结果……复杂度越高的实际上跑得越快……最后这个竟然 ...
- 【函数式权值分块】【分块】bzoj3196 Tyvj 1730 二逼平衡树
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...
- bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1807 Solved: 772[Submit][Stat ...
- BZOJ 3196: Tyvj 1730 二逼平衡树( 树套树 )
这道题做法应该很多吧.... 我用了线段树套treap.... -------------------------------------------------------------------- ...
随机推荐
- Android 手机卫士--导航界面3、4和功能列表界面跳转逻辑处理
刚刚花了一点时间,将导航界面3.4的布局和相应的跳转逻辑写了一下: Setup3Activity代码如下: /** * Created by wuyudong on 2016/10/10. */ pu ...
- UITableView cell复用出错问题 页面滑动卡顿问题 & 各杂七杂八问题
UITableView 的cell 复用机制节省了内存,但是有时对于多变的自定义cell,重用时会出现界面出错(例如复用出错,出现cell混乱重影).滑动卡顿等问题,这里只简单敲下几点复用出错时的解决 ...
- win7 64位下vs不能以管理员身份运行的问题解决
开发机上安装了VS6.0/2008/2010/2013,之前一直是正常的,突然莫名其妙不能以管理员身份运行(除了VS6),报"application cannot start.", ...
- Ctrl-A全选这点事(C#,WinForm)
所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便.Windows的软件基本都是这样.可为什么我们自己制作的WinForm就默认不是这样呢?谁知道呢,可能是WinForm饱受诟病,要改 ...
- Mac上安装MySQL记录
下载最新的MySQL社区版 官方下载地址:http://dev.mysql.com/downloads/mysql/ 为了安装更方便,建议下载dmg安装包. 最新的版本是5.7.9. 安装MySQL ...
- django 一些相关问题
这两天在处理django项目时碰到一些问题 1.ur路径设置要忽略大小写,查找了很多资料,都没有发现相关的介绍,最后在谷歌上找到一个解决方案,https://groups.google.com/for ...
- 初识SpringMvc
初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...
- 谈c++ pb_ds库(二) 红黑树大法好
厉害了,没想到翻翻pb_ds库看到这么多好东西,封装好的.现成的splay.红黑树.avl... 即使不能在考场上使用也可以用来对拍哦 声明/头文件 #include <ext/pb_ds/tr ...
- 使用iTerm2快捷连接SSH
iTerm2和Mac自带的Terminal差不多,但是功能更强大,无论透明度.字体.配色.分屏等都可以设置,除了这些花哨的功能外,最近新学了一招,就是可以通过Profiles的设置打开就执行写好的脚本 ...
- Linux ——————用Secure传文件时直接拖了文件用的是AssIC导致linux那边直乱码
如下: 解决办法: 直接删除.