[hdu6601]Keen On Everything But Triangle

有两个结论:1.排序后,答案一定是连续的三个数;2.当序列长度超过44一定有三个相同的数(因为即使该序列是斐波那契数列,此时也超过了1e9),然后用主席树等数据结构(略卡常,建议主席树)来维护前45大即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define N 100005
 4 #define mid (l+r>>1)
 5 #define inf 1000000000
 6 int V,n,m,k,x,y,a[N],b[N],r[N],f[N*20],ls[N*20],rs[N*20];
 7 void update(int k1,int &k2,int l,int r,int x){
 8     k2=++V;
 9     ls[k2]=ls[k1];
10     rs[k2]=rs[k1];
11     f[k2]=f[k1]+1;
12     if (l==r)return;
13     if (x<=mid)update(ls[k1],ls[k2],l,mid,x);
14     else update(rs[k1],rs[k2],mid+1,r,x);
15 }
16 int query(int k1,int k2,int l,int r,int p){
17     if (l==r)return l;
18     if (f[rs[k2]]-f[rs[k1]]>=p)return query(rs[k1],rs[k2],mid+1,r,p);
19     return query(ls[k1],ls[k2],l,mid,p-f[rs[k2]]+f[rs[k1]]);
20 }
21 int main(){
22     while (scanf("%d%d",&n,&m)!=EOF){
23         V=0;        
24         for(int i=1;i<=n;i++)scanf("%d",&a[i]);
25         for(int i=1;i<=n;i++)b[i]=a[i];
26         sort(b+1,b+n+1);
27         int k=unique(b+1,b+n+1)-b-1;
28         for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+k+1,a[i])-b;
29         for(int i=1;i<=n;i++)update(r[i-1],r[i]=++V,1,k,a[i]);
30         for(int i=1;i<=m;i++){
31             scanf("%d%d",&x,&y);
32             int ma=min(y-x+1,45),flag=0;
33             for(int j=1;j<=ma;j++){
34                 a[j]=query(r[x-1],r[y],1,k,j);
35                 if ((j>2)&&(b[a[j-1]]+b[a[j]]>b[a[j-2]])){
36                     printf("%lld\n",0LL+b[a[j]]+b[a[j-1]]+b[a[j-2]]);
37                     flag=1;
38                     break;
39                 }
40             }
41             if (!flag)printf("-1\n");
42         }
43     }
44 }
View Code
原文地址:https://www.cnblogs.com/PYWBKTDA/p/11260516.html