Wannafly挑戰賽13
阿新 • • 發佈:2018-04-09
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