Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) E. Vasya and Good Sequences

题目链接

官网题解写的好清楚,和昨晚Aguin说的一模一样……

这题只和每个数1的个数有关,设每个数1的个数的数组为$b$,就是首先一段如果是好的,要满足两个条件:

1.这一段$b$数组和为偶数,因为奇数总会多出一个1,消不掉。

2.这一段$b$数组中最大的要小于等于这一段总和的一半,因为自己里面的1和自己不能消。

有了这两个条件,先处理第一个条件,做法是枚举左端点,然后统计合法的右端点的个数,就$odd$和$even$数组统计后缀和为奇还是偶,偶-偶,奇-奇就好了,这样能够保证$[l,r]$区间是偶数。

再处理第二个条件,因为每个数$<=10^{18}$,所以最多有60个1,而且每个数不为$0$,所以每个数最少有一个1,那$[l,r]$区间长度大于60后,$b$数组的最大值一定小于等于总和的一半,所以只要把$r$在$[l,l+60]$中,和为偶数最大值大于总和一半的减去就行了。

 

猜你喜欢

转载自www.cnblogs.com/wangwangyu/p/9695644.html