5/31/2:00
0、半夜喝完一杯咖啡,写些不明所以的东西,权当自娱自乐
1、二分这东西真是玄学,有时调了几h都不给正确的结果,随手一写却神奇地AC了
正所谓蓦然回首,那人波函数坍缩,显现在灯火阑珊处(大雾)
2、有时收缩边界不同却能得出同样的结果
比如这俩玩意得出的结果居然是一样的
int solve(long double val){
int L=l,R=r-1,ans=-1;
while(L<=R){
int mid=(L+R)>>1;
if(OK(mid))ans=mid,R=mid-1;
else L=mid+1;
}
if(-1==ans)return q[r];//甚至可以把这行删掉
return q[ans];
}
int solve(long double val){
int L=l,R=r-1;
while(L<=R){
int mid=(L+R)>>1;
if(OK(mid))R=mid-1;
else L=mid+1;
}
return q[L];
}
(单调队列二分,下标l~r-1)
甚至和下面这个结果也是一样的
int solve(long double val){
int L=l,R=r-1;
while(L<R){
int mid=L+R>>1;
if(OK(mid))R=mid;
else L=mid+1;
}
return q[L];
}
3、作为一贯偷懒的我,二分这种东西能不用就不用,倍增、BIT多香,两份模板什么的,才不背呢
真香
查找x或x的后继:
while(l<r){
int mid=l+r>>1;//不会取到r
if(a[mid]>=x)r=mid;
else l=mid+1;
}
return l;
查找x或x的前驱:
while(l<r){
int mid=l+r+1>>1;//不会取到l
if(a[mid]<=x)l=mid;
else r=mid-1;
}
return l;
4、https://www.acwing.com/problem/content/description/304/
万恶之源
单调队列+倍增——写不对啊(主要是没题解借chao鉴xi)
单调队列+二分Yes!
5、首先要分清前驱还是后继
如图,斜率递减,要使得mid和mid+1的交点大于等于x,显然是查后继
这个写错必定无了
6、那么要不要判断越界呢?
似乎是不要的
7、我想了好久怎么判越界,比如L=l-1,R=r-2,R=r……
结果弄出来一堆奇奇怪怪的结果……
int query(int k){//二分查找
int L=l,R=r-2;
while(L<R){
int mid=L+R>>1;
if(db(q[mid+1],q[mid])<=k*dk(q[mid+1],q[mid]))L=mid+1;
else R=mid;
}
// if(L==r)return q[r-1];
// cout<<L<<endl;
return q[L];
}
8、那么虽然还是没太搞懂,时间不早了,就先到这里吧
9、bang15便士
10、真是放飞自我啊