标题效果:给定一个序列,单点变化,询价区间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 与更改的树董事长的更多相关文章

  1. [ZJU 2112] Dynamic Rankings

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1901 [算法] 首先 , 考虑没有修改操作 不妨建立可持久化线段树 , 第i棵树维护 ...

  2. 【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小的数是 ...

  3. 【BZOJ 1901】Zju2112 Dynamic Rankings &&【COGS 257】动态排名系统 树状数组套线段树

    外面是树状数组,里面是动态开点线段树,对于查询我们先把有关点找出来,然后一起在线段树上行走,这样就是单个O(log2)的了 #include <cstdio> #include <v ...

  4. ZOJ 2112 Dynamic Rankings(二分,树套树)

    动态区间询问kth,单点修改. 区间用线段树分解,线段树上每条线段存一颗平衡树. 不能直接得到kth,但是利用val和比val小的个数之间的单调性,二分值.log^3N. 修改则是一次logN*log ...

  5. 整体二分&cdq分治 ZOJ 2112 Dynamic Rankings

    题目:单点更新查询区间第k大 按照主席树的思想,要主席树套树状数组.即按照每个节点建立主席树,然后利用树状数组的方法来更新维护前缀和.然而,这样的做法在实际中并不能AC,原因即卡空间. 因此我们采用一 ...

  6. ZOJ 2112 Dynamic Rankings(动态区间第 k 大+块状链表)

    题目大意 给定一个数列,编号从 1 到 n,现在有 m 个操作,操作分两类: 1. 修改数列中某个位置的数的值为 val 2. 询问 [L, R] 这个区间中第 k 大的是多少 n<=50,00 ...

  7. 主席树[可持久化线段树](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 ...

  8. 整体二分(SP3946 K-th Number ZOJ 2112 Dynamic Rankings)

    SP3946 K-th Number (/2和>>1不一样!!) #include <algorithm> #include <bitset> #include & ...

  9. ZOJ 2112 Dynamic Rankings(主席树の动态kth)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2112 The Company Dynamic Rankings ...

随机推荐

  1. 【OC加强】NSDate的使用方法——日期时间在实际开发中比較有用

    (1)日期的最主要知识点就是日期转换成字符串格式化输出,相反就是依照某个格式把字符串转换成日期. (2)一般关于时区的设置非常少用到,仅仅要了解就可以. #import <Foundation/ ...

  2. in与exist , not in与not exist 的区别(转)

    in和exists  in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询.一直以来认为exists比in效率高的说法是不准确的.  如果查询的 ...

  3. spring问题排查-调低日志等级

    问题描写叙述 1. 页面经过一次改动后,提交后页面出现400错误,可是后台并没有输出不论什么错误信息. 2. debug监听应页面对应的提交链接也没有不论什么反应(没有进入后台的controller方 ...

  4. oracle12c(oracle12.1.0.1.0)安装指南--实测OEL5.9(RH5)

    [root@oel ora12c]# uname -a Linux oel 2.6.39-300.26.1.el5uek #1 SMP Thu Jan 3 18:31:38 PST 2013 x86_ ...

  5. 挺好用的SQLSERVER数据库自动备份工具SQLBackupAndFTP(功能全面)

    原文:挺好用的SQLSERVER数据库自动备份工具SQLBackupAndFTP(功能全面) 挺好用的SQLSERVER数据库自动备份工具SQLBackupAndFTP(功能全面) 这个工具主要就是自 ...

  6. HTTP求

    client联系server后,至server获取问题 Web 新闻资源,简称client至server发送一个 HTTP 求. 一个完整的 HTTP 该请求包含以下示例: ① ②若干消息头(请求头) ...

  7. FusionCharts简明教程(一)---建立FusionCharts图形

    由于该项目需要的报告需要做的事情,选择FusionCharts作为一种工具. 由于该报告没有任何接触,网上有没有更具体fusionCharts课程,所以我们决定做一个彻底的研究FusionCharts ...

  8. OPhone SDK初体验

    OPhone SDK初体验 write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 背景说明 中国伟大的垄断龙头,世界上也是顶尖的中移动最 ...

  9. [Django] Base class in the model layer

    In the model layer, the Model class is the base class while the ModelBase class is metaclass.

  10. 【Web探索之旅】第二部分第二课:服务器语言

    内容简介 1.第二部分第二课:服务器语言 2.第二部分第三课预告:框架和内容管理系统 第二部分第二课:服务器语言 介绍了Web的客户端,我们来谈谈Web的服务器端. 既然客户端有客户端的编程语言(HT ...