其他分享
首页 > 其他分享> > 2019杭电多校第二场

2019杭电多校第二场

作者:互联网

6595 Everything Is Generated In Equal Probability

题意

给定一个\(n\),从\([1,n]\)中等概率取出一个数,再等概率生成一个\(n\)的全排列,再计算这个全排列的函数值,求这个函数值的期望。

函数表达为输入一个全排列,计算其逆序数,再等概率取出一个子序列(可以是空,可以是原序列),递归计算该子序列的函数值,累加返回。

分析

代码

6600 Just Skip The Problem

题意

通过询问确定一个数\(x\),每次询问\(y_i\),回答\(x\&y_i\)是否等于\(y_i\),问最少询问次数的方案数。

分析

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e6+3;
ll n;
int main(void){
    while(~scanf("%lld",&n)){
        //n>=1e6+3 n!肯定含有1e6+3这个因子,所以结果一定为0
        if(n>=1000003){
            printf("0\n");
            continue;
        }
        ll ans=1ll;
        for(ll i=2ll;i<=n;i++){
            ans=ans*i%mod;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

6601 Keen On Everything But Triangle

题意

给n个棍子,多次询问区间内能组成三角形的最大周长。

分析

代码

#include <bits/stdc++.h>
using namespace std;
#define mid (l+r)/2
typedef long long ll;
const int N=1e5+50;
int tr[N*30],sum[N*30],lr[N*30],rr[N*30];
int n,q,a[N],b[N],l,r;
int cnt;
int build(int l,int r){
    int rt=++cnt;
    sum[rt]=0;
    if(l==r){
        return rt;
    }
    lr[rt]=build(l,mid);
    rr[rt]=build(mid+1,r);
    return rt;
}
int update(int pre,int l,int r,int x){
    int rt=++cnt;
    lr[rt]=lr[pre];
    rr[rt]=rr[pre];
    sum[rt]=sum[pre]+1;
    if(l==r){
        return rt;
    }
    if(x<=mid){
        lr[rt]=update(lr[pre],l,mid,x);
    }else{
        rr[rt]=update(rr[pre],mid+1,r,x);
    }
    return rt;
}
int kth(int a,int b,int l,int r,int k){
    if(l>=r){
        return l;
    }
    int x=sum[lr[b]]-sum[lr[a]];
    if(k<=x){
        return kth(lr[a],lr[b],l,mid,k);
    }else{
        return kth(rr[a],rr[b],mid+1,r,k-x);
    }
}
int main(void){
    // freopen("in.txt","r",stdin);
    while(~scanf("%d%d",&n,&q)){
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            b[i]=a[i];
        }
        //权值建树记得离散化
        sort(b+1,b+1+n);
        int m=unique(b+1,b+1+n)-b-1;
        //多组记得初始化
        cnt=0;
        //离散化后范围记得是m
        tr[0]=build(1,m);
        for(int i=1;i<=n;i++){
            a[i]=lower_bound(b+1,b+1+m,a[i])-b;
            tr[i]=update(tr[i-1],1,m,a[i]);
        }
        while(q--){
            scanf("%d%d",&l,&r);
            int len=r-l+1;
            ll ans=-1;
            while(len>=3){
                int aa=b[kth(tr[l-1],tr[r],1,m,len)];
                int bb=b[kth(tr[l-1],tr[r],1,m,len-1)];
                int cc=b[kth(tr[l-1],tr[r],1,m,len-2)];
                if(aa>=bb+cc){
                    len--;
                    continue;
                }
                ans=1ll*aa+1ll*bb+1ll*cc;
                break;
            }
            printf("%lld\n",ans);
        }
    }
    return 0;
}

标签:rt,杭电多校,第二场,int,ll,tr,2019,lr,sum
来源: https://www.cnblogs.com/zxcoder/p/11253099.html