Kids and Prizes,D - Maximum AND 位运算,G - Two Merged Sequences

107 阅读1分钟

Kids and Prizes - SGU 495 - Virtual Judge (vjudge.net) 概率

对于每个奖品没被拿到的概率是((n-1)/n)^m

奖品没被拿到的期望就是n*((n-1)/n)^m

则奖品被拿到的期望就是n-n*((n-1)/n)^m

然后输出这个公式就可以了,,,

D - Maximum AND 位运算

如果在这一位上a和b正好可以凑出n对1和0来,那么这一位就可以被选上,但是没有想好如何去选,,其实只要看看a[i]和~b[i](~按位取反)是否都相同就可以,看代码就很明白了

Educational Codeforces Round 134 (Rated for Div. 2) A - D - 知乎 (zhihu.com)

ll t,n,a[100005],b[100005],c[100005],d[100005];
bool check(ll x){
    for(int i=1;i<=n;i++) c[i]=d[i]=0;
    for(int i=1;i<=n;i++) c[i]=a[i]&x,d[i]=~b[i]&x;
    sort(c+1,c+n+1);
    sort(d+1,d+n+1);
    for(int i=1;i<=n;i++)
        if(c[i]!=d[i]) return 0;
    return 1;
}
int main(){
    scanf("%lld",&t);
    while(t--){
        scanf("%lld",&n);
        for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
        for(int i=1;i<=n;i++) scanf("%lld",&b[i]);
        ll ans=0;
        for(int i=30;i>=0;i--){
            if(check(ans|(1<<i))) ans|=(1<<i);
        }
        printf("%lld\n",ans);
    }
    return 0;
}

G - Two Merged Sequences

对于a[i],如果只能放在上升序列就放在上升序列,如果只能放在下降序列就放在下降序列,如果都可以放那就看看a[i]和a[i+1]的关系,如果a[i]>a[i+1]那么a[i]放在下降序列,a[i]<a[i+1]就放在上升序列,如果相等就一个放在上升一个放在下降,因为a[i]>a[i+1]放在下降序列或者是上升序列的情况都是把a[i]放在a[i+1]前面,其实也就相当于把这个数给去掉,所以还是比较合理的

Codeforces 1144G Two Merged Sequences - Dup4 - 博客园 (cnblogs.com)

ll n,a[200005];
int main(){
    scanf("%lld",&n);
    ll dec=-1,inc=-1,flag=1;
    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++){
        bool fg1=0,fg2=0;
        if(dec>a[i]||dec==-1) fg1=1;
        if(inc<a[i]||inc==-1) fg2=1;
        if(!fg1&&!fg2){
            flag=0;break;
        }
        if(fg1&&!fg2){
            dec=a[i];a[i]=1;
        }
        else if(!fg1&&fg2){
            inc=a[i];a[i]=0;
        }
        else{
            if(a[i]>a[i+1]) dec=a[i],a[i]=1;
            else if(a[i]<a[i+1]) inc=a[i],a[i]=0;
            else{
                dec=a[i],a[i]=1;
                inc=a[i+1],a[i+1]=0;
                i++;
            }
        }
    }
    if(!flag) printf("NO\n");
    else{
        printf("YES\n");
        for(int i=1;i<=n;i++) printf("%lld ",a[i]);
    }
    return 0;
}