线段树套pb_ds里的平衡树,在洛谷OJ上测试,后三个测试点TLE

#include<cstdio>
#include<algorithm>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define N 50010
#define INF 2147483647
using namespace std;
using namespace __gnu_pbds;
typedef pair<int,int> Point;
typedef tree<Point,null_type,less<Point>,rb_tree_tag,tree_order_statistics_node_update> rb_tree;
typedef rb_tree::iterator ITER;
rb_tree T[N<<2];
int a[N],tags[N],tag,n,m;
void buildtree(int rt,int l,int r)
{
if(l==r)
{
T[rt].insert(Point(a[l],l));
return;
}
int m=(l+r>>1);
buildtree(rt<<1,l,m);
buildtree(rt<<1|1,m+1,r);
T[rt]=T[rt<<1];
for(ITER it=T[rt<<1|1].begin();it!=T[rt<<1|1].end();++it)
T[rt].insert(*it);
}
int Rank(int v,int TAG,int ql,int qr,int rt,int l,int r)
{
if(ql<=l&&r<=qr)
return T[rt].order_of_key(Point(v,TAG));
int m=(l+r>>1),res=0;
if(ql<=m) res+=Rank(v,TAG,ql,qr,rt<<1,l,m);
if(m<qr) res+=Rank(v,TAG,ql,qr,rt<<1|1,m+1,r);
return res;
}
int Pre(int v,int ql,int qr,int rt,int l,int r)
{
if(ql<=l&&r<=qr)
{
ITER it=T[rt].lower_bound(Point(v,0));
if(it==T[rt].begin()) return -INF;
--it;
return (*it).first;
}
int m=(l+r>>1),res=-INF;
if(ql<=m) res=max(res,Pre(v,ql,qr,rt<<1,l,m));
if(m<qr) res=max(res,Pre(v,ql,qr,rt<<1|1,m+1,r));
return res;
}
int Nex(int v,int ql,int qr,int rt,int l,int r)
{
if(ql<=l&&r<=qr)
{
ITER it=T[rt].upper_bound(Point(v,INF));
if(it==T[rt].end())
return INF;
return (*it).first;
}
int m=(l+r>>1),res=INF;
if(ql<=m) res=min(res,Nex(v,ql,qr,rt<<1,l,m));
if(m<qr) res=min(res,Nex(v,ql,qr,rt<<1|1,m+1,r));
return res;
}
void Update(int p,int v,int rt,int l,int r)
{
T[rt].erase(Point(a[p],tags[p]));
T[rt].insert(Point(v,tag));
if(l==r) return;
int m=(l+r>>1);
if(p<=m) Update(p,v,rt<<1,l,m);
else Update(p,v,rt<<1|1,m+1,r);
}
int Kth(int K,int ql,int qr)
{
int l=0,r=100000000;
while(l<r)
{
int m=(l+r>>1);
if(Rank(m,INF,ql,qr,1,1,n)>=K)
r=m;
else
l=m+1;
}
return l;
}
int main()
{
// freopen("bzoj3196.in","r",stdin);
int op,x,y,z;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
tags[i]=i;
}
tag=n;
buildtree(1,1,n);
// for(int i=1;i<=n*4;++i)
// printf("%d ",(*T[i].begin()).second);
// puts("");
for(;m;--m)
{
scanf("%d%d%d",&op,&x,&y);
if(op==1)
{
scanf("%d",&z);
printf("%d\n",Rank(z,0,x,y,1,1,n)+1);
}
else if(op==2)
{
scanf("%d",&z);
printf("%d\n",Kth(z,x,y));
}
else if(op==3)
{
++tag;
Update(x,y,1,1,n);
a[x]=y;
tags[x]=tag;
}
else if(op==4)
{
scanf("%d",&z);
printf("%d\n",Pre(z,x,y,1,1,n));
}
else
{
scanf("%d",&z);
printf("%d\n",Nex(z,x,y,1,1,n));
}
}
return 0;
}

【线段树套平衡树】【pb_ds】bzoj3196 Tyvj 1730 二逼平衡树的更多相关文章

  1. bzoj3196: Tyvj 1730 二逼平衡树 树套树

    地址:http://www.lydsy.com/JudgeOnline/problem.php?id=3196 题目: 3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec ...

  2. [bzoj3196]Tyvj 1730 二逼平衡树——线段树套平衡树

    题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查 ...

  3. BZOJ3196: Tyvj 1730 二逼平衡树

    传送门 主席树的常数蜜汁优越,在BZOJ上跑了rnk1. 做法很简单,主席树套BIT. 1-3做法很简单,第四个和第五个做法转换成前两个就行了. //BZOJ 3196 //by Cydiater / ...

  4. 【分块】bzoj3196 Tyvj 1730 二逼平衡树

    分块 或 树套树. 在每个块中维护一个有序表,查询时各种二分,全都是分块的经典操作,就不详细说了. 块的大小定为sqrt(n*log2(n))比较快. #include<cstdio> # ...

  5. [bzoj3196][Tyvj 1730][二逼平衡树] (线段树套treap)

    Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排名 2.查询区间内排名为k的值 3.修改某一位值上的数值 4.查询k在 ...

  6. 【带修莫队】【权值分块】bzoj3196 Tyvj 1730 二逼平衡树

    这题用了三种算法写: 分块+二分:O(n*sqrt(n*log(n)) 函数式权值分块:O(n*sqrt(n)) 带修莫队+权值分块:O(n5/3) 结果……复杂度越高的实际上跑得越快……最后这个竟然 ...

  7. 【函数式权值分块】【分块】bzoj3196 Tyvj 1730 二逼平衡树

    #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ...

  8. bzoj 3196 Tyvj 1730 二逼平衡树(线段树套名次树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1807  Solved: 772[Submit][Stat ...

  9. bzoj 3196/ Tyvj 1730 二逼平衡树 (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description ...

随机推荐

  1. calc常用

    Mod:求模(整数相除求余数), And:按位与 Or:按位或 Xor:按位异或 Lsh:按位左移 Not:按位取反 Int:取整数部分

  2. map创建JSONObject对象

    public static void mapToJSONObject(){ Map<String, Object> map = new HashMap<String,Object&g ...

  3. [Docker] docker 基础学习笔记3(共6篇)

    首先我们安装好了ssh server之后, 我们需要将这个容器commit,然后启动这个被commit的image. 启动方式: docker run -d -p 2222:22 /usr/sbin/ ...

  4. ios调用系统相册、相机 显示中文标题、本地化多语言支持

    因为调用系统相册.相机需要显示中文,所以搞了半天才知道是在Project->info->Custom ios Target Properties 添加 Localizations 并加入C ...

  5. Java Sha1 加密算法

    //下面四个import放在类名前面 包名后面 //import java.io.UnsupportedEncodingException; //import java.security.Messag ...

  6. hdu5442 Favorite Donut

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5442 题目大意:给你一个长度为n的字符串,将它首尾相连成环.问你这个环上找一个长度为n的字典序最大的串 ...

  7. [2015hdu多校联赛补题]hdu5384 Danganronpa

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384 题意:函数f(A, B)定义:A.B为字符串,f(A, B)为A中有多少个不同的B(ex:f(& ...

  8. C++基础-02

    函数重载 - 函数重载依据参数列表,而不依据返回类型 - 重载函数匹配规则: 精确匹配,不需要类型转换,但可以数组名到指针.函数名到指针和T到const T 提升匹配,bool.short.char到 ...

  9. WinForm 使用 HttpUtility

    在 Visual C# 中使用 HttpUtility 是无效的,即使添加了命名空间 System.Web,是因为需要在引用中添加 System.Web.dll. 可是没有 System.Web.dl ...

  10. SQL Server日期时间格式转换字符串详解 (详询请加qq:2085920154)

    在SQL Server数据库中,SQL Server日期时间格式转换字符串可以改变SQL Server日期和时间的格式,是每个SQL数据库用户都应该掌握的.本文我们主要就介绍一下SQL Server日 ...