zoukankan      html  css  js  c++  java
  • hdu 4417 划分树

    思路:二分枚举区间第k大。用划分树查找是否符合要求的高度。

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #define Maxn 100010
    #define lson(x) x<<1
    #define rson(x) x<<1|1
    #define mid ((tree[po].l+tree[po].r)>>1)
    using namespace std;
    int val[20][Maxn],toLeft[20][Maxn],sorted[Maxn];
    struct Tree{
        int l,r;
    }tree[Maxn*4];
    void BuildTree(int l,int r,int dep,int po)
    {
        tree[po].l=l,tree[po].r=r;
        if(l==r)
            return ;
        int same=mid-l+1,i;
        for(i=l;i<=r;i++)
            if(val[dep][i]<sorted[mid])
            same--;
        int lpos=l,rpos=mid+1;
        for(i=l;i<=r;i++){
            if(i==l)
            toLeft[dep][i]=0;
            else
            toLeft[dep][i]=toLeft[dep][i-1];
            if(val[dep][i]<sorted[mid])
                toLeft[dep][i]++,val[dep+1][lpos++]=val[dep][i];
            else
            if(val[dep][i]>sorted[mid])
                val[dep+1][rpos++]=val[dep][i];
            else
                if(same)
                toLeft[dep][i]++,val[dep+1][lpos++]=val[dep][i],same--;
                else
                val[dep+1][rpos++]=val[dep][i];
        }
        BuildTree(l,mid,dep+1,lson(po));
        BuildTree(mid+1,r,dep+1,rson(po));
    }
    int query(int l,int r,int k,int dep,int po)
    {
        if(l==r)
            return val[dep][l];
        int vd,invd;
        if(l==tree[po].l){
            vd=toLeft[dep][r];
            invd=0;
        }
        else{
            vd=toLeft[dep][r]-toLeft[dep][l-1];
            invd=toLeft[dep][l-1];
        }
        if(vd>=k){
            int newl=invd+tree[po].l;
            int newr=invd+vd+tree[po].l-1;
            return query(newl,newr,k,dep+1,lson(po));
        }
        else{
            int ss=l-tree[po].l-invd;
            int s=r-l+1-vd;
            int newl=mid+ss+1;
            int newr=mid+ss+s;
            return query(newl,newr,k-vd,dep+1,rson(po));
        }
    }
    int solve(int s,int t,int x)
    {
        int i,j,l,r,Mid;
        l=0,r=t-s+1;
        while(l+1<r){
            Mid=(l+r)>>1;
            int temp=query(s,t,Mid,0,1);
            if(temp>x)
                r=Mid-1;
            else
                l=Mid;
        }
        if(r>=1)
        if(query(s,t,r,0,1)<=x)
            return r;
        return l;
    }
    int main()
    {
        int n,m,i,j,l,r,Case=0,t,x;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            for(i=1;i<=n;i++){
                scanf("%d",&val[0][i]);
                sorted[i]=val[0][i];
            }
            sort(sorted+1,sorted+1+n);
            BuildTree(1,n,0,1);
            printf("Case %d:
    ",++Case);
            for(i=1;i<=m;i++){
                scanf("%d%d%d",&l,&r,&x);
                l++,r++;
                printf("%d
    ",solve(l,r,x));
            }
        }
        return 0;
    }
  • 相关阅读:
    (HDOJ 2503)a/b + c/d
    用VSTS进行网站压力测试
    .NET中IDisposable接口的基本使用
    创建ASP.Net自定义控件
    petshop4.0详解
    .net中SQL防注入代码
    petshop4 缓存机智在sql2005上的设置
    Asp.net自定义控件:概念
    .Net pet shop 4 和 MSMQ
    .net缓存自己总结的几条
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3248418.html
Copyright © 2011-2022 走看看