20200728训练记录
做了两道可做题,和一道神仙题
C发现是CTSC2016的题就先开了
发现建出操作树每一个点的贡献在dfn序列上是一段连续的区间
于是线段树分治+set维护动态凸包,询问直接set上二分就可以\(O(nlog^2n)\)
后来发现不需要动态的
直接类似永久化把每个点打在线段树上的log个区间上
查询直接在从上到下的log个区间上找就好了
把点按x坐标排序维护个单调栈就\(O(nlogn)\)预处理了
考虑询问优化到一个log
类似前几天做的子串求和2的做法
对询问的x坐标排序
那么对于线段树上每个节点维护的凸包决策点是单调的
用指针扫下就\(O((n+q)logn)\)了
写了1h左右中间没特殊处理点的横坐标相同的情况WA了好久
A数树看出把所有港口缩成一个点后原图是一棵树
于是直接prufer序算确定所有港口总度数的方案
写个dp算一下港口分配度数的方案
乘起来就好了
发现模数不是质数要暴力分解质因数算
结果没写完
B是神仙题
\(O(nm)\)的dp不难想到
但是优化就显得非常困难
题解继续告诉我们dp数组是个下凸包
这个用类似归纳法比较好证
但是很难想到啊喂
考虑用线段树维护凸包相邻点之间连线的解析式
发现对于在一个层结束或开始的点
他的贡献是一条斜率是1/-1的直线
是一个下凸包
分析一下上一层转移到这一层
发现是一个分段函数
前面一段斜率为定值
中间答案不变
后面一段斜率又是定值
这又是下凸包
于是也就说明整体是下凸包
写个线段树支持区间赋值/增加,单点查就ok了