多校2 Keen On Everything But Triangle hdu6601 主席树

Posted bxd123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多校2 Keen On Everything But Triangle hdu6601 主席树相关的知识,希望对你有一定的参考价值。

 

 

题意 给出一个n位序列 a    有m个询问   l r  问在al -ar  之间能选取的最大周长的三角形

 

 

比赛的时候 用莫队算法  但是一直超时   (感觉时间复杂度不是特别高呀。。。)

 

可以用主席树遍历区间最大到最小来找三角形  

技术图片
#include<bits/stdc++.h>
using namespace std;
//input by bxd
#define rep(i,a,b) for(ll i=(a);i<=(b);i++)
#define repp(i,a,b) for(ll i=(a);i>=(b);--i)
#define RI(n) scanf("%d",&(n))
#define RII(n,m) scanf("%d%d",&n,&m)
#define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define RS(s) scanf("%s",s)
#define ll long long
#define see(x) (cerr<<(#x)<<‘=‘<<(x)<<endl)
#define pb push_back
#define inf 0x3f3f3f3f
#define pb push_back
#define CLR(A,v)  memset(A,v,sizeof A)
#define lson l,m,pos<<1
#define rson m+1,r,pos<<1|1

//////////////////////////////////
const ll N=1e5+56;

ll a[N],b[N],T[N<<5],L[N<<5],R[N<<5],t[N<<5],cnt;

ll build(ll l,ll r)

    ll rt=++cnt;
    t[rt]=0;
    if(l<r)
    
        ll m=(l+r)>>1;
        L[rt]=build(l,m);
        R[rt]=build(m+1,r);
    
    return rt;


ll upnode(ll pre,ll x,ll l,ll r)

    ll rt=++cnt;
    L[rt]=L[pre];R[rt]=R[pre];t[rt]=t[pre]+1;
    if(l<r)
    
        ll m=(l+r)>>1;
        if(x<=m)L[rt]=upnode(L[pre],x,l,m);
        else R[rt]=upnode(R[pre],x,m+1,r);
    
    return rt;


ll qsum(ll u,ll v,ll k,ll l,ll r)

    if(l>=r)return l;
    ll x=t[L[v]]-t[L[u]];ll m=(l+r)>>1;
    if(x>=k)return qsum(L[u],L[v],k,l,m);
    else return qsum(R[u],R[v],k-x,m+1,r);


ll n,q;
int main()

    while(cin>>n>>q)
    
        CLR(t,0);CLR(T,0);cnt=0;
        
        rep(i,1,n)scanf("%lld",&a[i]),b[i]=a[i];
        sort(b+1,b+1+n);
        ll m=unique(b+1,b+1+n)-b-1;
        T[0]=build(1,m);
        rep(i,1,n)
        
            ll t=lower_bound(b+1,b+1+m,a[i])-b;
            T[i]=upnode(T[i-1],t,1,m);
        
        ll x,y,aa,bb,cc;
        while(q--)
        
           scanf("%lld%lld",&x,&y);

           if(y-x<2)printf("-1\n");continue;

           aa=b[qsum(T[x-1],T[y], y-x+1 ,1,m)];

           bb=b[qsum(T[x-1],T[y], y-x   ,1,m)];
           cc=b[qsum(T[x-1],T[y], y-x-1 ,1,m)];
           ll k=y-x-2;
           while(bb+cc<=aa&&k>0)
           
               aa=bb;
               bb=cc;
               cc=b[qsum(T[x-1],T[y],k,1,m)];
               k--;
           
           if(bb+cc<=aa)
            printf("-1\n");
           else printf("%lld\n",aa+bb+cc);
        
    

    return 0;
View Code

 

以上是关于多校2 Keen On Everything But Triangle hdu6601 主席树的主要内容,如果未能解决你的问题,请参考以下文章

ACM的探索之Keen On Evrything But Triangle(我觉得可以很接近啦!!)

hdu 6354 Everything Has Changed

Presto系列 | 一Presto SQL On Everything

Presto系列 | 一Presto SQL On Everything

树链剖分2022杭电多校2 1001 Static Query on Tree

树链剖分2022杭电多校2 1001 Static Query on Tree