2019hdu第二场

Posted zsben991126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 Nodeint 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第二场的主要内容,如果未能解决你的问题,请参考以下文章

2019杭电多校第二场hdu6602 Longest Subarray(线段树)

2019年杭电多校第二场 1008题Harmonious Army(HDU6598+最小割+建图)

2019 杭电多校 第二场

第二场 hdu 6052 To my boyfriend

HDU 5301 Buildings(2015多校第二场)

2018 hdu 多校 第二场