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 ...
随机推荐
- 隐马尔科夫模型(HMM)及事实上现
马尔科夫模型 马尔科夫模型是单重随机过程,是一个2元组:(S,A). 当中S是状态集合,A是状态转移矩阵. 仅仅用状态转移来描写叙述随机过程. 马尔科夫模型的2个如果 有限历史性如果:t+l时刻系统状 ...
- osgi实战学习之路:3. osgi分层概念及相互合作demo
源码下载 分层: modual: 主要作用于包级管理与共享代码 lifecycle: 主要作用于执行期间的模块管理与訪问osgi底层框架 service: 主要作用于多模块之间的相互通信 demo: ...
- hdu 1394 Minimum Inversion Number(线段树之 单点更新求逆序数)
Minimum Inversion Number T ...
- OGG-01008 Extract displays Discarding bad record (discard recs=1) when using filter or where clause
因为在extract參数文件里使用了where语句,而where后面的的条件列又不是主键,没有为update.delete操作记录日志,因此会报1008错误. Applies to: Oracle G ...
- Matlab绘图-很详细,很全面
强大的绘图功能是Matlab的特点之一,Matlab提供了一系列的绘图函数,用户不需要过多的考虑绘图的细节,只需要给出一些基本参数就能得到 所需图形,这类函数称为高层绘图函数.此外,Matlab还提供 ...
- c#并行任务多种优化方案分享(异步委托)
遇到一个多线程任务优化的问题,现在解决了,分享如下. 假设有四个任务: 任务1:登陆验证(CheckUser) 任务2:验证成功后从Web服务获取数据(GetDataFromWeb) 任务3:验证成功 ...
- 在mac os下编译android -相关文章
1. Mac OS X下编译Android源码 http://blog.csdn.net/bulreed/article/details/22783467 2.MAC OS 编译 Android源代码 ...
- 在 树莓派上使用 c++ libsockets library
rpi默认安装的编译器是gcc-4.6.2 而现在最新的c++ libsockets library 需要使用支持c++-11特征的编译器,即需要4.8.2才可以.为此,需要先升级编译器才可以支持编译 ...
- js操作string它substr方法
substr 方法 从指定的指定起始位置的长度返回一个子. stringvar.substr(start [, length ]) 參数 stringvar 必选项. 要提取子字符串的字符串文字或 S ...
- 【LeetCode】- Valid Palindrome(右回文)
[ 问题: ] Given a string, determine if it is a palindrome, considering only alphanumeric characters an ...