思路:
第一眼看题目,压根就没去想要用二分,但看到是在二分这个章节中才去用二分去想
不说废话了,进入正题:
首先: 二分因先考虑二分什么–>二分看破绽是在前面还是在后面
插播一条消息:
由于,破绽只有一个,也就是说整个数组中(每个位置的防具的个数的那个数组)
只有一个为奇数,则其他的都为偶数
那就可以用前缀和判断破绽的大概位置,若破绽在 1 ~ mid 中,则 1 ~ mid 的前缀和为奇数
然后: 就是要判断对于当前位置而言它以及它前面的防具的个数
然后就可以推出,对于每一段防具而言,在当前位置以前的防具的个数:
LL find ( LL wz )
{
LL ans=0;
for ( LL i=1;i<=n;i++ )
{
LL r=a[i].y,l=a[i].x,d=a[i].z,k= ( wz-l+1 ) %d==0?0:1;
//因为每个防具放置在每段d的第一个上,so若有剩余则必定可以放一个上去
if ( wz>=l ) ans+= ( min ( wz,r ) -l+1 ) /d+k;