【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急
明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已
好吧,其实只有一个指针,指向该结点的权值线段树的当前结点
每次查询之前,要让指针指向根结点
不同结点的权值线段树之间毫无关联
可以看这个:http://blog.csdn.net/popoqqq/article/details/40108669?utm_source=tuicool
#include<cstdio>
#include<algorithm>
using namespace std;
struct Data
{
int p,v;
}t[20010];
int e,en=1;
bool cmp(const Data &a,const Data &b)
{
return a.v<b.v;
}
int n,m,a[20010],ma[20010],x[10010],y[10010],z[10010];
char op[10010][2];
struct Node{int v,ch[2];}T[20010*195];
int root[10010],now[2][10010];
void Init_root(int ql,int qr)
{
--ql;
for(;ql;ql-=(ql&(-ql))) now[0][ql]=root[ql];
for(;qr;qr-=(qr&(-qr))) now[1][qr]=root[qr];
}
int qBIT(int K,int ql,int qr)
{
int res=0;
for(int x=ql-1;x;x-=(x&(-x))) res-=T[T[now[0][x]].ch[0]].v;
for(int x=qr;x;x-=(x&(-x))) res+=T[T[now[1][x]].ch[0]].v;
bool f=(res<K);
for(int x=ql-1;x;x-=(x&(-x))) now[0][x]=T[now[0][x]].ch[f];
for(;qr;qr-=(qr&(-qr))) now[1][qr]=T[now[1][qr]].ch[f];
return res;
}
int Kth(int K,int ql,int qr,int l,int r)//K小值
{
if(l==r) return l;
int m=(l+r>>1),tmp;
if((tmp=qBIT(K,ql,qr))>=K) return Kth(K,ql,qr,l,m);
return Kth(K-tmp,ql,qr,m+1,r);
}
void Update(int p,int v,int cur,int l,int r)
{
if(l==r)
{
T[cur].v+=v;
return;
}
int m=(l+r>>1);
if(p<=m)
{
if(!T[cur].ch[0]) T[cur].ch[0]=++e;
Update(p,v,T[cur].ch[0],l,m);
}
else
{
if(!T[cur].ch[1]) T[cur].ch[1]=++e;
Update(p,v,T[cur].ch[1],m+1,r);
}
T[cur].v=T[T[cur].ch[0]].v+T[T[cur].ch[1]].v;
}
void Update(int pp,int p,int v)
{
for(;pp<=n;pp+=(pp&(-pp)))
Update(p,v,root[pp],1,en);
}
int main()
{
// freopen("bzoj1901.in","r",stdin);
// freopen("bzoj1901.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&t[i].v);
e=n;
for(int i=1;i<=m;++i)
{
scanf("%s%d",op[i],&x[i]);
if(op[i][0]=='C')
scanf("%d",&t[++e].v);
else
scanf("%d%d",&y[i],&z[i]);
}
for(int i=1;i<=e;++i)
t[i].p=i;
sort(t+1,t+e+1,cmp);
ma[a[t[1].p]=1]=t[1].v;
for(int i=2;i<=e;++i)
{
if(t[i].v!=t[i-1].v)
++en;
ma[a[t[i].p]=en]=t[i].v;
}
e=n;
for(int i=1;i<=m;++i)
if(op[i][0]=='C')
z[i]=a[++e];
e=n;
for(int i=1;i<=n;++i)
root[i]=i;
for(int i=1;i<=n;++i)
Update(i,a[i],1);
for(int i=1;i<=m;++i)
if(op[i][0]=='C')
{
Update(x[i],a[x[i]],-1);
a[x[i]]=z[i];
Update(x[i],z[i],1);
}
else
{
Init_root(x[i],y[i]);
printf("%d\n",ma[Kth(z[i],x[i],y[i],1,en)]);
}
return 0;
}
【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings的更多相关文章
- BZOJ2141排队——树状数组套权值线段树(带修改的主席树)
题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...
- luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)
带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...
- CF1093E Intersection of Permutations 树状数组套权值线段树
\(\color{#0066ff}{ 题目描述 }\) 给定整数 \(n\) 和两个 \(1,\dots,n\) 的排列 \(a,b\). \(m\) 个操作,操作有两种: \(1\ l_a\ r_a ...
- Dynamic Rankings(树状数组套权值线段树)
Dynamic Rankings(树状数组套权值线段树) 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[ ...
- [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)
[BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...
- 刷题总结——骑士的旅行(bzoj4336 树链剖分套权值线段树)
题目: Description 在一片古老的土地上,有一个繁荣的文明. 这片大地几乎被森林覆盖,有N座城坐落其中.巧合的是,这N座城由恰好N-1条双 向道路连接起来,使得任意两座城都是连通的.也就是说 ...
- 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树
题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...
- 「ZJOI2017」树状数组(二维线段树)
「ZJOI2017」树状数组(二维线段树) 吉老师的题目真是难想... 代码中求的是 \(\sum_{i=l-1}^{r-1}a_i\),而实际求的是 \(\sum_{i=l}^{r}a_i\),所以 ...
- 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)
思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...
随机推荐
- select 标签的两种方式(以动态插入为例)
标准形式: html <select id="sorte_piceid_copy" name="tea" style="display:none ...
- 建筑材料系统 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发
框架介绍: 1.基于 ASP.NET MVC4.0 + WebAPI + EasyUI + Knockout 的架构设计开发 2.采用MVC的框架模式,具有耦合性低.重用性高.生命周期成本低.可维护性 ...
- DIOCP之DEMO-Echo卡死问题分析
最近很多新朋友在调试echo这个例程时发现,总是卡死客户端或服务器端,这是因为客户端的接收数据用的memo没有处理接受到的行数,导致超过最大行数,而卡死界面,只需要如下操作就可以解决: 引用弦子的:虽 ...
- Angularjs学习笔记(三)----依赖注入
一.定义 如前所述,$scope对象被神秘的注入到了控制器中,实际上,这是因为控制器声明了它需要$scope,所以AngularJS才会创建并注入它.这套依赖管理系统可以这样总结:"为了正常 ...
- Python——函数中的关键字参数
关键字参数 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple.而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict.请看 ...
- css总结
1. css中的role属性 html 里面的 role 本质上是增强语义性,当现有的HTML标签不能充分表达语义性的时候,就可以借助role来说明.通常这种情况出现在一些自定义的组件上,这样可增强组 ...
- Linux Windows 修改键盘映射
Linux 下是编辑 ~/.Xmodmap 文件 remove Lock = Caps_Lockkeysym Escape = Caps_Lockkeysym Caps_Lock = Escapead ...
- Windows 2012 R2图标以及字体颜色发生变化更改成默认设置
1. 在桌面按"Win+R",然后输出regedit.2. 定位到HKEY_CURRENT_USER\Control panel\Colors3. 对照下面提供给您的初始化颜色的注 ...
- nginx下开启pathinfo模式
第一种方式是通过重写url来实现pathinfo模式: location / { if (!-e $request_filename){ rewrite ^/(.*)$ /index.php?s=/$ ...
- nodejs npm常用命令
npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准.有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包. 1.npm install m ...