CF1004A Sonya and Hotels
显然可以对相邻两个酒店间的距离分类讨论,记得加上最外面的两个酒店往外的一个贡献.
CF1004B Sonya and Exhibition
根据基本不等式,一个长度为 (l) 的区间要分成两个正整数的和,那么乘积的最大值 (=lfloorfrac{l}{2}
floor imeslceilfrac{l}{2}
ceil).所以按 01010...
这样填一定是最优的.
CF1004C Sonya and Robots
因为相同的数对只能计算一次,所以只有最先出现的位置和最后一次出现的位置才可以产生贡献,可以在最后一次出现的位置的价值变为 (1),那么第一次出现的位置可以得到的代价就变成了这个位置后面的代价的和,可以直接用后缀和解决.
CF1004D Sonya and Matrix
先考虑一圈一圈填数,那么除了 (0) 只出现 (1) 次以外,其他的数如果整圈都是在边界内那么出现的次数一定是 (4) 的倍数,所以靠椅找到第一个不是出现次数不是 (4) 的倍数的数,如果成立的话,那么这个点的横坐标((x))一定是这个值,因为 (n imes m=t),所以可以考虑去枚举 (n),那么这个店的 纵坐标((y))就等于 (n+m-ma-x)((ma) 指输入的数中最大的值),可以直接暴力判断,时间复杂度为 (mathcal{O}(n^{frac{4}{3}})),可以过 (10^6) 是我没想到的.
CF1004E Sonya and Ice Cream
原题,同消防和树网的核,直接跑出直径然后单调队列维护一下最大值和答案取最小值就好了.
CF1004F Sonya and Bitwise OR
考虑直接在线段树上维护答案,那么最关键的问题就是合并两个区间的信息,考虑 (or) 的性质,对于某个数开头的所有前缀的 (or) 的值只有 (log) 种.所以可以在区间上维护当前这个区间的前缀 (or) 的不同的值和每种值的区间的长度,后缀 (or) 同理.那么合并的时候需要计算是经过中间断开位置的区间的个数,显然对于左区间的后缀 (or) 与右区间的前缀 (or) 的 (or) 值如果大于等于 (x),那么就可以产生贡献,因为不同的 (or) 值已经合并的了,所以可以直接暴力合并(左区间枚举一种后缀 (or) 值,右区间枚举一种前缀 (or) 值),复杂度 (mathcal{O(n+mlog_2^3n)}),看起来挺丑的,实际是可以过的.因为 (or) 是具有单调性,所以可以用单指针优化成 (mathcal{O(n+mlog_2^2n)}).