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了

原文地址:https://www.cnblogs.com/deaf/p/13394772.html