标签:情况 就会 void 挑战 pos while 合数 printf highlight
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题留坑,马上学
标签:情况 就会 void 挑战 pos while 合数 printf highlight
原文地址:https://www.cnblogs.com/tjucxz/p/8758956.html