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的主要内容,如果未能解决你的问题,请参考以下文章