Wannafly挑战赛13

Posted tjucxz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wannafly挑战赛13相关的知识,希望对你有一定的参考价值。

A题模拟

B题等价于有n^2 -1个白球 1个黑球 摸出来m个摸到黑球的概率 组合数学搞搞

C题我猜了下,就是1到n行 每行加0,1,2,...n-1 每列加1,n+1,2n+1.....n^2-n+1是一种可行解 然后两边全排列的情况也行,然后交换行列的位置也行,所以是2*(p!)^2

D题切一个蛋糕肯定是均匀切划算,因为不均匀切这一刀就会贡献质量差,然后就是找到最大的蛋糕,对它多切一刀看行不行模拟。

E题先把线段按右端点排序,能与当前线段产生异或最大的会排在前面,我们就从左到右处理,首先对于当前处理的线段l,r先二分出之前线段的r在当前线段的[l,r]之间的范围,然后就是查询这个范围的线段的l+r,与l-r ,画一画就知道了。

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;
const int maxn = 2e5+9;
struct line{
    int l,r;
    bool operator <(line a)const{
        return r<a.r;
    }
}l[maxn];
const int inf = 0x3f3f3f3f;
struct Node{
    int p[2];
}node[maxn<<2];
void build(int l,int r,int root){
    if(l==r){
        node[root].p[0] = inf;
        node[root].p[1] = -inf;
        return ;
    }
    int mid=l+r>>1;
    build(l,mid,root<<1);
    build(mid+1,r,root<<1|1);
}
void pushup(int root){
    node[root].p[0] =min(node[root<<1].p[0],node[root<<1|1].p[0]);
    node[root].p[1] =max(node[root<<1].p[1],node[root<<1|1].p[1]);
}
void update(int l,int r,int root,int pos,int p0,int p1){
    if(l==r){
        node[root].p[0] = p0;
        node[root].p[1] = p1;
        return;
    }
    int mid=l+r>>1;
    if(pos<=mid) update(l, mid, root<<1, pos, p0, p1);
    else update(mid+1, r, root<<1|1, pos, p0, p1);
    pushup(root);
}
int ql,qr;
int pp0,pp1;
void query(int l,int r,int root){
    if(ql<=l && r<=qr) {
        pp0 = min(pp0,node[root].p[0]);
        pp1 = max(pp1,node[root].p[1]);
        return ;
    }
    int mid=l+r>>1;
    if(qr<=mid) {
        query(l, mid, root<<1);
    }else if(ql>mid) {
        query(mid+1, r,root<<1|1);
    }else {
        query(l, mid, root<<1);
        query(mid+1, r, root<<1|1);
    }
}
int bs(int ll,int rr,int val){
    int ans = rr;
    while (ll<=rr) {
        int mid=ll+rr>>1;
        if(l[mid].r>=val){
            rr=mid-1;
            ans = mid;
        }else{
            ll = mid+1;
        }
    }
    return ans;
}
int main(int argc, const char * argv[]) {
    int n;
    
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&l[i].l,&l[i].r);
    }
    sort(l+1,l+1+n);
    build(1,n,1);
    int anss  = 0;
    for(int i=1;i<=n;i++){
        update(1, n, 1, i, l[i].l+l[i].r,l[i].l-l[i].r);
        qr = i;
        ql = bs(1,i,l[i].l);
        pp0 = inf;
        pp1 = -inf;
        query(1, n, 1);
        anss = max(anss,l[i].l+l[i].r-pp0);
        anss = max(anss,l[i].r-l[i].l+pp1);
    }
    printf("%d\n",anss);
    return 0;
}

  F题留坑,马上学

以上是关于Wannafly挑战赛13的主要内容,如果未能解决你的问题,请参考以下文章

Wannafly挑战赛13

Wannafly挑战赛13 D-applese的生日

Wannafly挑战赛13 VVQ 与线段

Wannafly挑战赛21A

Wannafly挑战赛4. B

NowCoder Wannafly挑战赛23 体验记