A - Physical Education Lessons
CF915E Physical Education Lessons
题解:没什么好说的,动态开点模板题(好像普通线段树也可以做)
B - GCD of an Array
CF1493D GCD of an Array
题解:暴力分解质因数,修改的时候也把x分解,对每个质数开一个可重集合(multiset)记录一下每个质数出现的不同位置的个数,如果个数是n就计算答案,修改multiset。
C - Omkar and Medians
CF1536D Omkar and Medians
题解:新加一个数中位数只可能移动一位,所以如果前面一个数在后面两个数之间就一定无解。
D - Xor-Set
CF1261F Xor-Set
题解:首先可以把每个区间拆成若干个\([x,x+2^i)\),为什么呢?因为可以用线段树维护。
不难发现一段\([x,x+2^i)\)区间里的数二进制前一段都是一样的,后一段是全排列,而且i越大后一段越长。
如果两个区间\([x,x+2^i)\)和\([y,y+2^j)\)其中i>j,那么后i位是全排列,而前面是确定的。
在树上总能找到\([y,y+2^j)\)的父亲\([y,y+2^i)\),我们发现用\([y,y+2^i)\)代替\([y,y+2^j)\)结果是不变的,也就是只需要考虑同样长度(即深度一样)的区间。
就用线段树来实现即可,dfs的过程中记录当前高位的异或值,当有区间被完全覆盖后就返回。
E - 扫描线
P5490 【模板】扫描线
题解:扫描线模板
F - Parade
CF35E Parade
题解:发现轮廓线顶点只有在高度变化的时候才会出现,直接动态开点维护高度
H - Number of Groups
CF1691E Number of Groups
题解:下文把蓝色简称为b,红色简称rd。左端点为l,右端点为r。
发现两朵云要想连起来的充要条件是:r[b]>=l[rd]并且l[b]<=r[rd]。有两个条件不好做,考虑通过排序去掉一个。
先将b按照r从小到大排序,rd按照l从大到小排序,那么枚举rd的时候一旦有r[b]>=l[rd],这个b就对于后面的所有rd都满足这个条件。我们只用考虑l[b]<=r[rd]这个条件。只用把满足前一个条件的b丢到优先队列里就好判断了。这一个rd判断完以后如果合并了b,把其中一个最小的l[b]丢回去。
I - T-shirt buying
CF799B T-shirt buying
题解:开三个set,对于每个询问找对应的两个集合里最小的价格,然后把它从所有集合里删去。
J - Equalize the Remainders
CF999D Equalize the Remainders
题解:贪心,用set记录每一个余数的个数,循环余数,记录下一个少了的位置。