Zju2112 Dynamic Rankings(树状数组套可持久化权值线段树)

Zju2112 Dynamic Rankings

  • description
  • solution
  • code

description

给定一个含有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继续回答上面的问题。

Input

第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。

分别表示序列的长度和指令的个数。

第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。

接下来的m行描述每条指令

每行的格式是下面两种格式中的一种。

Q i j k 或者 C i t

Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)

表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。

C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t

m,n≤10000

Output

对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。

Sample Input

5 3 
3 2 1 4 7 
Q 1 4 3 
C 2 6 
Q 2 5 3 

Sample Output

3
6

solution

不带修的区间第KKK大可持久化线段树利用root[r]−root[l−1]root[r]-root[l-1]root[r]root[l1]版本的个数向前即可

本质是一个前缀和

考虑现在待修,显然就是修改后会对后面每个版本都造成影响,时间花费巨大

需要找一个很好的工具代替,这里我们就选择了BIT\rm BITBIT树状数组

每一个BIT节点表示一棵主席树,可持久化的是权值线段树

相同区间抽离出来就相当于一个对区间构建的树状数组

就在树状数组上查[l,r][l,r][l,r]区间,里面相同区间的线段树相减就是值域属于[x,y][x,y][x,y]的数的个数

树状数组是前缀和,主席树也是前缀和,所以可以套起来

树状数组里套主席树


具体而言:

将所有出现的值离散化(包括初始和修改)

对于位置iii的修改,相当于在树状数组上从iii跳到nnn,在主席树的aia_iai位置先减去,再在kkk位置加一

对于区间[l,r][l,r][l,r]的询问

l−1l-1l1跳到111的所有用到的树状数组的节点预处理到L[]L[]L[]数组

rrr跳到111的所有用到的树状数组的节点预处理到R[]R[]R[]数组

然后在主席树上区间跳,统计对于区间[x,y][x,y][x,y]LLL中的个数,RRR中的个数,相减就是[l,r][l,r][l,r]区间中值域[x,y][x,y][x,y]的个数

与此时的kkk判断,线段树往左走还是往右走

这就相当于抽离了一个区间的树状数组出来

code

#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 20005
struct query { int op, i, j, k; }q[maxn];
struct node { int tot, lson, rson; }t[maxn * 200];
int n, m, cnt, cnt_l, cnt_r;
int a[maxn], val[maxn], root[maxn], mp[maxn], L[maxn], R[maxn];void modify( int &now, int lst, int l, int r, int id, int k ) {t[now = ++ cnt] = t[lst];t[now].tot += k;if( l == r ) return;int mid = ( l + r ) >> 1;if( id <= mid ) modify( t[now].lson, t[now].lson, l, mid, id, k );else modify( t[now].rson, t[now].rson, mid + 1, r, id, k );
}int query( int l, int r, int k ) {if( l == r ) return l;int tot_l = 0, tot_r = 0;for( int i = 1;i <= cnt_l;i ++ ) tot_l += t[t[L[i]].lson].tot;for( int i = 1;i <= cnt_r;i ++ ) tot_r += t[t[R[i]].lson].tot;int mid = ( l + r ) >> 1;if( tot_r - tot_l >= k ) {for( int i = 1;i <= cnt_l;i ++ ) L[i] = t[L[i]].lson;for( int i = 1;i <= cnt_r;i ++ ) R[i] = t[R[i]].lson;return query( l, mid, k );}else {for( int i = 1;i <= cnt_l;i ++ ) L[i] = t[L[i]].rson;for( int i = 1;i <= cnt_r;i ++ ) R[i] = t[R[i]].rson;return query( mid + 1, r, k - ( tot_r - tot_l ) );}
}int lowbit( int x ) { return x & ( -x ); }int main() {scanf( "%d %d", &n, &m );for( int i = 1;i <= n;i ++ ) scanf( "%d", &a[i] ), val[i] = a[i];for( int i = 1;i <= m;i ++ ) {char opt[5];scanf( "%s", opt );if( opt[0] == 'Q' ) q[i].op = 0, scanf( "%d %d %d", &q[i].i, &q[i].j, &q[i].k );else q[i].op = 1, scanf( "%d %d", &q[i].i, &q[i].k ), val[++ n] = q[i].k;}sort( val + 1, val + n + 1 );n = unique( val + 1, val + n + 1 ) - val - 1;for( int i = 1;i <= n;i ++ ) {a[i] = lower_bound( val + 1, val + n + 1, a[i] ) - val;for( int j = i;j <= n;j += lowbit( j ) ) modify( root[j], root[j], 1, n, a[i], 1 );}for( int i = 1;i <= m;i ++ )if( ! q[i].op ) continue;else q[i].k = lower_bound( val + 1, val + n + 1, q[i].k ) - val;for( int i = 1;i <= n;i ++ ) mp[i] = val[i];for( int i = 1;i <= m;i ++ ) {if( q[i].op ) {for( int j = q[i].i;j <= n;j += lowbit( j ) )modify( root[j], root[j], 1, n, a[q[i].i], -1 );a[q[i].i] = q[i].k;for( int j = q[i].i;j <= n;j += lowbit( j ) )modify( root[j], root[j], 1, n, a[q[i].i], 1 );}else {cnt_l = cnt_r = 0; q[i].i --;for( int j = q[i].i;j;j -= lowbit( j ) ) L[++ cnt_l] = root[j];for( int j = q[i].j;j;j -= lowbit( j ) ) R[++ cnt_r] = root[j];printf( "%d\n", mp[query( 1, n, q[i].k )] );}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ML.NET案例详解:在.NET下使用机器学习API实现化学分子式数据格式的判定

半年前写过一篇类似的文章&#xff0c;题目是&#xff1a;《在.NET中使用机器学习API&#xff08;ML.NET&#xff09;实现化学分子式数据格式的判定》&#xff0c;在该文中&#xff0c;我介绍了化学分子式数据格式的基本知识&#xff0c;同时给出了一个案例&#xff0c;展示了如…

洛谷P4762: [CERC2014]Virus synthesis(PAM)

解析 自己对PAM的理解不够深刻。 最优方案必然是先选择一个偶回文串&#xff0c;递归构造出它的一半。花一步逆序&#xff0c;然后暴力解决剩下的。 这似乎已经依稀出现了某种dp的思路。 考虑如何更好的转移。设计 transxtrans_xtransx​ 表示长度不超过 xxx 一半的最长回文后…

Triangle HDU - 5914

Triangle HDU - 5914 题意&#xff1a; 有长度分别是1到n的n给木棍&#xff0c;问最少拿走几个木棍&#xff0c;使得剩下木棍无法组成三角形 题解&#xff1a; 组不成三角形的恰巧情况就是ab<c&#xff0c;也就是我们要让剩下的木棍&#xff0c;两者之和等于或小于第三个…

CodeForces - 336A Vasily the Bear and Triangle

CodeForces - 336A Vasily the Bear and Triangle 题意&#xff1a; 给你一个点x&#xff0c;现在这个点和原点组成了矩形&#xff0c;让你在x和y轴分别求一个点&#xff0c;与原点构成的三角形&#xff0c;要求矩形在三角形内&#xff0c;点x在斜边上 题解&#xff1a; 这…

数据结构之线段树合并——永无乡,Lomsat gelral,Tree Rotations,Tree Rotations Escape Through Leaf

文章目录[HNOI2012]永无乡Lomsat gelral「POI2011 R2 Day2」旋转树木 Tree RotationsEscape Through Leaf线段树合并与 fhq-treap合并很类似&#xff0c;也是将两个不同根的线段树暴力合并至于时间复杂度&#xff0c;线段树合并一次是可以达到O(n)O(n)O(n)的&#xff0c;但是大…

吉特仓储管理系统--开源2018年源码

应该说今天过完&#xff0c;这个年就算真正意义上的过完了&#xff0c;没有想到的是又是在出差的路上写这样的文章。废话也不多说&#xff0c;写这篇文章主要的目的是想将去年吉特仓储管理系统开发的一个版本源代码开放出来&#xff0c;供各位开发者阅读使用。github 源代码地址…

模板:广义SAM(字符串)

所谓广义SAM&#xff0c;就是更广泛意义下的SAM &#xff08;逃&#xff09; 前言 感觉字符串的理解难度的巅峰还是在SAM&#xff0c;广义SAM只是在套一些特判罢了&#xff0c;并不是太难理解。 可以解决多字符串的子串问题&#xff0c;几乎就是把SAM能做的东西从单串变成了多…

自定义Visual Studio.net Extensions 开发符合ABP vnext框架代码生成插件[附源码]

介绍我很早之前一直在做mvc5 scaffolder的开发功能做的已经非常完善,使用代码对mvc5的项目开发效率确实能成倍的提高,就算是刚进团队的新成员也能很快上手,如果你感兴趣 可以参考 http://neozhu.github.io/MVC5-Scaffolder/#/ https://github.com/neozhu/MVC5-Scaffolder但是m…

QDU-Training-01

QDU-Training-01 题号题目知识点难度CodeForces 76EPoints数论HDU 4608I-number模拟CodeForces 616DLongest k-Good Segment尺取法Gym 215177C玩游戏思维题HDU 5914Triangle构造题CodeForces 336AVasily the Bear and Triangle思维题 同时纪念我第700篇文章&#xff0c;我还是…

CF1131 G. Most Dangerous Shark (单调栈优化dp)

文章目录problemsolutioncodeproblem solution dpi:dp_i:dpi​: 前iii个多米诺骨牌全都倒下的最小花费 li,ril_i,r_ili​,ri​分别表示第iii个多米诺骨牌倒下时所能波及到的最左/右位置 往左倒&#xff0c;则[li,i)[l_i,i)[li​,i)内的牌都可以选择性地先推倒 dpimin⁡{dpjcos…

洛谷P1650:田忌赛马(贪心)

解析 其实并不简单的一道题。 是刘汝佳老师的例题&#xff0c;搜到之后按照讲的策略写了一发。 &#xff08;由于这个策略并不完全正确&#xff0c;就不展开讲了&#xff09; 好啊&#xff01; 可是感觉讲的策略特别对&#xff0c;为什么呢&#xff1f; 原因在于&#xff0…

CF407 E. k-d-sequence

文章目录problemsolutioncodeproblem solution 特判d0d0d0&#xff0c;相当于寻找最长的一段数字相同的区间 如果要满足公差为ddd等差序列 区间内每个数在模ddd意义下同余每个数互不相同 算法流程 先将序列分成若干个同余mmm的子区间 从左往右扫一遍 对于同余的子区间&…

Monkey and Banana HDU - 1069

Monkey and Banana HDU - 1069 题意&#xff1a; 有n种类型的砖块&#xff0c;每种类型的砖块都有无限个。第i块砖块的长宽高分别用xi&#xff0c;yi&#xff0c;zi来表示。 同时&#xff0c;由于砖块是可以旋转的&#xff0c;每个砖块的3条边可以组成6种不同的长宽高。 在构…

EFCore Lazy Loading + Inheritance = 干净的数据表 (二)

前言本篇是上一篇EFCore Lazy Loading Inheritance 干净的数据表 &#xff08;一&#xff09; 【献给处女座的DB First程序猿】 前菜 的续篇。这一篇才是真的为处女座的DB First程序猿准备的正餐。继续上一篇的话题&#xff0c;我们希望用EFCore&#xff0c;且继续使用与逻辑…

洛谷P7361:拜神(SA、二分、主席树、启发式合并)

解析 很好的一道SA的题。&#xff08;觉得完全可以评黑了啊qwq&#xff09; 我一开始拿SAM和线段树硬做&#xff0c;不断修正最后发现自己无法在可接受复杂度内解决的问题&#xff0c;直接GG… 垃圾数据还骗到了50分 所以写一道题之前还是要先想仔细了&#xff0c;确定整个流程…

Doing Homework HDU - 1074

Doing Homework HDU - 1074 题意&#xff1a; 有n个任务&#xff0c;每个任务有一个截止时间&#xff0c;超过截止时间一天&#xff0c;要扣一个分。 求如何安排任务&#xff0c;使得扣的分数最少。 (1<n<15) 题解&#xff1a; n很小&#xff0c;可以往状压dp方向去想…

【学习笔记】浅谈广义矩阵乘法——动态DP

文章目录广义矩阵乘法动态DP例题&#xff1a;洛谷4719以下内容是本人做题经验&#xff0c;如有雷同&#xff0c;纯属抄袭&#xff1b;如有不对&#xff0c;纯属不懂&#xff0c;还请指正 广义矩阵乘法 众所周知&#xff0c;矩阵满足乘法交换律&#xff0c;前一个矩阵的列必须…

我们为什么要搞长沙.NET技术社区?

某种意义上讲&#xff0c;长沙和中国大部分内地城市一样&#xff0c;都是互联网时代的灯下黑。没有真正意义上的互联网公司&#xff0c;例如最近发布的中国互联网企业一百强中没有一家湖南或者长沙的公司就是明证。然而长沙并非没有互联网人&#xff0c;在麓谷几十万计的IT 从业…

洛谷P5212:SubString(SAM、LCT)

解析 所谓SAM套LCT&#xff0c;真的就只是SAM套LCT。。。 考试写起来应该有亿点点恶心 每次在SAM节点修改的时候在LCT对应位置修改即可。 注意&#xff01; 克隆节点之前需要先splay一下把所有标记接收。 没了。 #include<bits/stdc.h> using namespace std; #define…

在ASP.NET Core中使用EPPlus导入出Excel文件

这篇文章说明了如何使用EPPlus在ASP.NET Core中导入和导出.xls/.xlsx文件&#xff08;Excel&#xff09;。在考虑使用.NET处理excel时&#xff0c;我们总是寻找第三方库或组件。使用Open Office Xml格式&#xff08;xlsx&#xff09;读取和写入Excel 2007/2010文件的最流行的.n…