zoukankan      html  css  js  c++  java
  • HDU6601 Keep On EveryThing But Triangle(可持久化线段树)

    /*
     * hdu6601
     * 题意:
     * 给你一个长度为n的序列,有q个询问,每个询问给你一个区间[l,r],每次询问问你在区间[l,r]中,能够组成的最大的三角形的周长
     * 分析:
     * 因为三角形具有两边之和大于第三条边,利用这个性质,每次询问贪心的去枚举
     * 第k大,第k+1大,第k+2大去比较,如果不符合条件则继续向后找,时间复杂度(qlogn)
    */
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    const int maxn=4e5+10;
    int n,q,m,tot;
    int a[maxn];
    int t[maxn];
    int T[maxn];
    int lson[maxn*30],rson[maxn*30],c[maxn*30];
    void init_hash () {
        for (int i=1;i<=n;i++) t[i]=a[i];
        sort(t+1,t+n+1);
        m=unique(t+1,t+n+1)-t-1;
    }
    int build (int l,int r) {
        int root=tot++;
        c[root]=0;
        if (l!=r) {
            int mid=(l+r)>>1;
            lson[root]=build(l,mid);
            rson[root]=build(mid+1,r);
        }
        return root;
    }
    int Hash (int x) {
        return lower_bound(t+1,t+m+1,x)-t;
    }
    int update (int root,int pos,int val) {
        int newroot=tot++,tmp=newroot;
        c[newroot]=c[root]+val;
        int l=1,r=m;
        while (l<r) {
            int mid=(l+r)>>1;
            if (pos<=mid) {
                lson[newroot]=tot++;
                rson[newroot]=rson[root];
                newroot=lson[newroot];
                root=lson[root];
                r=mid;
            }
            else {
                rson[newroot]=tot++;
                lson[newroot]=lson[root];
                newroot=rson[newroot];
                root=rson[root];
                l=mid+1;
            }
            c[newroot]=c[root]+val;
        }
        return tmp;
    }
    int query (int left_root,int right_root,int k) {
        int l=1,r=m;
        while (l<r) {
            int mid=(l+r)>>1;
            if (c[lson[left_root]]-c[lson[right_root]]>=k) {
                r=mid;
                left_root=lson[left_root];
                right_root=lson[right_root];
            }
            else {
                l=mid+1;
                k-=c[lson[left_root]]-c[lson[right_root]];
                left_root=rson[left_root];
                right_root=rson[right_root];
            }
        }
        return l;
    }
    int main () {
        while (~scanf("%d%d",&n,&q)) {
            tot=0;
            for (int i=1;i<=n;i++) scanf("%d",&a[i]);
            init_hash();
            T[n+1]=build(1,m);
            for (int i=n;i;i--) {
                int pos=Hash(a[i]);
                T[i]=update(T[i+1],pos,1);
            }
            while (q--) {
                int l,r;
                scanf("%d%d",&l,&r);
                ll ans=-1;
                int k=(r-l+1);
                while (k>=3) {
                    ll x1=t[query(T[l],T[r+1],k)];
                    ll x2=t[query(T[l],T[r+1],k-1)];
                    ll x3=t[query(T[l],T[r+1],k-2)];
                    if (x1<x2+x3) {
                        ans=x1+x2+x3;
                        break;
                    }
                    k--;
                }
                printf("%lld
    ",ans);
            }
        }
        return 0;
    }
  • 相关阅读:
    Python 集合
    Python sorted()
    CodeForces 508C Anya and Ghosts
    CodeForces 496B Secret Combination
    CodeForces 483B Friends and Presents
    CodeForces 490C Hacking Cypher
    CodeForces 483C Diverse Permutation
    CodeForces 478C Table Decorations
    CodeForces 454C Little Pony and Expected Maximum
    CodeForces 313C Ilya and Matrix
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12841048.html
Copyright © 2011-2022 走看看