P2617-Dynamic Rankings【树套树】

正题

题目链接:https://www.luogu.com.cn/problem/P2617


题目大意

给出一个序列,要求支持

  1. 区间查询第kkk
  2. 单点修改

解题思路

区间查询第kkk大需要使用主席树,构建权值线段树的前缀和。考虑如何进行单点修改,在前缀和上进行单点修改就是进行区间修改,区间修改主席树显然不可能,考虑树套树。

我们可以维护以权值线段树为权值的树状数组,这样可以单点修改并且维护动态前缀和。

时间复杂度:O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define lowbit(x) (x&-x)
using namespace std;
const int N=1e5+10,M=N*400;
int n,m,a[N],b[N*2],root[N];
int q1[N],q2[N],q3[N],num;
int w[M],ls[M],rs[M],tot;
int cnt1,cnt2,tmp1[N],tmp2[N];
char op[N];
void Updata(int &x,int l,int r,int pos,int val){if(!x)x=++num;if(l==r){w[x]+=val;return;}int mid=(l+r)>>1;if(pos<=mid)Updata(ls[x],l,mid,pos,val);else Updata(rs[x],mid+1,r,pos,val);w[x]=w[ls[x]]+w[rs[x]];
}
void Change(int x,int val){int k=lower_bound(b+1,b+1+tot,a[x])-b;while(x<=n){Updata(root[x],1,tot,k,val);x+=lowbit(x);}return;
}
int Ask(int l,int r,int k){if(l==r)return l;int mid=(l+r)>>1,sum=0;for(int i=1;i<=cnt1;i++)sum-=w[ls[tmp1[i]]];for(int i=1;i<=cnt2;i++)sum+=w[ls[tmp2[i]]];if(k<=sum){for(int i=1;i<=cnt1;i++)tmp1[i]=ls[tmp1[i]];for(int i=1;i<=cnt2;i++)tmp2[i]=ls[tmp2[i]];return Ask(l,mid,k);}else{for(int i=1;i<=cnt1;i++)tmp1[i]=rs[tmp1[i]];for(int i=1;i<=cnt2;i++)tmp2[i]=rs[tmp2[i]];return Ask(mid+1,r,k-sum);}
}
int Query(int x,int l,int r){l--;cnt1=cnt2=0;for(int i=l;i;i-=lowbit(i))tmp1[++cnt1]=root[i];for(int i=r;i;i-=lowbit(i))tmp2[++cnt2]=root[i];return Ask(1,tot,x);
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[++tot]=a[i];}for(int i=1;i<=m;i++){cin>>op[i];scanf("%d %d",&q1[i],&q2[i]);if(op[i]=='Q')scanf("%d",&q3[i]);else b[++tot]=q2[i];}sort(b+1,b+1+tot);tot=unique(b+1,b+1+tot)-b-1;for(int i=1;i<=n;i++)Change(i,1);for(int i=1;i<=m;i++){if(op[i]=='Q')printf("%d\n",b[Query(q3[i],q1[i],q2[i])]);else{Change(q1[i],-1);a[q1[i]]=q2[i];Change(q1[i],1);}}return 0;
}

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

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

相关文章

如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包

MSBuild 的 Task 为我们扩展项目的编译过程提供了强大的扩展性&#xff0c;它使得我们可以用 C# 语言编写扩展&#xff1b;利用这种扩展性&#xff0c;我们可以为我们的项目定制一部分的编译细节。NuGet 为我们提供了一种自动导入 .props 和 .targets 的方法&#xff0c;同时还…

codeforces F.F. Teodor is not a liar! 最长不降子序列

题意 给出一堆线段。 询问者每次可以询问一个整数点&#xff0c;回答者告诉询问者这个点被多少根线段包括。 问询问者最多问多少次&#xff0c;还不能确定任意一个整数点都不可能被所有的线段包含。 题解 首先用O(n)的方法计算出来每个点被多少条线段包含。 突破点&#x…

2019.01.23【NOIP普及组】模拟赛C组总结

总结 这次的分数是1001000100300 第一题第一题一开始把题看错了&#xff0c;乱打一通&#xff0c;结果才发现自己打错了&#xff0c;把题看清后&#xff0c;就知道用栈&#xff0c;快速解决。第二题和之前做过的一道题十分相似&#xff0c;就是用前缀和来将求一个范围内的巧克…

P2149-[SDOI2009]Elaxia的路线【最短路】

正题 题目链接:https://www.luogu.com.cn/problem/P2149 题目大意 nnn个点mmm条边的一张无向图&#xff0c;给定两个起点和对应的终点。求两个最短路的最长公共距离 解题思路 首先要求是最短路&#xff0c;我们可以先跑一次第一个起点的SPFASPFASPFA&#xff0c;然后从终点开…

Platform.Uno介绍

编者语&#xff1a;Xamarin国内很多人说缺乏可用的实例&#xff0c;我在写书过程中在完善一些常用场景的例子&#xff0c;希望帮到大家。Build 2018结束一周了&#xff0c;善友问我要不要谈谈Xamarin的一些变化&#xff0c;但碍于时间有限一直没有付诸行动。想想总得写点什么给…

codeforces F.Fibonacci String Subsequences

题意 定义F(x)为F(x-1)与F(x-2)的连接&#xff08;其中F(0) ‘0’,F(1) ‘1’&#xff09;。 给出一个长度不超过100的字符串s&#xff0c;询问s在F(x)的所有子序列中出现了多少次。 题解 数量很大的计数问题&#xff0c;我们首先想到的解决方案就是dp。 我们考虑F(x) F…

【dfs】GCD与LCM(jzoj 1608)

GCD与LCM 题目大意&#xff1a; 给出a,b的最大公因数和最小公倍数&#xff0c;求出符合条件的a,b的最小差值 样例输入 6 36 样例输出 6 数据范围限制 提示 数据说明&#xff1a; 对于50%的数据&#xff0c;1<a<b<10^3。 对于100%的数据&#xff0c;1<a&…

P3889-[GDOI2014]吃【线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P3889 题目大意 nnn个数的序列&#xff0c;mmm次询问&#xff0c;每次给出一个区间[l,r][l,r][l,r]&#xff0c;求在区间内和区间外各选一个数使得他们的gcdgcdgcd最大 解题思路 首先没有修改且没有要求强制在线&#xff0c;…

ASP.NET Core amp; Docker 实战经验分享

一.前言最近一直在研究和实践ASP.NET Core、Docker、持续集成。在ASP.NET Core 和 Dcoker结合下遇到了一些坑&#xff0c;在此记录和分享&#xff0c;希望对大家有一些帮助。二.中间镜像我前面写过一个 《ASP.NET Core & Docker 零基础持续集成 》的教程。里面我们通过持续…

codeforces E. Picking Strings 构造

题目链接 Picking String 题意 给出字符串S和T&#xff0c;1e5个询问&#xff0c;每次询问S的一段区间是否能转变成T的一段区间。 转变方式&#xff1a; A>BCA>BCB>ACB>ACC>ABC>ABAAAAAA可以消除 题解 我们从以上四个条件出发推导出更加精华的条件 B>…

P4169-[Violet]天使玩偶/SJY摆棋子【CDQ分治】

正题 题目链接:https://www.luogu.com.cn/problem/P4169 题目大意 nnn个点&#xff0c;然后每次操作 加一个新的点询问一个点更近的点 解题思路 定义tit_iti​表示第几个操作&#xff0c;开始就有的点tit_iti​为000 假设最近的点在左上角&#xff0c;那么有要求ti<tj,xi…

【Floyed】【匈牙利算法】导弹(jzoj 1610)

题目大意&#xff1a; 有n个城市&#xff0c;有一部分是A国的&#xff0c;有一部分是B国的&#xff08;小于A国的&#xff09;&#xff0c;A国每个城市都有一枚导弹&#xff08;只有一枚&#xff09;&#xff0c;炸毁别的城市的时间是到这个城市的距离&#xff0c;请问A国最快…

codeforces G - Almost Increasing Array 动态规划、动态开点线段树

题意 给出一个序列&#xff0c;允许删除一个元素&#xff0c;并将任意元素的值修改为任意整数&#xff0c;问最少修改多少个元素使得序列变成严格单调递增的序列&#xff1f; 题解 这道题目很具有启发性&#xff1a; 不考虑删除元素&#xff0c;原数列各个数值减去他们下标得…

Oracle .NET Core Beta驱动已出,自己动手写EF Core Oracle

使用.net core也有一段时间了&#xff0c;一直都没有Oracle官方的正式版驱动程序&#xff0c;更别说EF版本了。之前基于Oracle官方的.net core预览版本写了个Dapper的数据库操作实现&#xff0c;但是总感觉不太完美&#xff0c;有消息称Oracle官方的EF版本可能要到第三季度出了…

nssl1452-排行榜【数论】

正题 题目大意 给出nnn&#xff0c;求一个长度为2n2n2n的由1∼n1\sim n1∼n各两个组成的一个序列使得有一个数的前缀数量不小于任何数字。 解题思路 首先这个数字肯定是第一个数字&#xff0c;这里假设为111&#xff0c;那么要求任意位置111的前缀数量都不小于别的数。 也就…

【离散化】【差分】幻灯片(jzoj 1609)

幻灯片 题目大意&#xff1a; 有n个幻灯片映在一起&#xff0c;每个幻灯片的的左上角是a1,a2,右上角是a3,a4,颜色是a5当多个幻灯片在同一个位置时&#xff0c;颜色就是他们的和&#xff0c;求有所少种颜色 样例输入 3 2 2 3 3 2 2 0 4 4 1 1 1 3 5 3 样例输出 4 数据…

.net core在网关中统一配置Swagger

最近在做微服务的时候&#xff0c;由于我们是采用前后端分离来开发的&#xff0c;提供给前端的直接是Swagger&#xff0c;如果Swagger分布在各个API中&#xff0c;前端查看Swagger的时候非常不便&#xff0c;因此&#xff0c;我们试着将Swagger集中放到网关中。这里我用两个API…

P4074-[WC2013]糖果公园【树上带修莫队】

正题 题目链接:https://www.luogu.com.cn/problem/P4074 题目大意 nnn个点的一颗数&#xff0c;第iii个点有一颗cic_ici​种类的糖。 第iii次获得jjj种类的糖可以产生价值wi∗vjw_i*v_jwi​∗vj​。 每次操作 修改一个点的糖果种类询问一个路径的价值和 解题思路 用欧拉序…

闲来无事刷水题、简单博弈论专题、sg函数、洛谷

记 今天闲来无事&#xff0c;不想刷codeforces了&#xff0c;到洛谷提高组训练营找几道水题刷着玩玩&#xff08;虽然自己早已过了打OI的年纪&#xff09;&#xff5e; 简单博弈论专题 P1199 三国游戏 这么考虑&#xff0c;由于电脑总是不能让我搭配出当前能搭配出的最大的…

医院(jzoj 1611)

医院 题目大意&#xff1a; 有n个城市&#xff0c;有m条线路使他们相连&#xff08;有向&#xff09;&#xff0c; 在一些城市中建立医院&#xff0c;相连的城市只能有一间医院&#xff0c;每个医院可以派医生去别的城市&#xff0c;当医生走的线路>3时&#xff0c;他们会…