zoj 2112 Dynamic Rankings (主席树+树状数组)

论文阅读笔记(一)细粒度图像检索 0、参考文献 [1]见微知著 http://geek.youkuaiyun.com/news/detail/191718 [2]Xiu-Shen Wei 《Selective Convolutional Descriptor Aggregation for Fine-Grained Image Retrieval》 [3]Lingxi Xie 《Fine-Grained Image Search》 1... 阅读详情

题意:

思路:

     动态区间第k大,我用的是主席树+树状数组,这个不是最优解,因为空间很吃紧,正解应该是整体二分,CDQ分治什么的,然而现在不会,会了补上写法
     那么我们来说一下怎么用主席树过,首先我们发现,假如我们改变了x,那么对应就影响了x,x+1,x+2,…..n这几颗树,暴力地每个开一个时间空间都不允许,那么我们可以用树状数组记录,因为树状数组向上跳的过程是logn的,我们每个树开的空间也是lognlogn的,所以空间复杂度就是O(nlogn+mlognlogn)O(nlogn+mlognlogn),时间复杂度是O(nlogn+mlognlogn)O(nlogn+mlognlogn)这个我们很明显是能够接受的,如果我们把某个节点由x变成y,那么我们新建立的树,减x加y,这样就能维护变化了,到了最后统计的时候,静态的主席树+变化值就是现在的值。
     总结一下,首先我们和静态一样,先建立主席树,然后开一个数组,让这个数组和树状数组一样向上跳,每个节点维护的是根节点,然后统计的时候,在静态基础上加上树状数组统计的变化即可,因为树状数组只是维护的根节点,当我们需要统计某一层的时候,就不知道位置了,就需要use数组记录,每次不断更新use数组即可。
     你可能会说,这样use数组不会出现重叠部分吗?会,但是因为我们要的是u到v部分,产生的重叠部分已经减去了,所以最后结果还是对的

错误及反思:

空间需要40倍。。。use数组是看了别人的博客才学会的。。。

代码:

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
#define lson l,m
#define rson m+1,r
const int N = 50100;
int sum[40*N],ls[N*40],rs[N*40],a[N],root[N],cnt,n,que,T,bit[N],use[N];
vector<int> v;
struct Q{
    bool k; int l,r,d;
}q[10100];

int getid(int x){return lower_bound(v.begin(),v.end(),x)-v.begin()+1;}

void init(){
    cnt=0; v.clear();
}

int build(int l,int r){
    int rt=++cnt;
    ls[rt]=rt,rs[rt]=rt,sum[rt]=0;
    if(l==r) return rt;
    int m=(l+r)/2;
    ls[rt]=build(lson);
    rs[rt]=build(rson);
    return rt;
}

int update(int pre,int x,int val,int l,int r){
    int rt=++cnt;
    ls[rt]=ls[pre],rs[rt]=rs[pre],sum[rt]=sum[pre]+val;
    if(l==r) return rt;
    int m=(l+r)/2;
    if(x<=m) ls[rt]=update(ls[pre],x,val,lson);
    else rs[rt]=update(rs[pre],x,val,rson);
    return rt;
}

int Sum(int x){
    int ret=0;
    while(x){
        ret+=sum[ls[use[x]]];
        x-=x&-x;
    }
    return ret;
}

void add(int x,int p,int d){
    while(x<=n){
        bit[x]=update(bit[x],p,d,1,v.size());
        x+=x&-x;
    }
}

int query(int u, int v, int lr, int rr, int l, int r, int k){
    if(l==r) return l;
    int m=(l+r)>>1;
    int tmp=Sum(v)-Sum(u)+sum[ls[rr]]-sum[ls[lr]];
    if(tmp>=k){
        for(int i=u;i;i-=i&-i)
            use[i]=ls[use[i]];
        for(int i=v;i;i-=i&-i)
            use[i]=ls[use[i]];
        return query(u, v, ls[lr], ls[rr], lson, k);
    }
    else{
        for(int i=u;i;i-=i&-i)
            use[i]=rs[use[i]];
        for(int i=v;i;i-=i&-i)
            use[i]=rs[use[i]];
        return query(u, v, rs[lr], rs[rr], rson, k-tmp);
    }
}

int main(){
    scanf("%d",&T);
    while(T--){
        init();
        scanf("%d%d",&n,&que);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            v.push_back(a[i]);
        }
        for(int i=1;i<=que;i++){
            char ta[10]; scanf("%s",ta);
            if(ta[0]=='C'){
                int l,r; scanf("%d%d",&l,&r);
                q[i].k=0; q[i].l=l; q[i].d=r;
                v.push_back(r);
            }
            else{
                int l,r,k; scanf("%d%d%d",&l,&r,&k);
                q[i].k=1; q[i].l=l; q[i].r=r; q[i].d=k;
            }
        }
        sort(v.begin(),v.end()),v.erase(unique(v.begin(),v.end()),v.end());
        root[0]=build(1,v.size());
        for(int i=1;i<=n;i++) root[i]=update(root[i-1],getid(a[i]),1,1,v.size());
        for(int i=1;i<=n;i++) bit[i]=root[0];
        for(int i=1;i<=que;i++){
            if(q[i].k){
                for(int j=q[i].l-1;j;j-=j&-j) use[j]=bit[j];
                for(int j=q[i].r;j;j-=j&-j) use[j]=bit[j];
                printf("%d\n",v[query(q[i].l-1,q[i].r,root[q[i].l-1],root[q[i].r],1,v.size(),q[i].d)-1]);
            }
            else{
                add(q[i].l,getid(a[q[i].l]),-1);
                add(q[i].l,getid(q[i].d),1);
                a[q[i].l]=q[i].d;
            }
        }
    }
}
计算机控制技术及应用 《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。 立即下载

相关推荐

LabVIEW与MySQL的连接:软件下载与安装至UDL文件创建全过程

依据个人经验编辑的十分完备的使用教程

tiaowudexiaoyu的博客 5574

lower_bound 和 upper_bound的使用指南

#include <iostream> // std::cout #include <algorithm> // std::lower_bound, std::upper_bound, std::sort #include <vector> // std::vector #include<functional> //using namespace std; int main() { int myints[] = { 10,20.

SenPaul的博客 422

拯救者R9000P-2021-AMD5800H黑苹果EFI配置与优化指南

本文详细介绍了在联想拯救者R9000P 2021款(搭载AMD锐龙7 5800H处理器)上安装和优化黑苹果系统的完整指南。内容涵盖EFI配置、OpenCore引导设置、关键驱动(如NootedRed核显驱动)的调整,以及安装后的性能调优与常见问题解决,旨在帮助开发者和极客用户在这款游戏本上搭建稳定可用的macOS开发环境。

weixin_29291069的博客 287

lower_bound和upper_bound的用法

1. 两者的参数序列应该是按照升序排序的;2. 两个函数都是用二分法查找指定元素在序列中的位置;3. 两个函数的返回值类型为迭代器;4. 当要查找的值不在序列中时,返回值为按顺序应该插入到该序列的位置,这时两个函数的返回值是一样的;&gt;       如:序列 v=【1,3,5,7,9】,x=4,&gt;       lower_bound(v.begin(),v.end(),x) - v.be...

Lutx的专栏 550

高性能优化的本质

在很早之前,处理器性能的提升一般是通过减小元器件的尺寸,增加元器件的数量,提高主频来实现,这也是摩尔定律所说的,但是由于功耗的影响,主频不能一直增加。后来,由于英伟达的GPU的并行计算的出现,逐渐打破摩尔定律,人们利用多核,SIMD,SIMT来处理大量相同计算的数据,这极大的提高了效率。计算机的算力得到了巨大的提升,但是并行是困难的,对于有数据依赖的程序来说,处理并行是一件及其困难的事,但对于一些简单的数学库的计算,并行的实现相对简单。

发狂的小花的博客 274

Oracle EBS 寄销/VMI(2)-->采购篇

上篇有一部分设置需要建BPA后,将BPA编号与批准的供应商相关联.     本篇主要是讲的内容:一揽子采购协议-->准标采购订单-->收接入库-->子库转移-->创建冲减通知-->'按接收开票' 自动开票程序 1. PO-->采购订单à采购订单 创建一揽子采购协议,确定物料

陈显平的专栏-Oracle EBS 1万+

zoj2112--Dynamic Rankings(树状数组+主席树)

题目连接:zoj2112 给出n个点,两种操作,Q:询问在[l,r]内的第k大的数,C:更改第i个数位x 动态的询问第k大,使用树状数组修改和查询前缀和。 因为给出的空间小,所以可以将n个点做成一个静态的主席树,然后对于修改的值,在另一个主席树中修改,查询时同时查询这两个主席树就可以了。 #include #include #include using namespace std ;

随风的专栏 1910

新手必看:C#调用YOLO模型完成图片/视频目标检测(上位机版)

新手学习C#调用YOLO模型,核心是先把基础流程跑通,再逐步优化。图片检测是基础,视频检测就是在图片的基础上加循环和线程,而上位机的实际项目,就是在这个基础上适配工业硬件和业务需求。本文的代码都是新手能直接复制运行的,如果你运行时遇到问题,先检查前期准备是否到位,再看避坑指南。记住,新手别追求一步到位,先实现功能,再慢慢优化性能和界面。等你能熟练调用YOLO模型后,再去研究模型训练、量化优化等进阶内容,会轻松很多。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 987

有关lower_bound()函数的使用

lower_bound()函数需要加载头文件#include,其基本用途是查找有序区间中第一个大于或等于某给定值的元素的位置,其中排序规则可以通过二元关系来表示。   函数原型:template ForwardIterator lower_bound( ForwardIterator _First, ForwardIterator _Last,

开飞机的小毛驴儿 4307

LPDDR6 Efficiency Mode 技术探讨

LPDDR6 Efficiency Mode 技术探讨

zilan23的博客 1159

【YOLO】Mask Proto分支理解

Mask Proto分支通过解耦全局原型与实例参数,在保持YOLO实时性的同时实现精准分割。其技术核心在于利用多尺度特征生成可组合的原型,结合动态系数适应不同目标形态。未来可进一步融合Transformer的注意力机制,增强对复杂场景的建模能力。

浩瀚之水的专栏 476

ZOJ 2112 Dynamic Rankings (动态第k大,树状数组套主席树)★★

这题是动态第k大。   如果是不修改,直接主席树就可以了。 要修改要套如树状数组求和。 #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; const in

Ezereal的博客 831

【华为OD机试真题】4、字符统计及重排 | 机试真题+思路参考+代码解析(C++、Java、Py)

题目描述 >给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数, 并按照字母出现次数从大到小的顺序。输出各个字母及其出现次数。 如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前

KJ.JK 3289

ZOJ 2112 Dynamic Rankings(主席树套树状数组+静态主席树)

题意:给定一个区间,求这个区间第k大的数,支持单点修改。 思路:主席树真是个神奇的东西.........速度很快但是也有一个问题就是占用内存的很大,一般来说支持单点修改的主席树套树状数组空间复杂度为O(n*logn*logn), 如果查询较少的话,可以初始的时候用一颗静态主席树,这样空间复杂度可以降为O(n*logn+q*logn*logn),勉强可以过zoj这道题。 这道题看了好久好久才懂.

GODSPEED 4891

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ZOJ 2112 Dynamic Rankings [树状数组套主席树]

给出N个数,M个询问L,R,K,对于每个询问给出区间(L,R)内的第K小值,支持修改。

Asuna_acmer 882

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ZOJ 2112 Dynamic Rankings(树状数组套主席树)

题意就是带修改的区间第K大,看了诸多大牛的博客才弄懂。

glq007的acm的奋斗 1047

ZOJ - 2112 Dynamic Rankings 动态主席树 主席树+树状数组

题目链接:https://vjudge.net/problem/ZOJ-2112 题意:能修改的查询第k大 学习博客:https://blog.youkuaiyun.com/WilliamSun0122/article/details/77885781 理解:修改pos位置x - >y的话,影响的是【pos,n】,所以用树状数组的思想维护,然后对于每个节点建立可持久化线段树,由x变为y的话就是x位...

还我笑颜 260

ZOJ 2112 Dynamic Rankings 带修主席树(树状数组套主席树

ZOJ2112 啥 第一道树套树 题意 给你n个数 两种操作 一种操作查询L-R 第k大的树 静态主席树经典问题 第二种操作 把a[i] 改为t 做法 我们知道如果你想建主席树 然后暴力维护 暴力跑 时间复杂度讲会是 m*n*logn 就TLE了 况且你建主席树太多还会MLE 那么怎么做到修改呢?首先我们要知道一定要把后来修改的值也放进去离散化的数组里面 然后还是正常建主席树 唯一的区别...

我是谁 --- 卡比兽 237

ZOJ - 2112 Dynamic Rankings 树套树(树状数组套主席树)

要理解这题的话 首先得理解一下主席树上面的前缀和思想 我们求区间L~R第k小的时候 是用R这颗树的值减去(L-1)这棵树的值 这其中暗含了 L~R的数值在值域上的分布(瞎说) 通过这个分布我们可以向第k小靠拢 R和L-1的差值 这不是显然的前缀和思想吗 那普通的主席树我们其实可以看成数组的前缀和 当我要知道 区间L到R的值时 我就访问 R和L-1的差值 并且这是不带修改的 ...

weixin_43824564的博客 281

动态主席树(主席树套树状数组)zoj 2112 Dynamic Rankings 详解

既然看到这个题了,相信静态主席树求区间第k大应该不成问题了, 此题在原有基础上,不过添加了单点修改的要求。 那么来说一下大体思路: 首先,用题目给的n个原始数据像之前一样建立主席树。对于修改,我们不是要真的去修改我们已经建立好的主席树,而是用另一个数组来维护修改所造成的变化,例如:要求 i 位置到 j 位置的第k大,之前的策略是找到第 i-1 和 第 j 棵树,两个权值线段树根据左右子节点的权值下...

菜鸡的博客 251

【ZOJ 2112 Dynamic Rankings】动态区间第k大:树状数组+主席树

思路纯属个人YY,如有错误请各位dalao不吝赐教。Orz 萌新第一次接触这么阔怕的东西,瑟瑟发抖啊嘤嘤嘤。。。 ZOJ 2112 Dynamic Rankings 题目大意就是,求区间第k大,支持单点修改。 其中,每个元素a[i]的范围…1,000,000,0001,000,000,0001,000,000,000 首先,区间第k大,那肯定是要用传说中的主席树了。 (刚刚接触主席树的萌新持续瑟瑟...

菜的一批的SNOW的博客 800

ZOJ 2112 Dynamic Rankings(树状数组+主席树)

The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with the query like to simply find the k-th smallest number of the given N numbers. They have develop...

weixin_30532837的博客 103

带修改离线主席树 + 树状数组 ZOJ - 2112【Dynamic Rankings】

带修改离线主席树 + 树状数组 ZOJ - 2112【Dynamic Rankings】 https://cn.vjudge.net/contest/304073#problem/E 题意 给定 n 个数和 m 次操作,操作分为两种: Q x y z —— 询问 [x, y] 区间里的第 z 小的数 C x y —— 把第 x 个数变成 y 分析 mmp突然想起来可以分块... 这题属于带修改...

weixin_30590285的博客 110

【ZOJ2112】Dynamic Rankings 树状数组套主席树

动态查询区间第k大。 先用主席树保存一个静态的情况,然后用树状数组套主席树保存修改操作,空间复杂度为O(n*logn+q*logn*logn)。 因为主席树本身是有前缀和性质的数据结构,所以可以外加一个树状数组,树状数组的节点为一棵线段树。一次修改的时空复杂度为O(logn*logn)。#include<bits/stdc++.h> using namespace std; const int

Dizzz的博客 432

ZOJ 2112 Dynamic Rankings [树状数组套主席树 || CDQ分治&整体二分]

ZOJ 2112 Dynamic Rankings [树状数组套主席树 || CDQ分治&整体二分]

ACTerminate的博客 969

bzoj 1901 ZOJ 2112 Dynamic Rankings [树状数组套主席树] [线段树套平衡树]

Dynamic RankingsTime Limit: 10 Sec Memory Limit: 128 MB Submit: 6900 Solved: 2870Description给定一个含有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),并且,你

C'est la vie. 1047

【树状数组+主席树】BZOJ1901 [ZOJ2112]Dynamic Rankings

题面在这里树套树第一题……考虑没有修改(POJ 2104)的情况,就是经典的主席树了 其实就是一个静态的前缀和,利用容斥原理求区间信息但是如果有修改操作呢? 不过是维护这个前缀和罢了。 当然有一个想法,就是修改时O(n)更新后面的所有位置(受此次修改的影响) 这样就太慢了,直接树状数组比较好。 树状数组的每一个单位都是一棵主席树,整个管辖范围的修改都记到它上面修改操作就在树状数组上依次修改

linkfqy 1367
上一篇: hdu 4348 To the moon (带标记主席树)
下一篇: hdu 3727 Jewel (主席树)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值