标题效果:给定一个序列,单点变化,询价区间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. [置顶] 轻量级语言Lua入门

    作为一个脚本爱好者,而且是脚本(Perl)起家的我,一有空就喜欢学习下这些脚本语言.据说魔兽世界.愤怒小鸟都用到了它,所以今天研究下Lua这个叫法有点奇特的脚本 [转载请注明出处:http://blo ...

  2. Windows Server 架设VPN要点

    PPTP 为给客户端连接的VPN用户帐户设置“允许拨入”属性. VPN服务端与客户端都无需安装任何证书. L2TP/IPSEC VPN服务器与客户端分别需要在自己的“本地计算机帐户>个人”(而非 ...

  3. HDU 1171 Big Event in HDU (多重背包)

    Big Event in HDU Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  4. HDU 3177 Crixalis&#39;s Equipment(贪婪)

    主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=3177 Problem Description Crixalis - Sand King used t ...

  5. Xamarin 手动安装步骤+破解

    原文:Xamarin 手动安装步骤+破解 由于Xamarin运行的时候有很多依赖项,所以现在在官网上下载的XamarinInstall只是一个下载安装器,并不是软件包.它会自动下载安装所需的依赖软件, ...

  6. java中处理字符编码(网页与数据库)(转)

    首先声明一下,此文章时从网上转载的.如下的某些方法是确实管用,但是从中发现了有一点不足,就是原文笔者没考虑使用不同Web Server时出现的情况,比如文章里我用红色字体画出来的部分代码在Tomcat ...

  7. Android该系统提供的服务--Vibrator(振子)

    Android该系统提供的服务--Vibrator(振子) --转载请注明出处:coder-pig Vibrator简单介绍与相关方法: watermark/2/text/aHR0cDovL2Jsb2 ...

  8. Oracle 阅读器-刚看完表空间回复的详细解释

    (一) 当使用一个控制文件的备份恢复,例如下面的附图.使用备份控制文件恢复位置 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZGVtb25zb24=/fo ...

  9. Linux 下卸载MySQL 5

    对于在Linux下通过rpm方式的mysql,我们能够通过移除这些rpm包以及删除项目的文件夹来达到卸载的目的.本文演示了在SUSE Linux 10下下载MySQL 5.5.37.详细见下文. 1. ...

  10. js“分享到”侧边框伸缩实现

    思路: 1,临界值是 -150 和 0 如果大于临界值,就要隐藏 2,隐藏:速度为负 显示:速度为正 3,如果与临界值相等,就清空定时器 否则,就运动 ------------------------ ...