BZOJ 1901 Dynamic Rankings 树董事长

标题效果:间隔可以改变k少

我的两个天树牌主席。。。

隔断Count On A Tree 之后我一直认为,随着树的主席的变化是分域林木覆盖率可持久段树。

。。

事实上,我是误导。。。

尼可持久化线段树毛关系都木有啊!!

那就是动态的权值线段树啊啊啊啊啊啊啊!!!

好吧这里给不明确主席树的孩纸一些简单介绍:

1.外层树状数组

2.里层线段树

3.线段树动态开节点。仅此而已。和可持久化全然没关系。

4.一个点上的线段树和其它版本号毛关系都没有。

5.正常依照普通的树套树往里插即可了。

7.询问时把log个线段树放在一起跑(不要看我的代码,我的代码写的是log^3的)

8.节点数是nlog^2n

9.看题解要专心。没有第六点你看到了么。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 10100
using namespace std;
struct Tree{
    Tree *ls,*rs;
    int num;
}*tree[M],mempool[2002002],*C=mempool;
int n,m,a[M];
void Insert(Tree*&p,int x,int y,int val)
{
    int mid=x+y>>1;
    if(!p) p=C++;
    p->num++;
    if(x==y)
        return ;
    if(val<=mid)
        Insert(p->ls,x,mid,val);
    else
        Insert(p->rs,mid+1,y,val);
}
void Delete(Tree*&p,int x,int y,int val)
{
    int mid=x+y>>1;
    p->num--;
    if(x==y)
        return ;
    if(val<=mid)
        Delete(p->ls,x,mid,val);
    else
        Delete(p->rs,mid+1,y,val);
}
int Get_Ans(Tree*p,int x,int y,int val)
{
    int mid=x+y>>1;
    if(!p)
        return 0;
    if(!p->num)
        return 0;
    if(x==y)
        return p->num;
    if(val<=mid)
        return Get_Ans(p->ls,x,mid,val);
    else
        return (p->ls?p->ls->num:0) + Get_Ans(p->rs,mid+1,y,val);
}
void Update(int x,int y)
{
    for(;x<=n;x+=x&-x)
        Insert(tree[x],0,1000000000,y);
}
void Downdate(int x,int y)
{
    for(;x<=n;x+=x&-x)
        Delete(tree[x],0,1000000000,y);
}
int Get_Ans(int x,int y)
{
    int re=0;
    for(;x;x-=x&-x)
        re+=Get_Ans(tree[x],0,1000000000,y);
    return re;
}
int Bisection(int x,int y,int k)
{
    int l=0,r=1000000000;
    while(l+1<r)
    {
        int mid=l+r>>1;
        if( Get_Ans(y,mid) - Get_Ans(x-1,mid) >= k )
            r=mid;
        else
            l=mid;
    }
    if( Get_Ans(y,l) - Get_Ans(x-1,l) >= k )
        return l;
    return r;
}
int main()
{
    int i,x,y,k;
    char p[10];
    cin>>n>>m;
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]),Update(i,a[i]);
    for(i=1;i<=m;i++)
    {
        scanf("%s",p);
        if(p[0]=='Q')
            scanf("%d%d%d",&x,&y,&k),printf("%d\n", Bisection(x,y,k) );
        else
            scanf("%d%d",&x,&y),Downdate(x,a[x]),a[x]=y,Update(x,a[x]);
    }
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-07-30 05:51:08

BZOJ 1901 Dynamic Rankings 树董事长的相关文章

[BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log n). 代码 树状数组套线段树 #include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <cstring> usin

BZOJ 1901 Dynamic Rankings

题面: 1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 8088  Solved: 3364[Submit][Status][Discuss] Description 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1 ],a[i+2]--a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变

BZOJ 1901 Dynamic Rankings 主席树

题目大意:可修改的区间第k小 这个主席树卡了我两天...切掉Count On A Tree 之后我就一直认为带修改的主席树是树状数组套可持久化线段树...其实我被误导了... 尼玛带修改的主席树和可持久化线段树毛关系都木有啊!!! 那就是动态的权值线段树啊啊啊啊啊啊啊!!! 好吧这里给不明白主席树的孩纸一些简介: 1.外层树状数组 2.里层线段树 3.线段树动态开节点.仅此而已.和可持久化完全没关系. 4.一个点上的线段树和其他版本毛关系都没有. 5.正常按照普通的树套树往里插就行了. 7.询问

HYSBZ 1901 Dynamic Rankings 树状数组套主席树

ZOJ上面这题内存限制太严格,裸的树套树主席树搞法过不去,BZOJ上面这个放的比较松,可以过. 其实就是利用树状数组维护n颗主席树,然后利用前缀和性质求解第k大. #include <cstdio> #include <cstring> #include <iostream> #include <map> #include <set> #include <vector> #include <string> #include

bzoj 1901: Zju2112 Dynamic Rankings(树套树)

1901: Zju2112 Dynamic Rankings 经典的带修改求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,而且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过不了. 思路很简单,用线段树维护区间,用splay维护区间内的权值,然后询问的时候,二分答案key,然后在区间内找小于key的数有多少个. 贴上模板: #include<stdio.h> #include<string.h> #include<algorithm> #def

Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap

1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6471  Solved: 2697[Submit][Status][Discuss] Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i

BZOJ 1901: Zju2112 Dynamic Rankings( 树状数组套主席树 )

裸的带修改主席树.. 之前用BIT套Splay( http://www.cnblogs.com/JSZX11556/p/4625552.html )A过..但是还是线段树好写...而且快(常数比平衡树小). 时空复杂度是O(Nlog(N)+Mlog^2(N)) ------------------------------------------------------------------------- #include<cstdio> #include<cstring> #in

ZOJ 2112 Dynamic Rankings(树状数组+主席树)

The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with the query like to simply find the k-th smallest number of the given N numbers. They have developed a more powerful system such that for N numbers a[1],

zoj 2112 Dynamic Rankings(树状数组套主席树)

题意:对于一段区间,每次求[l,r]的第k大,存在单点修改操作: 思路: 学习主席树参考: http://blog.csdn.net/wjf_wzzc/article/details/24560117(各种形式) http://blog.csdn.net/bossup/article/details/31921235(推荐) http://blog.csdn.net/xiaofengcanyuexj/article/details/25553521?utm_source=tuicool(图解)