BZOJ 1901 Zju 2112 Dynamic Rankings 与更改的树董事长
标题效果:给定一个序列,单点变化,询价区间k大。
思维:假设没有变化。然后划分树就可以解决,但树的分工仍然是一棵树,它不支持的变化。
主席舒变化实际上是在外带fenwick右护套层值段树,但正确的值线段树必须动态开节点。然后改动的时候就像树状数组改动那样,每次改动logn个权值线段树。
查询的时候也一样。返回logn个权值线段树统计的和。
最后为了求区间第k大,还须要二分答案。
CODE:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 10010
#define MAX_RANGE 1000000000
using namespace std; struct Complex{
Complex *son[2];
int num;
Complex() {
son[0] = son[1] = NULL;
num = 0;
}
}*fenwick[MAX]; int cnt,asks;
int src[MAX]; char c[10]; inline void Fix(int x,int c);
inline void _Fix(int x,int c);
inline int GetSum(int x,int k); void Insert(Complex *&a,int l,int r,int x);
void Delete(Complex *&a,int l,int r,int x);
int Ask(Complex *a,int l,int r,int k); int Ask(int x,int y,int k); int main()
{
cin >> cnt >> asks;
for(int i = 1;i <= cnt; ++i) {
scanf("%d",&src[i]);
Fix(i,src[i]);
}
for(int x,y,z,i = 1;i <= asks; ++i) {
scanf("%s",c);
if(c[0] == 'Q') {
scanf("%d%d%d",&x,&y,&z);
printf("%d\n",Ask(x,y,z));
}
else {
scanf("%d%d",&x,&y);
_Fix(x,src[x]);
Fix(x,src[x] = y);
}
}
return 0;
} inline void Fix(int x,int c)
{
for(;x <= cnt;x += x&-x)
Insert(fenwick[x],0,MAX_RANGE,c);
} inline void _Fix(int x,int c)
{
for(;x <= cnt;x += x&-x)
Delete(fenwick[x],0,MAX_RANGE,c);
} inline int GetSum(int x,int k)
{
int re = 0;
for(;x;x -= x&-x)
re += Ask(fenwick[x],0,MAX_RANGE,k);
return re;
} int Ask(int x,int y,int k)
{
int l = 0,r = MAX_RANGE,ans = 0;
while(l <= r) {
int mid = (l + r) >> 1;
int temp = GetSum(y,mid) - GetSum(x - 1,mid);
if(temp >= k)
r = mid - 1,ans = mid;
else l = mid + 1;
}
return ans;
} void Insert(Complex *&a,int l,int r,int x)
{
if(a == NULL) a = new Complex();
a->num++;
if(l == r) return ;
int mid = (l + r) >> 1;
if(x <= mid) Insert(a->son[0],l,mid,x);
else Insert(a->son[1],mid + 1,r,x);
} void Delete(Complex *&a,int l,int r,int x)
{
if(!--a->num) {
free(a);
a = NULL;
return ;
}
if(l == r) return ;
int mid = (l + r) >> 1;
if(x <= mid) Delete(a->son[0],l,mid,x);
else Delete(a->son[1],mid + 1,r,x);
} int Ask(Complex *a,int l,int r,int k)
{
if(a == NULL) return 0;
if(l == r) return a->num;
int mid = (l + r) >> 1;
if(k <= mid) return Ask(a->son[0],l,mid,k);
else {
int left = a->son[0] == NULL ? 0:a->son[0]->num;
return left + Ask(a->son[1],mid + 1,r,k);
}
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
BZOJ 1901 Zju 2112 Dynamic Rankings 与更改的树董事长的更多相关文章
- [ZJU 2112] Dynamic Rankings
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1901 [算法] 首先 , 考虑没有修改操作 不妨建立可持久化线段树 , 第i棵树维护 ...
- 【bzoj 1901】Zju2112 Dynamic Rankings
Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是 ...
- 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树
外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...
- ZOJ 2112 Dynamic Rankings(二分,树套树)
动态区间询问kth,单点修改. 区间用线段树分解,线段树上每条线段存一颗平衡树. 不能直接得到kth,但是利用val和比val小的个数之间的单调性,二分值.log^3N. 修改则是一次logN*log ...
- 整体二分&cdq分治 ZOJ 2112 Dynamic Rankings
题目:单点更新查询区间第k大 按照主席树的思想,要主席树套树状数组.即按照每个节点建立主席树,然后利用树状数组的方法来更新维护前缀和.然而,这样的做法在实际中并不能AC,原因即卡空间. 因此我们采用一 ...
- ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)
题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...
- 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )
在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...
- 整体二分(SP3946 K-th Number ZOJ 2112 Dynamic Rankings)
SP3946 K-th Number (/2和>>1不一样!!) #include <algorithm> #include <bitset> #include & ...
- ZOJ 2112 Dynamic Rankings(主席树の动态kth)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112 The Company Dynamic Rankings ...
随机推荐
- Java--调试--单步调试,断言,单元测试
单步调试:主要查看变量内容的变化 1.设置断点位置,设置在可能出现问题的代码 2.以Debug as方式运行 程序 3.F5 --> step into 进入方法内部进行调试 F6 ...
- JavaScript类数组对象参考
JavaScript和DOM中有很多类数组对象,它们有以下特点 1.有length属性 2.可以使用[]通过下标访问 3.部分类数组对象使用[]访问成员时不只可以使用下标,还可以使用id或name 4 ...
- 2010多校第一题 hdu3440House Man 差分约束系统
给我们n座房子,房子的高度各不相同, 从最低的房子开始, 每次跳到更高的房子, 跳n-1次最能跳到最高的房子了,但是每次跳跃的距离不能超过d 将这些房子在一维的方向上重新摆放(但是保持输入时的相对位置 ...
- UVALive 3890 Most Distant Point from the Sea(凸包最大内接园)
一个n个点的凸多边形,求多边形中离多边形边界最远的距离.实际上就是求凸包最大内接圆的半径. 利用半平面交求解,每次二分枚举半径d,然后将凸包每条边所代表的半平面沿其垂直单位法向量平移d,看所有平移后的 ...
- Drupal 7 电子邮件的发送设置 SMTP, Mail System, Mime Mail
尽管Drupal自带发送email功能,可是非常多server须要SMTP验证.这个时候就须要安装 SMTP 模块. 激活 SMTP 模块 进入配置 admin/config/system/smtp ...
- set、env、export差分
set:显示当前shell变量,用户变量包含当前用户 env:显示用户变量 export:显示当前导出成用户变量的shell变量 举例来说: root@kali:~# aaa=bbb ...
- C# 32位程序访问64位系统注册表
原文:C# 32位程序访问64位系统注册表 我的上一篇文章已经阐述了“32位程序和64位程序在64位平台上读\写注册表的区别”,那么接下来将要回答上篇所留下来的一个问题:32位程序如何访问64位系统注 ...
- 【剑指offer】q50:树节点最近的祖先
#@ root: the root of searched tree #@ nodeToFind: the tree-node to be found #@ path: the path from r ...
- EHCache的使用
在开发高并发量,高性能的网站应用系统时,缓存Cache起到了非常重要的作用.本文主要介绍EHCache的使用,以及使用EHCache的实践经验.笔者使用过多种基于Java的开源Cache组件,其中包括 ...
- Linux 下卸载MySQL 5
对于在Linux下通过rpm方式的mysql,我们能够通过移除这些rpm包以及删除项目的文件夹来达到卸载的目的.本文演示了在SUSE Linux 10下下载MySQL 5.5.37.详细见下文. 1. ...