zoj2112 Dynamic Rankings 单点修改区间第k小

zoj 2112 Dynamic Rankings 带修改区间第k大的几种解法 给出n个数,有两种操作,一种是修改某个数的值,另一种查询指定区间第k大。 比较快的做法是树套树,而分块算法复杂度比较高写起来方便。分块算法可以很简单的处理单独修改某个值的情况。 将n个数分成num块,每块大小siz=n/num。每一块内部排序进行排序,查询[l,r]第k大时,先二分答案,对于完全包含在区间的内块直接二分搜索,而对于区间两端只有部分包含的则直接遍历查找。复杂度是logn*(2*s 阅读详情

题目:给你N个数,M个操作,操作分两种,(Q,L,R,K)询问区间[L,R]第K小的数,(C,L,R)把第L个数改为R。N<=50000,M<=10000

思路:主席树满足前缀和,因此可以用树状数组来维护。直接在原树上进行修改操作的空间复杂度是nlognlogn,会MLE。给树状数组单独开一棵主席树的空间复杂度是mlognlogn。因此要单独开一主席树,两者的和就是结果。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<list>
#include<numeric>
using namespace std;
#define PI acos(-1.0)
#define LL long long
#define ULL unsigned long long
#define INF 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define PP puts("*********************");
template<class T> T f_abs(T a){ return a > 0 ? a : -a; }
template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
// 0x3f3f3f3f3f3f3f3f
// 0x3f3f3f3f

const int maxn=6e4+50;
const int maxm=2500010;
int arr[maxn];//原数组
int num[maxn],siz;//num离散化之后的数组
int root[maxn],lson[maxm],rson[maxm],cnt[maxm];//根节点,左儿子,右儿子,区间内的数出现次数的前缀和
int tot;
int S[maxn];//树状数组的根节点
int luse[maxn],ruse[maxn],llen,rlen;//查询时使用的树状数组的根节点
void init(){
    tot=1;
    root[0]=lson[0]=rson[0]=cnt[0]=0;//建一棵空树
    sort(num+1,num+siz+1);//离散化
    siz=unique(num+1,num+siz+1)-num-1;
}
int Hash(int x){
    return lower_bound(num+1,num+siz+1,x)-num;
}
int update(int rt,int pos,int val){
    int newrt=tot++,temp=newrt;
    cnt[newrt]=cnt[rt]+val;
    int l=1,r=siz;
    while(l<r){
        int mid=(l+r)/2;
        if(pos<=mid){
            r=mid;
            lson[newrt]=tot++;rson[newrt]=rson[rt];
            newrt=lson[newrt];rt=lson[rt];
        }
        else{
            l=mid+1;
            lson[newrt]=lson[rt];rson[newrt]=tot++;
            newrt=rson[newrt];rt=rson[rt];
        }
        cnt[newrt]=cnt[rt]+val;
    }
    return temp;
}
int lowbit(int i){
    return i&(-i);
}
int n;
void add(int i,int pos,int val){
    while(i<=n){
        S[i]=update(S[i],pos,val);
        i+=lowbit(i);
    }
}
int query(int left_rt,int right_rt,int k){
    int l=1,r=siz;
    while(l<r){
        int mid=(l+r)/2;
        int lsum=0,rsum=0;
        for(int i=1;i<=llen;i++) lsum+=cnt[lson[luse[i]]];
        for(int i=1;i<=rlen;i++) rsum+=cnt[lson[ruse[i]]];
        int temp=rsum-lsum+cnt[lson[right_rt]]-cnt[lson[left_rt]];
        if(temp>=k){
            r=mid;
            for(int i=1;i<=llen;i++) luse[i]=lson[luse[i]];
            for(int i=1;i<=rlen;i++) ruse[i]=lson[ruse[i]];
            left_rt=lson[left_rt];
            right_rt=lson[right_rt];
        }
        else{
            l=mid+1;
            k-=temp;
            for(int i=1;i<=llen;i++) luse[i]=rson[luse[i]];
            for(int i=1;i<=rlen;i++) ruse[i]=rson[ruse[i]];
            left_rt=rson[left_rt];
            right_rt=rson[right_rt];
        }
    }
    return l;
}
struct Node{
    int kind,L,R,K;
}ask[10010];
int main(){

    int T,N,M;
    char str[10];
    scanf("%d",&T);
    while(T--){
        siz=0;
        scanf("%d%d",&N,&M);
        n=N;
        for(int i=1;i<=N;i++){
            scanf("%d",&arr[i]);
            num[++siz]=arr[i];
        }
        for(int i=1;i<=M;i++){
            scanf("%s",str);
            if(str[0]=='Q'){//查询操作
                ask[i].kind=0;
                scanf("%d%d%d",&ask[i].L,&ask[i].R,&ask[i].K);
            }
            else{//修改操作
                ask[i].kind=1;
                scanf("%d%d",&ask[i].L,&ask[i].R);
                num[++siz]=ask[i].R;
            }
        }
        init();
        for(int i=1;i<=n;i++)
            root[i]=update(root[i-1],Hash(arr[i]),1);
        for(int i=1;i<=n;i++) S[i]=root[0];
        for(int i=1;i<=M;i++){
            if(ask[i].kind==0){
                llen=rlen=0;
                for(int j=ask[i].L-1;j>0;j-=lowbit(j)) luse[++llen]=S[j];
                for(int j=ask[i].R;j>0;j-=lowbit(j)) ruse[++rlen]=S[j];
                int ans=query(root[ask[i].L-1],root[ask[i].R],ask[i].K);
                printf("%d\n",num[ans]);
            }
            else{
                add(ask[i].L,Hash(arr[ask[i].L]),-1);
                arr[ask[i].L]=ask[i].R;
                add(ask[i].L,Hash(arr[ask[i].L]),1);
            }
        }
    }
    return 0;
}


树套树之线段树套平衡树(ZOJ2112 Dynamic Rankings) 接上篇:树套树之线段树套线段树 树套树都应该是做一道题就会了的。。 Dynamic Rankings(ZOJ 2112) 题目描述: 某公司开发了一种新型的计算机,它不再仅能找到给定N个数中第k小的数。它变成了一个更强大的系统。对于N个数a[1],a[2],…,a[N],你可以询问a[i],a[i+1],…,a[j-1],a[j]中第k小的数(i≤j,0<k≤j+i−1i\le j,0\lt 阅读详情

相关推荐

飞腾D2000 BIOS编译避坑指南:PCIE拆分、S3电源与过温保护配置详解

本文详细解析飞腾D2000 BIOS编译中的关键配置技巧,包括PCIE拆分模式优化、S3电源管理适配及过温保护设置。通过实战案例和参数调优建议,帮助开发者规避常见陷阱,充分发挥国产高性能计算平台的硬件潜力。特别针对BIOS编译过程中的隐蔽问题提供解决方案。

weixin_33704234的博客 534

zoj2112(单点修改区间第K小)

我又来填坑了哈哈哈!!!!     ~~~~~      ~~~~~Description:   ~~~有一个初始序列,长度为N(N<=50000)N(N<=50000)   ~~~两种操作,操作个数为M(M<=10000)M(M<=10000):      ~~~~~~1.询问一个区间里第k小的数;      ~~~~~~2.修改数列中一个数的值。    ~~~    ~~~    ~

zzj的专栏 654

Cadence Sigrity PowerDC实战:如何用PCB电热混合仿真解决散热难题(附详细配置步骤)

本文详细介绍了如何利用Cadence Sigrity PowerDC进行PCB电热混合仿真,以解决高功率密度设计中的散热难题。文章通过解析电热耦合原理,并附上详细的配置步骤与实战技巧,指导硬件工程师同步优化电气性能与热管理,从而在设计源头提升产品可靠性与效率。

weixin_29292535的博客 196

主席树(区间查询第k小数+单点修改)HDU2665

主席树 【引入】 学习推荐博客(内有带修改的博文链接):https://www.cnblogs.com/Empress/p/4652449.html 主席树可以干什么? 主席树可以求一个序列某区间段的第k小数。(时间复杂度O(m*logn)m是询问次数。); 学习主席树之前必须掌握线段树,主席树是建立在线段树的基础上的。 【算法】 线段树可以维护区间和、最值。这里我们用的是维护和,维

雪的期许 1308

STM32F429网络通信避坑指南:用CubeMX搞定LAN8720+LWIP+FreeRTOS(附完整代码)

本文详细介绍了STM32F429通过CubeMX配置LAN8720+LWIP+FreeRTOS实现网络通信的避坑指南,涵盖硬件连接、CubeMX配置、LWIP优化及调试技巧,提供完整代码和实战经验,帮助开发者高效解决以太网通信中的常见问题。

weixin_26873711的博客 145

STM32实现薄膜压力传感器数据采集(标准库和HAL库实现)

薄膜压力传感器采集压力数据

XiaoCaiDaYong的博客 3万+

ZOJ2112单点修改,区间求第K大

ZOJ2112 单点修改,区间求第K大

Venishel的博客 510

鸿蒙5.0进阶开发:UI开发-不依赖UI组件的全局自定义弹出框 (openCustomDialog)(推荐)

本文介绍通过入参形式为ComponentContent创建自定义弹出框............

AyomQAQ的博客 1849

ZOJ-2112 整体二分 单点修改-区间第k小

题目链接:https://vjudge.net/problem/ZOJ-2112 多样例: 输入一个样例数t。 输入一个n和m。数组长度和操作数 Q l r k:查询区间[l, r]的第k小的数 C x y:修改a[x]=y Sample Input 2 5 3 3 2 1 4 7 Q 1 4 3 C 2 6 Q 2 5 3 5 3 3 2 1 4 7 Q 1 4 3 C 2 6 Q 2 5 3 ...

H_ang的博客 320

因时机器人-灵巧手配置方案(Ubuntu18.04)

因时机器人-灵巧手配置方案(Ubuntu18.04)

CH_monsy的博客 3844

新手必看!无人机定高PID调参避坑指南:从理论到实战的完整流程

本文为无人机新手提供定高PID调参的完整指南,从传感器融合到抗风策略,详细解析多传感器融合、PID控制参数调试及环境干扰应对。通过实战案例和代码示例,帮助开发者快速掌握无人机定高技术,避免常见调参陷阱,提升飞行稳定性。

spark7igniter的博客 221

动态主席树 单点更新 动态区间第k小

P2617 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≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后...

唐大帅 337

HyperLynx(十三)Hyperlynx前放置之对网络的EMC分析

在“Spectrum Analyzer”对话框的“Stimulus”(激励)栏中,设置激励源频率为100MHz,选择“IC modeling”为“Fast-Strong”,并按图所示设置其他选项。显然,在仿真的基频上,它的幅值最大,将鼠标光标置于柱状图上,可以读取其值为64.28mA,这个数值是由选定的驱动芯片决定的。按上图所示的原理图,在接收端增加一个并联的RC负载,再次运行仿真,结果如图所示。在对话框左侧的“Pins”列表中,显示出了已添加电流探针的引脚,可以在此列表中选择所要仿真的目标。...

小幽余生不加糖 4677

ZOJ 2112 Dynamic Rankings 树状数组套主席树 单点修改求动态区间第K大

题目大意: 就是给出一个数列之后进行两种操作: 1. 询问从第l个数到第r个数中的第k小的数 2. 修改某个位置的数为t 大致思路: 主席树学习第二题... 就是对原序列建立主席树然后用树状数组来维护另外一颗主席树来表示原主席树的变化 因为每次修改都会导致需要修改一整段线段树, 那么考虑用树状数组维护, 每个位置都是一颗线段树, 这些线段树的前缀和就是对应位置的变化, 在递归

Gatevin的专栏 1673

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

ZOJ 2112 Dynamic Rankings (主席树+单点修改,询问区间第K值)

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 developed

know_heng的博客 729

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【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

老版QQ原生表情gif动态

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

ZOJ 2112 Dynamic Rankings

题意: 允许单点修改的区间第K值为题 思路: 树状数组套主席树  详见注释 按照kuangbin大神的代码学习  虽然还是理解得不透彻TAT 代码: //树状数组套主席树 #include #include #include using namespace std; #define N 60010 //数组和哈希表大小 #define M 10010 //操作数 #de

House 1354

ZOJ2112 Dynamic Rankings 动态区间Kth(单点修改) 线段树+Treap写法

---恢复内容开始--- 题意:给出一个序列和操作次数, 每次操作修改一个位置的数 或者 询问一个区间第k小的数 分析:单点修改可以考虑线段树, 区间排名可以用平衡树所以线段树+Treap 用一颗线段树将序列划分 每颗Treap中插入的是对应区间的数 在每个数加入时, 顺便将该数插入线段树中包含该位置的那些区间上的Treap即可 单点修改同理, 将所有包含要修改的位置的区间上...

dianfen4939的博客 206

[ZOJ 2112]Dynamic Rankings

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

asdkjc的博客 145

ZOJ2112 Dynamic Rankings 解题报告【数据结构】【分块】

ZOJ 2112

中国计算机学会成都七中(高新校区)委员会委员活动室 488

ZOJ 2112 Dynamic Rankings (动态主席树)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112 题目大意: 比静态查询区间第k小多加了一个修改操作。 题目分析:  对于所有的数(原序列的数和要修改的数)都离散化处理, 动态修改的核心是对于树状数组中出现的点开线段树维护, 因为之前修改一个数对于后续区间有影响,我们令开一个根节点数组S 来维...

满月照亮的路 276

ZOJ 2112 Dynamic Rankings(动态求区间第k大+整体二分)

Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with the query like to simply fi

ZAQ的博客 4747

zoj 2112 Dynamic Rankings (动态主席树)

/* Q x y z 代表询问[x, y]区间里的第z小的数 C x y 代表将(从左往右数)第x个数变成y */ #include #include #include #include using namespace std; # define lson l,m # define rson m+1,r # define N 60010 int a[N],Hash[N],T[N],

苍竹林 519

ZOJ2112 Dynamic Rankings 线段树套平衡树

简单树套树 区间单点修改 区间K值查询 线段树套TREAP Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has developed a new kind of computer that is no lon

992

BZOJ1901 ZOJ2112 Dynamic Rankings

题意: 单点修改,区间K大 题解 不会主席树的我,用的是根据值域的整体分治。 对于修改,可以拆成两个操作,一个是撤销,一个是增加。 一共是三种操作 op=-1时,代表撤销,x代表位置; op=0时,代表增加,在x位置插入y; op>0时,代表查询,在[x,y]区间内第z大。(x=l,y=r,z=k) 再根据值域分治的时候, 当op=0且q[i].y<=mid时,就正常插入。但注意此时不管q[i].y的大小,都要a[q[i].x]=i,存一下实际序列的q[i].x位是q[i]。

Luowaterbi的博客 224

ZOJ---2112:Dynamic Rankings【动态主席树】

题目: ZOJ---2112:Dynamic Rankings 题意: 求区间第 K 大,但有单点修改操作 笔记: 主席树的本质就是权值线段树+前缀和,静态主席树也是按照前缀和的思想建的权值线段树;如果现在有修改操作,那么就得修改这个点后面所有的权值线段树;考虑到查询的也是前缀和,于是就引入树状数组来加速这个过程,实际上就是牺牲查询加速修改 核心: 现在树状数组每个节点都是一颗...

KobeDuu 291
上一篇: poj2104 K-th Number
下一篇: hdu4417 Super Mario
我不会额
博客等级 码龄11年 2粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值