【BZOJ】1901: Zju2112 Dynamic Rankings
【题意】带修改的查询区间第k小
【算法】树状数组套可持久化线段树
【题解】对于树状数组上的每个节点,维护可持久化权值线段树(节点为权值),从而达到查询前缀和的目的。
对于每次修改,在待修改线段树基础上运用可持久化性质来修改,先删除原数字,再加入新数字。
注意记录修改后的原数字,方便后来删除。
★注意区分权值范围和数组范围的区别!!!
复杂度O(n log2n)。
注意点全部标注在代码中,细节巨多。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
using namespace std;
int read()
{
char c;int s=,t=;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
const int maxn=;
struct tree{int l,r,sum;}t[];//空间开大!!!100w都过不去啊。。。
char s[];
int cnt1,cnt2,a1[maxn],a2[maxn],a[maxn],b1[maxn],b2[maxn],b3[maxn],n,m,root[maxn],tot,c[maxn*],sz=; void insert(int l,int r,int x,int &y,int v,int c){
y=++sz;//设置新节点!!!
t[y]=t[x];t[y].sum+=c;
if(l==r)return;
int mid=(l+r)>>;
if(v<=mid)insert(l,mid,t[x].l,t[y].l,v,c);
else insert(mid+,r,t[x].r,t[y].r,v,c);
}
int ask(int l,int r,int v){
if(l==r)return l;
int sum=;
for(int i=;i<=cnt1;i++)sum-=t[t[a1[i]].l].sum;
for(int i=;i<=cnt2;i++)sum+=t[t[a2[i]].l].sum;
int mid=(l+r)>>;
if(sum>=v){
for(int i=;i<=cnt1;i++)a1[i]=t[a1[i]].l;
for(int i=;i<=cnt2;i++)a2[i]=t[a2[i]].l;
return ask(l,mid,v);
}
else{
for(int i=;i<=cnt1;i++)a1[i]=t[a1[i]].r;
for(int i=;i<=cnt2;i++)a2[i]=t[a2[i]].r;
return ask(mid+,r,v-sum);//转入右边要减去左边的
}
} int lowbit(int x){return x&(-x);}
void modify(int x,int k,int p){for(int i=x;i<=n;i+=lowbit(i))insert(,tot,root[i],root[i],k,p);}
//分清,tot是权值线段树范围,n是数组范围
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
a[i]=read();
c[++tot]=a[i];
}
for(int i=;i<=m;i++){
scanf("%s%d%d",s,&b1[i],&b2[i]);
if(s[]=='Q')b3[i]=read();
else c[++tot]=b2[i];
}
sort(c+,c+tot+);
tot=unique(c+,c+tot+)-c-;
for(int i=;i<=n;i++)a[i]=lower_bound(c+,c+tot+,a[i])-c;
for(int i=;i<=m;i++)if(!b3[i])b2[i]=lower_bound(c+,c+tot+,b2[i])-c;
for(int i=;i<=n;i++)modify(i,a[i],);
for(int i=;i<=m;i++){
if(b3[i]){
cnt1=;cnt2=;
for(int j=b1[i]-;j>=;j-=lowbit(j))a1[++cnt1]=root[j];
for(int j=b2[i];j>=;j-=lowbit(j))a2[++cnt2]=root[j];//用根啊老铁
printf("%d\n",c[ask(,tot,b3[i])]);//询问给的是离散化后的值,要还原
}
else{
modify(b1[i],a[b1[i]],-);
a[b1[i]]=b2[i];
modify(b1[i],b2[i],);
}
}
return ;
}
【BZOJ】1901: Zju2112 Dynamic Rankings的更多相关文章
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...
- 【函数式权值分块】【分块】bzoj1901 Zju2112 Dynamic Rankings
论某O(n*sqrt(n))的带修改区间k大值算法. 首先对序列分块,分成sqrt(n)块. 然后对权值分块,共维护sqrt(n)个权值分块,对于权值分块T[i],存储了序列分块的前i块的权值情况. ...
- 【分块】bzoj1901 Zju2112 Dynamic Rankings
区间k大,分块大法好,每个区间内存储一个有序表. 二分答案,统计在区间内小于二分到的答案的值的个数,在每个整块内二分.零散的暴力即可. 还是说∵有二分操作,∴每个块的大小定为sqrt(n*log2(n ...
- 【基数排序】bzoj1901 Zju2112 Dynamic Rankings
论NOIP级别的n²算法…… 跟分块比起来,理论上十万的数据只慢4.5倍左右的样子…… #include<cstdio> #include<algorithm> using n ...
- BZOJ 1901 Zju2112 Dynamic Rankings
树阵主席设置树.维护间隔动态K大. .. ZOJ到空间太小,太大,仅仅能到BZOJ上交 1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memor ...
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7143 Solved: 2968[Su ...
- bzoj 1901: Zju2112 Dynamic Rankings(树套树)
1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...
- Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6471 Solved: 2697[Su ...
随机推荐
- Dijkstra+优先队列 模板
#include<bits/stdc++.h> using namespace std; #define ll long long ; const ll inf=1e17; struct ...
- lintcode-129-重哈希
129-重哈希 哈希表容量的大小在一开始是不确定的.如果哈希表存储的元素太多(如超过容量的十分之一),我们应该将哈希表容量扩大一倍,并将所有的哈希值重新安排.假设你有如下一哈希表: size=3, c ...
- String、Date、Calendar之间的转换
1.String.Date.Calendar之间的转换 要用到格式化类SimpleDateFormat package com.rong.se; import java.text.ParseExcep ...
- 复利计算器Junit单元测试
一.测试场景 测试模块 测试输入 预期结果 运行结果 bug跟踪 复利计算 (本金,利率,年限,次数) 终值 测试运算结果 (100,5,3,1) 115.76 115.76 测试输入负数 ...
- python mysql查询结果乱码
在connect()方法中传入charset='utf8'参数即可. conn = MySQLdb.connect(host=get_config_values('mysql', 'host'), p ...
- Fn+F1-F12,避免使用FN+
用惯了win8.1,再用win10 很不习惯使用FN+F1-F12 如果要避免使用FN+:使用[FN+ESC]
- Hibernate 中 load() 方法导致的 noSession 异常
之所以要写这个,是因为最近碰到了一个延迟加载的 load() 导致出现 noSession 的异常. 下面第三种方式解决这个问题需要用到一个本地线程的对象,也就是 ThreadLocal 类,之前写过 ...
- asp.netMVC中权限控制论
这里设想了一个简单的思路,如果用户登录了,也就是session中有值才可以在控制器中操作,这样先添加一个控制器,如下代码: public class AuthController : Controll ...
- el表达式作用域查找顺序 注意:当属性名字相同时候 先找到是小的作用域 因为是从小到大开始找的
- BZOJ4033:[HAOI2015]树上染色——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4033 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将 ...