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. 下拉框 select

    1.select 用来做什么? select 用于实现下来下拉列表,其 html 结构是这样的: <select name="city" id="city" ...

  2. Css3帧动画深入探寻,讲点项目中实际会碰到的问题

    先加个副标题XD --如何解决background-size为100%下处理@keyframes 正是在项目中遇到副标题,才引起我更深入的探寻 先略带一下基本的css3动画 css3的动画实现是通过属 ...

  3. 程序移植到AUTOCAD2013笔记

    1:需要引用acmgd.dll acdbmgd.dll,AcCoreMdg.dll, accui.dll 四个dll 2: 2010下的的acmgd.dll被拆分为acmgd.dll和AcCoreMd ...

  4. Linux硬盘镜像获取与还原(dd、AccessData FTK Imager)

    1.硬盘镜像获取工具:dd dd是Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换. 1.1 本地取数据 查看磁盘及分区 # fdisk - ...

  5. 5 - django-csrf-session&cookie

    目录 1 CSRF跨站请求伪造 1.1 CSRF攻击介绍及防御 1.2 防御CSRF攻击 1.2.1 验证 HTTP Referer 字段 1.2.2 在请求地址中添加 token 并验证 1.2.3 ...

  6. MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题 收藏 MySQL中涉及的几个字符集

    MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的.character-set-database:数据 ...

  7. 最详细的block底层

    主要讲述的要点: block 干什么用的 block 语法 block 底层实现 block 变量捕捉 block 的种类.在存储空间中的存储位置 block 循环引用 __block 在ARC 中 ...

  8. 一、springcloud服务注册、发现、调用(consul/eureka)

    1.Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全 ...

  9. Motan

    https://github.com/weibocom/motan/wiki/zh_userguide http://www.cnblogs.com/mantu/p/5885996.html(源码分析 ...

  10. tf.nn.embedding_lookup函数

    tf.nn.embedding_lookup(params, ids, partition_strategy='mod', name=None, validate_indices=True, max_ ...