2019hdu第二场

10:签到求n!取模

#include <iostream>
#include <iterator>
#include <algorithm>
typedef long long ll;
using namespace std;
const ll mod=1e6+3;
ll n;
ll res[mod+3];
int main(){
    res[0]=1%mod;
    res[1]=1%mod;
    for(int i=2;i<=mod+1;i++){
        res[i]=(res[i-1]*i)%mod; 
    } 
    while(scanf("%lld",&n)!=EOF){
        if(n>=mod) printf("0\n");
        else printf("%lld\n",res[n]);
    }
    return 0;
}
View Code

11:签到,主席树维护a[]数组,然后对于每个q,去询问区间第1大,第2大,第3大,如果不能组成三角形,则询问区间第4大,依次类推,询问次数最多为O(logn),总复杂度O(qlogn*logn)

/*
主席树维护区间[l,r]
查找第1大,第2大,第3大,第4大 
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define ll long long 
ll a[maxn],n,b[maxn];

int tot,m,rt[maxn];
struct Node{int lc,rc,sum;}t[maxn*25];
int update(int last,int l,int r,int pos){
    int now=++tot;
    t[now]=t[last];t[now].sum++;
    if(l==r)return now;
    int mid=l+r>>1;
    if(pos<=mid)
        t[now].lc=update(t[last].lc,l,mid,pos);
    else t[now].rc=update(t[last].rc,mid+1,r,pos);
    return now;
}
int query(int st,int ed,int l,int r,int k){
    if(l==r)return l;
    int mid=l+r>>1;
    int sum=t[t[ed].lc].sum-t[t[st].lc].sum;
    if(k<=sum)return query(t[st].lc,t[ed].lc,l,mid,k);
    else return query(t[st].rc,t[ed].rc,mid+1,r,k-sum);
}
int build(int l,int r){
    int now=++tot;
    t[now].lc=t[now].rc=t[now].sum=0;
    if(l==r)return now;
    int mid=l+r>>1;
    t[now].lc=build(l,mid);
    t[now].rc=build(mid+1,r);
    return now;
}

int main(){
    int q;
    while(scanf("%d%d",&n,&q)==2){
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            b[i]=a[i];
        }
        sort(b+1,b+1+n);
        m=unique(b+1,b+1+n)-(b+1);
//cout<<m<<endl;
        for(int i=1;i<=n;i++)
            a[i]=lower_bound(b+1,b+1+m,a[i])-b;
        
        tot=0;
        rt[0]=build(1,m);
        for(int i=1;i<=n;i++)
            rt[i]=update(rt[i-1],1,m,a[i]);
        int l,r;
        while(q--){
            scanf("%d%d",&l,&r);
            if(r-l+1<3){puts("-1");continue;}
            int len=r-l+1;
            ll x=b[query(rt[l-1],rt[r],1,m,len)],y=b[query(rt[l-1],rt[r],1,m,len-1)],z=b[query(rt[l-1],rt[r],1,m,len-2)];
            len-=3;
            while(x>=y+z){
                if(len==0)break;
                x=y,y=z;z=b[query(rt[l-1],rt[r],1,m,len)];
                len--;
            }
            if(x>=y+z)puts("-1");
            else cout<<x+y+z<<'\n';
        }
            
    }    
} 
View Code

12:队友过的规律题

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/11366024.html