刷题总结——序列操作(权值线段树套树状数组)
题目:
题目描述
给出序列 a1,a2,…,an(0≤ai≤109),有关序列的两种操作。
1. ai(1≤i≤n)变成 x(0≤x≤109)。
2. 求 al,al+1,…,ar(1≤l≤r≤n)第 k(1≤k≤r-l+1)小。
输入格式
第一行包含两个数 n(1≤n≤2×104)和 m(1≤m≤2×104),表示序列长度和操作次数。
接下来一行 n 个数,以空格隔开,表示 a1,a2,…,an 。
接下来m行,每行为以下两种格式之一:
- 0 i x , 表示 ai=x。
- 1 l r k ,求 al,al+1,…,ar 的第 k 小。
输出格式
对于每次询问,输出单独的一行表示答案。
样例数据 1
输入 [复制]
5 3
1 2 3 4 5
1 1 5 3
0 3 5
1 1 5 3
输出
3
4
题解:
待修改的权值线段树的模板题
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std;int getint() {int i=0,f=1;char c;for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());if(c=='-')f=-1,c=getchar();for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';return i*f; }const int N=2e4+5,M=2e6+5; struct node {int op,x,y,k; }q[N]; struct tree {int lc,rc,size; }tr[M]; int n,m,len,tot,a[N],b[N<<1],bit[N],pos[N];void dic_init() {sort(b+1,b+len+1);len=unique(b+1,b+len+1)-b-1;for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+len+1,a[i])-b;for(int i=1;i<=m;i++)if(!q[i].op)q[i].y=lower_bound(b+1,b+len+1,q[i].y)-b; }void Insert(int &k,int l,int r,int x) {if(!k)k=++tot;tr[k].size++;if(l==r)return;int mid=l+r>>1;if(x<=mid)Insert(tr[k].lc,l,mid,x);else Insert(tr[k].rc,mid+1,r,x); }void Add(int x) {for(int i=x;i<=n;i+=i&(-i))Insert(bit[i],1,len,a[x]); }void Delete(int k,int l,int r,int x) {tr[k].size--;if(l==r)return;int mid=l+r>>1;if(x<=mid)Delete(tr[k].lc,l,mid,x);else Delete(tr[k].rc,mid+1,r,x); }void Rec(int x) {for(int i=x;i<=n;i+=i&(-i))Delete(bit[i],1,len,a[x]); }void pre(int x,int y) {for(int i=x;i>0;i-=i&(-i))pos[i]=bit[i];for(int i=y;i>0;i-=i&(-i))pos[i]=bit[i]; }int calc(int x,int y) {int res=0;for(int i=x;i>0;i-=i&(-i))res+=tr[tr[pos[i]].lc].size;for(int i=y;i>0;i-=i&(-i))res-=tr[tr[pos[i]].lc].size;return res; }void trans(int x,int y,int f) {for(int i=x;i>0;i-=i&(-i))if(!f)pos[i]=tr[pos[i]].lc;else pos[i]=tr[pos[i]].rc;for(int i=y;i>0;i-=i&(-i))if(!f)pos[i]=tr[pos[i]].lc;else pos[i]=tr[pos[i]].rc; }int query(int rt1,int rt2,int l,int r,int k) {if(l==r)return l;int delta=calc(rt1,rt2);int mid=l+r>>1;if(delta>=k){trans(rt1,rt2,0);return query(rt1,rt2,l,mid,k);}else {trans(rt1,rt2,1);return query(rt1,rt2,mid+1,r,k-delta);} }int main() {//freopen("a.in","r",stdin);n=getint(),m=getint();for(int i=1;i<=n;i++)a[i]=getint(),b[++len]=a[i];for(int i=1;i<=m;i++){q[i].op=getint();q[i].x=getint();q[i].y=getint();if(!q[i].op)b[++len]=q[i].y;else q[i].k=getint();} dic_init();for(int i=1;i<=n;i++)Add(i);for(int i=1;i<=m;i++)if(!q[i].op){Rec(q[i].x);a[q[i].x]=q[i].y;Add(q[i].x);}else{pre(q[i].y,q[i].x-1);cout<<b[query(q[i].y,q[i].x-1,1,len,q[i].k)]<<'\n';}return 0; }
转载于:https://www.cnblogs.com/AseanA/p/7201294.html
刷题总结——序列操作(权值线段树套树状数组)相关推荐
- 花匠(最长波浪子序列——DP + 权值线段树)
题目描述 花匠栋栋种了一排花,每株花都有自己的高度.花儿越长越大,也越来越挤.栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致. 具体而 ...
- 刷题之完全二叉树的权值和小字辈及根据后序和中序遍历输出先序遍历
1.完全二叉树的权值 1)题目 给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下.从左到右的顺序依次是 A1, A2, ··· AN,如下图所示: 现在小明要把相同深度的节 ...
- [权值线段树] Jzoj P4270 魔道研究
Description "我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力." --<The Grimoire of Mar ...
- 树套树 ---- 树状数组套权值线段树模板题 P2617 Dynamic Rankings 动态第K大
题目链接 题目大意: 给你一个数组aaa,aaa有两个操作 询问aaa中[l,r][l,r][l,r]区间里面第kkk小的数是哪个? 修改axa_xax为yyy 解题思路: 首先我们知道权值线段树是 ...
- 【题解】有便便的厕所(权值线段树动态开点模板题)
我只是来填坑的. 关于权值线段树的更多有关内容见此. 题面 题目描述 众所周知, GM \texttt{GM} GM 家的狗特别喜欢拉便便. GM \texttt{GM} GM 为了方便它方便,在家里 ...
- jzoj5986. 【WC2019模拟2019.1.4】立体几何题 (权值线段树)
传送门 题面 题解 不难看出每个点的大小为行列限制中较小的那一个(因为数据保证有解) 对于行的每个限制,能取到的个数是列里限制大于等于它的数的个数,同理,对于列是行里大于它的个数(这里没有等于,为了避 ...
- 【BZOJ2653】middle,主席树(非权值线段树)维护序列和信息+二分答案
传送门 写在前面:虽然这是一道我再也不想写的题目,但很好很有价值 思路: cxlove大神: 要求中位数最大,首先二分中位数,然后判断可行不可行. 判断X可行不可行,对于区间内的数,凡是>=X的 ...
- 【HDU6701】Make Rounddog Happy【权值线段树+双向单调队列】
题意:给你一个序列,求满足要求的子序列个数,其中要求为: 1.子序列的max-子序列长度len<=k 2.子序列中不出现重复的数字 题解:首先看到子序列max,很容易想到枚举最大值然后分治,这个 ...
- Governing sand(权值线段树/主席树)
链接:https://ac.nowcoder.com/acm/contest/887/C 来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 65536K,其他语言13107 ...
最新文章
- Java-Java I/O流解读之基于字节的I / O和字节流
- python 中给文件加锁——fcntl模块
- ef mysql 数据模型,EF Core使用CodeFirst在MySql中创建新数据库以及已有的Mysql数据库如何使用DB First生成域模型...
- 谈谈你对IOC的理解
- Shell自动上传下载文件到SFTP服务器
- Android studio 升级指定dradle
- 解决wps如何只复制标题文字(不复制正文)
- OpenCV3.1.0+VS2013测试程序
- 内联函数inline的使用
- 自定义控件被忽略的渲染性能
- 超级搜索术2-人脉搜索/分类整理
- oracle 如何防止锁表,oracle锁表该如何解决
- 微信小游戏上线发布全流程详解
- Codeforces718 C. Sasha and Array(线段树维护矩阵,矩阵快速幂求斐波那契数列,矩阵乘法结合律)
- 网络流精讲——最大流 包教包会
- 测试分类 test catagory
- 面试-android
- 《用图表说话》读后感
- 期权和期货的定义及区别
- 京东商品主图定时替换,90%卖家这样做
热门文章
- poj3984 迷宫问题 bfs 最短路 广搜
- SQL SERVER 2016研究三
- 【Android Developers Training】 81. 解析XML数据
- 【ARDUINO】HC-05蓝牙不配对问题
- poj 1308 Is It A Tree?
- 华为南太无线解决方案部梁旭阳_华为无线充电新专利:激光无线充电,替代传统半接触式...
- MySql中关于某列中相同数值连续出现次数的统计
- 前端jenkins打包编译发布项目流程
- python对英语的要求_学python需要英语基础吗
- mybatisplus 结果_SpringBoot + MyBatisPlus 快速入门