摘要: 题面 "CodeForces" 题解 横着切和竖着切是互相不影响的。 假设现在横着切成了很多段,显然此时面积最大的矩形的一边长就是这些段中长度最长的一段。竖着切的也是一样的。 所以就可以用$set$来维护切过的横、纵坐标与每一段的长度。 修改时,先找到相邻的两刀,再找到对应的长度,删去这个长度,再加 阅读全文
posted @ 2019-02-03 17:19 water_mi 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 题面 "CodeForces" <! more 题解 因为要保证两两不同,所以不能单纯的开堆来维护,堆维护一个二元组,个数为第一关键字,编号为第二关键字,对于一个相同的颜色,统计一下这个颜色的个数再用堆来维护就好了。 阅读全文
posted @ 2019-02-03 17:08 water_mi 阅读(183) 评论(0) 推荐(0) 编辑
摘要: 题面 "Bzoj" 题解 很显然,我们只需要考虑单独取线段上方的情况,对于下方的把坐标取反再做一遍即可(因为我们只关心最终的答案) 建立树状数组维护一个横坐标区间内有多少个点,维护双向链表实现查询一个点左(右)横坐标最大(小)的与它相同的点。 首先枚举没有取到的颜色,找出所有不包含这种颜色的区间,更 阅读全文
posted @ 2019-02-03 16:57 water_mi 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 题面 "Bzoj" "洛谷" 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治。 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内,那就把它用并查集并起来。最后对于一个询问,直接用并查集找就好了。 但是因为有撤销操作,所以 阅读全文
posted @ 2019-02-03 16:44 water_mi 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 题面 "Bzoj" 题解 对于每个节点,我们可以用树链剖分和线段树维护以下信息: 单独在某个点分配$i$个人的最大收益(可以$O(m)$计算) 分配$i$的最大收益(可以$O(m^2)$计算) cpp include include include using std::min; using std 阅读全文
posted @ 2019-02-03 16:33 water_mi 阅读(296) 评论(0) 推荐(0) 编辑
摘要: 题面 "Bzoj" "洛谷" 题解 考虑一个什么样的区间满足重组之后可以变成$3$的倍数。不妨设$tot$为一个区间内$1$的个数。如果$tot$是个偶数,则这个区间一定是$3$的倍数,接着考虑奇数的情况。 如果只有$1$个$1$,那么无论如何都不行,只需考虑$3$个$1$的情况,因为其他的$1$可 阅读全文
posted @ 2019-02-03 15:41 water_mi 阅读(268) 评论(0) 推荐(0) 编辑