http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112

树套树,线段树套splay或者主席树套树状数组,我抄了一下hzwer的代码在zoj上过不了因为zoj的数据比较大不能像hzwer那种写法一样写成nlognlogn的空间。

没有bzoj权限号也不想再写一遍,随便放个代码在这里好惹。

https://www.cnblogs.com/kuangbin/p/3308118.html  <-----这个写法的空间复杂度可以过(就是把树状数组放到外面直接搞),所以ctm我为什么抄hzwer的代码。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
const int maxn=;
using namespace std;
char s[]={}; int n,m;
int val[maxn]={},a[maxn]={},b[maxn]={},k[maxn]={};
int num[maxn*]={},tot=,flag[maxn]={};
int sum[maxn*],lc[maxn*],rc[maxn*];
int rt[maxn]={},siz=;
int ll[maxn]={},rr[maxn]={},xx,yy;
void build(int l,int r,int las,int &rot,int z,int v){
rot=++siz; sum[rot]=sum[las]+v; lc[rot]=lc[las]; rc[rot]=rc[las];
if(l==r)return;
int mid=(l+r)/;
if(z<=mid)build(l,mid,lc[las],lc[rot],z,v);
else build(mid+,r,rc[las],rc[rot],z,v);
}
int query(int l,int r,int z){
if(l==r)return l;
int suml=,sumr=;
for(int i=;i<=xx;i++)suml+=sum[lc[ll[i]]];
for(int i=;i<=yy;i++)sumr+=sum[lc[rr[i]]];
int mid=(l+r)/;
if(sumr-suml>=z){
for(int i=;i<=xx;i++)ll[i]=lc[ll[i]];
for(int i=;i<=yy;i++)rr[i]=lc[rr[i]];
return query(l,mid,z);
}
else{
for(int i=;i<=xx;i++)ll[i]=rc[ll[i]];
for(int i=;i<=yy;i++)rr[i]=rc[rr[i]];
return query(mid+,r,z-(sumr-suml));
}
}
int main(){
int T;scanf("%d",&T);
while(T-->){
scanf("%d%d",&n,&m);
tot=;siz=;
memset(rt,,sizeof(rt));memset(sum,,sizeof(sum));
memset(rc,,sizeof(rc));memset(lc,,sizeof(lc));
memset(flag,,sizeof(flag));
for(int i=;i<=n;i++){scanf("%d",&val[i]);num[++tot]=val[i];}
for(int i=;i<=m;i++){
scanf("%s",s);scanf("%d%d",&a[i],&b[i]);
if(s[]=='C')num[++tot]=b[i];
else{scanf("%d",&k[i]);flag[i]=;}
}
sort(num+,num+tot+);
tot=unique(num+,num+tot+)-num-;
for(int i=;i<=n;i++){
val[i]=lower_bound(num+,num++tot,val[i])-num;
for(int j=i;j<=n;j+=(j&-j))
build(,tot,rt[j],rt[j],val[i],);
}
for(int i=;i<=m;i++){
if(flag[i]){
xx=;yy=;a[i]--;//cout<<a[i]<<b[i]<<endl;
for(int j=a[i];j;j-=(j&-j))ll[++xx]=rt[j];
for(int j=b[i];j;j-=(j&-j))rr[++yy]=rt[j];
printf("%d\n",num[query(,tot,k[i])]);
}
else{
for(int j=a[i];j<=n;j+=(j&-j))build(,tot,rt[j],rt[j],val[a[i]],-);
val[a[i]]=lower_bound(num+,num++tot,b[i])-num;
for(int j=a[i];j<=n;j+=(j&-j))build(,tot,rt[j],rt[j],val[a[i]],);
}
}
}
return ;
}

并无软用的代码,嘻嘻

所以直接找可持久化线段树的题好了,找主席树出来的都是什么jb。

ZOJ2112 BZOJ1901 Dynamic Rankings 树套树 带修改的区间第k小的更多相关文章

  1. ZOJ 2112 Dynamic Rankings(带修改的区间第K大,分块+二分搜索+二分答案)

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

  2. [主席树]ZOJ2112 && BZOJ1901 Dynamic Rankings

    题意:n个数,q个询问 (n<=50000, q<=10000) Q x y z 代表询问[x, y]区间里的第z小的数 C x y    代表将(从左往右数)第x个数变成y 上篇介绍了在 ...

  3. 少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小

    少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写 ...

  4. 【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 ...

  5. bzoj 1901: Zju2112 Dynamic Rankings(树套树)

    1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...

  6. ZOJ -2112 Dynamic Rankings 主席树 待修改的区间第K大

    Dynamic Rankings 带修改的区间第K大其实就是先和静态区间第K大的操作一样.先建立一颗主席树, 然后再在树状数组的每一个节点开线段树(其实也是主席树,共用节点), 每次修改的时候都按照树 ...

  7. 区间第K小——可持久化线段树模板

    概念 可持久化线段树又叫主席树,之所以叫主席树是因为这东西是fotile主席创建出来的. 可持久化数据结构思想,就是保留整个操作的历史,即,对一个线段树进行操作之后,保留访问操作前的线段树的能力. 最 ...

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

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

  9. ZOJ2112 Dynamic Rankings (线段树套平衡树)(主席树)

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

随机推荐

  1. 差分约束系统+输出路径(I - Advertisement POJ - 1752 )

    题目链接:https://cn.vjudge.net/contest/276233#problem/I 题目大意:输入k和n,然后输入n行,每一次输入两个数,代表开端和结尾,如果这个区间内点的个数大于 ...

  2. 富文本存储型XSS的模糊测试之道

    富文本存储型XSS的模糊测试之道 凭借黑吧安全网漏洞报告平台的公开案例数据,我们足以管中窥豹,跨站脚本漏洞(Cross-site Script)仍是不少企业在业务安全风险排查和修复过程中需要对抗的“大 ...

  3. Hibernate5笔记5--关联关系映射

    关联关系映射: 关联关系,是使用最多的一种关系,非常重要.在内存中反映为实体关系,映射到DB中为主外键关系.实体间的关联,即对外键的维护.关联关系的发生,即对外键数据的改变. 外键:外面的主键,即,使 ...

  4. wamp中mysql安装时能启动,重启后无法启动的解决办法

    第一次安装wamp之后,所有服务可以正常使用,但是重启之后wamp的图标就变成黄色的了,重装了也这样 查看一下错误日志: 日志显示的错误是这样的: 日志提示可能是3306端口被占用的错误,那来看一下是 ...

  5. 连续的if语句

    use_relu=0 use_tanh=2 a = 2 if use_relu else (1 if use_tanh else 0)#如果use_relu不等于0,则a等于2:如果use_relu等 ...

  6. Ubuntu server 搭建Git server【转】

    转自:http://www.cnblogs.com/candle806/p/4064610.html Ubuntu server 搭建Git server,git相比svn,最主要就是分布式了,每个客 ...

  7. 十二、springcloud之展示追踪数据 Sleuth+zipkin

    一.Zipkin简介 Zipkin是Twitter的一个开源项目,它基于Google Dapper实现.我们可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的REST API接口来辅助我们 ...

  8. 02 How to Write Go Code 如何编写go语言代码

    How to Write Go Code   如何编写go语言代码 Introduction   介绍 Code organization  组织代码 Overview  概述 Workspaces  ...

  9. Zookeeper原理架构与搭建

    一.Zookeeper到底是什么!? 学一个东西,不搞明白他是什么东西,哪还有心情学啊!! 首先,Zookeeper是Apache的一个java项目,属于Hadoop系统,扮演管理员的角色. 然后看到 ...

  10. Python线程和进程

    一.进程 程序并不能单独和运行只有将程序装载到内存中,系统为他分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别在于:程序是指令的集合,它是进程的静态描述文本:进程是程序的一次执行活动, ...