zoukankan      html  css  js  c++  java
  • hdu6601 Keen On Everything But Triangle(主席树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6601

    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    const int maxn=1e5+5;
    int n,m,a[maxn];
    vector<int> v;
    
    inline int getid(int x){
        return lower_bound(v.begin(),v.end(),x)-v.begin()+1;
    }
    
    typedef struct Node{
        int l,r,sum;
    } no;
    no hjt[maxn*40];
    int cnt,root[maxn];
    
    void insert(int l,int r,int pre,int &now,int p){
        hjt[++cnt]=hjt[pre];
        now=cnt;
        hjt[now].sum++;
        if(l==r) return;
        int m=(l+r)>>1;
        if(p<=m) insert(l,m,hjt[pre].l,hjt[now].l,p);
        else insert(m+1,r,hjt[pre].r,hjt[now].r,p);
    }
    
    int query(int l,int r,int L,int R,int k){
        if(l==r) return l;
        int m=(l+r)>>1;
        int t=hjt[hjt[R].l].sum-hjt[hjt[L].l].sum;
        if(k<=t) return query(l,m,hjt[L].l,hjt[R].l,k);
        else return query(m+1,r,hjt[L].r,hjt[R].r,k-t);
    }
    
    signed main(){
        //freopen("in","r",stdin);
        while(~scanf("%lld%lld",&n,&m)){
            v.clear();cnt=0;
            for(int i=1; i<=n; i++){
                scanf("%lld",&a[i]);
                v.push_back(a[i]);
            }
            sort(v.begin(),v.end());
            v.erase(std::unique(v.begin(),v.end()),v.end());
            for(int i=1; i<=n; i++)
                insert(1,n,root[i-1],root[i],getid(a[i]));
            while(m--){
                int l,r;
                scanf("%lld%lld",&l,&r);
                int len=r-l+1;//区间内数的个数
                int flag=0;
                for(int i=1;i<=r-l-1;i++){
                    int first=query(1,n,root[l-1],root[r],len-i+1)-1;//最大的边
                    int second=query(1,n,root[l-1],root[r],len-i)-1;//第二大
                    int third=query(1,n,root[l-1],root[r],len-i-1)-1;//第三大
                    int e1=v[first],e2=v[second],e3=v[third];
                    if(e2+e3>e1){
                        printf("%lld
    ",e1+e2+e3);
                        flag=1;
                        break;
                    }
                }
                if(flag==0)
                    printf("-1
    ");
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    swiper 内容超出纵向滚动 解决办法
    js判断 微信浏览器 或者 QQ内置浏览器
    移动端滑动 增加弹性 滑动更加顺畅
    移动端点击激活时背景色
    文字两端对齐
    移动端元素被选中时,去除背景
    CSS动画 防止动画结束后,回归原位
    centos 防火墙配置
    知识图谱研究
    jmeter 压测工具
  • 原文地址:https://www.cnblogs.com/xcfxcf/p/12301644.html
Copyright © 2011-2022 走看看