码迷,mamicode.com
首页 > 其他好文 > 详细

2019hdu第二场

时间:2019-08-16 21:00:54      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:click   签到   while   复杂   node   continue   依次   gif   class   

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:队友过的规律题

 

2019hdu第二场

标签:click   签到   while   复杂   node   continue   依次   gif   class   

原文地址:https://www.cnblogs.com/zsben991126/p/11366024.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!