【BZOJ1901】【Luogu2617】Dynamic Ranking(主席树,树状数组)
【BZOJ1901】【Luogu2617】Dynamic Ranking(主席树,树状数组)
题面
神TM BZOJ权限题
Luogu真良心
题解
如果不考虑修改
很容易的主席树区间第K大
考虑修改
那么修改操作复杂度\(O(nlogn)\)
因此,将区间的和利用树状数组来维护
修改复杂度降为\(O(log^2n)\)
虽然查询的复杂度升为\(O(log^2n)\)
但是整体复杂度变为\(O(mlog^2n)\)
于是就愉快的AC了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAX 20005
#define lson t[now].ls
#define rson t[now].rs
#define mid ((l+r)>>1)
#define Q q
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
struct Node
{
int v;
int ls,rs;
}t[MAX<<9];
int tot;
int S[MAX],sum,a[MAX],n,m;
int rt[MAX],cnt0,cnt1;
int tmp[3][MAX];
struct OPT
{
bool opt;
int l,r,k;
int pos,t;
}Q[MAX];
inline int lowbit(int x){return x&(-x);}
void Modify(int &now,int l,int r,int pos,int val)
{
if(!now)now=++tot;
t[now].v+=val;
if(l==r)return;
if(pos<=mid)Modify(lson,l,mid,pos,val);
else Modify(rson,mid+1,r,pos,val);
}
void PreModify(int x,int val)
{
int k=lower_bound(&S[1],&S[sum+1],a[x])-S;
while(x<=n)
{
Modify(rt[x],1,sum,k,val);
x+=lowbit(x);
}
}
int Query(int l,int r,int k)
{
if(l==r)return l;
int s=0;
for(int i=1;i<=cnt1;++i)s+=t[t[tmp[1][i]].ls].v;
for(int i=1;i<=cnt0;++i)s-=t[t[tmp[0][i]].ls].v;
if(k<=s)
{
for(int i=1;i<=cnt1;++i)tmp[1][i]=t[tmp[1][i]].ls;
for(int i=1;i<=cnt0;++i)tmp[0][i]=t[tmp[0][i]].ls;
return Query(l,mid,k);
}
else
{
for(int i=1;i<=cnt1;++i)tmp[1][i]=t[tmp[1][i]].rs;
for(int i=1;i<=cnt0;++i)tmp[0][i]=t[tmp[0][i]].rs;
return Query(mid+1,r,k-s);
}
}
int PreQuery(int l,int r,int k)
{
cnt0=cnt1=0;l--;
while(r)tmp[1][++cnt1]=rt[r],r-=lowbit(r);
while(l)tmp[0][++cnt0]=rt[l],l-=lowbit(l);
return Query(1,sum,k);
}
char opt[3];
int main()
{
n=read();m=read();
for(int i=1;i<=n;++i)S[++sum]=a[i]=read();
for(int i=1;i<=m;++i)
{
scanf("%s",opt);
q[i].opt=opt[0]=='Q';
if(q[i].opt)q[i].l=read(),q[i].r=read(),q[i].k=read();
else q[i].pos=read(),q[i].t=S[++sum]=read();
}
sort(&S[1],&S[sum+1]);
sum=unique(&S[1],&S[sum+1])-S-1;
for(int i=1;i<=n;++i)PreModify(i,1);
for(int i=1;i<=m;++i)
{
if(q[i].opt)
{
printf("%d\n",S[PreQuery(Q[i].l,Q[i].r,Q[i].k)]);
}
else
{
PreModify(Q[i].pos,-1);
a[Q[i].pos]=Q[i].t;
PreModify(Q[i].pos,1);
}
}
return 0;
}
【BZOJ1901】【Luogu2617】Dynamic Ranking(主席树,树状数组)的更多相关文章
- [BZOJ1901][luogu2617]Dynamic Rankings(树状数组+主席树)
题面 单点修改,区间求第k大 分析 首先,这道题卡权值线段树套treap的做法,所以只能用主席树做 对于静态的查询,root[i]对应的主席树的区间[l,r]保存的是a[1]~a[i]有多少个值落在区 ...
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- 【bzoj1901】dynamic ranking(带修改主席树/树套树)
题面地址(权限题) 不用权限题的地址 首先说说怎么搞带修改主席树? 回忆一般的kth问题,我们的主席树求的是前缀和,这样我们在目标区间的左右端点的主席树差分下就能求出kth. 那么我们如何支持修改操作 ...
- 【bzoj1901】dynamic ranking(带修改主席树)
传送门(权限) 传送门(非权限) 花了一晚上总算把代码调好了……才知道待修改主席树怎么操作…… 然而还是一知半解orz…… 先说说我的理解吧 我们一般建主席树的时候都是直接在序列上建的 但是如果有修改 ...
- [bzoj1901][Zju2112]Dynamic Rankings_主席树
Dynamic Rankings bzoj-1901 Zju-2112 题目大意:给定一个n个数的序列,m个操作,支持:单点修改:查询区间k小值. 注释:$1\le n,m\le 10^4$. 想法: ...
- BZOJ1901 Zju2112 Dynamic Rankings 主席树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1901 题意概括 给你一段序列(n个数),让你支持一些操作(共m次), 有两种操作,一种是询问区间第 ...
- BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9094 Solved: 3808[Submit][Status][Discuss] Descript ...
- [Luogu2617]Dynamic Ranking
题面戳这 类似算法总结 1.静态整体Kth 滑稽吧...sort一遍就好了. 时间复杂度\(O(nlogn)\) 空间复杂度\(O(n)\) 2.动态整体Kth 离散化后开一棵权值线段树,每个位置的值 ...
- BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...
- BZOJ1146 [CTSC2008]网络管理Network 树链剖分 主席树 树状数组
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1146 题意概括 在一棵树上,每一个点一个权值. 有两种操作: 1.单点修改 2.询问两点之间的树链 ...
随机推荐
- ajax常用操作
load的方法的使用(现在已不常用) <!doctype html><html lang="en"><head> <meta charse ...
- Java中的双重检查锁(double checked locking)
最初的代码 在最近的项目中,写出了这样的一段代码 private static SomeClass instance; public SomeClass getInstance() { if (nul ...
- bzoj[1835][ZJOI2010]base 基地选址
bzoj[1835][ZJOI2010]base 基地选址 标签: 线段树 DP 题目链接 题解 这个暴力DP的话应该很容易看出来. dp[i][j]表示造了i个通讯站,并且j是第i个的最小费用. \ ...
- 如何在CentOS 7上部署Google BBR【搬运、机翻】
如何在CentOS 7上部署Google BBR 本文章搬运自 https://www.vultr.com/docs/how-to-deploy-google-bbr-on-centos-7 [注:文 ...
- Activiti中的log4j(slf4j)的配置
今天试了一下在Activiti中使用log4j来进行配置发现这个会出现问题,其实Activiti中的日志系统是采用的是slf4j而不是log4j 然后使用slf4j驱动log4j来做的 通过Proce ...
- DxPackNet 3.音频捕捉(录音)
用DxpackNet捕捉音频其实很简单 1.初始化控件 IDxMicrophCapture microphone; private void Form1_Load(object sender, Eve ...
- es6之let和const命令的一些笔记
let和const命令 let命令 基本用法 let命令用来声明变量,声明的变量只在命令所在的代码块内有效.for循环中很适合使用let命令. 有必要理解的例子: var a = []; for (v ...
- POJ - 3414 bfs [kuangbin带你飞]专题一
状态搜索,每种状态下面共有六种选择,将搜索到的状态保存即可. d[i][j]表示状态A杯中水i升,B杯中水j升,总状态数量不会超过A杯的容量 * B杯的容量. AC代码 #include<cst ...
- filebeat.yml(中文配置详解)
################### Filebeat Configuration Example ######################### ####################### ...
- 前端JS面试题汇总 Part 3 (宿主对象与原生对象/函数调用方式/call与apply/bind/document.write)
原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...