1. 程式人生 > >Wannafly挑戰賽13

Wannafly挑戰賽13

ons main con else brush 合數 當前 就是 n+1

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