ZROI 部分题目题解
335
首先发现一个性质:
对于最短的边而言,所有点的路径如果经过了这条边,那么路径的权值就是这条边的边权(废话)
那么我们把最短的边拎出来,可以发现,博物馆确定时,每个点按照路标所指方向走一定会经过最短的边或者一定被最短的边的某个端点经过
简单的说,令某一条最短的边的某个端点出发的某一条路径组成的集合为 (S),每个点出发的路径,要么包含某一条最短的边,要么被 (S) 中的某一条边包含
我们把每条边的权值减去 (w),其中 (w) 表示最短边的长度
那么题目转化为最小化一条链的权值和,这条链满足终点是博物馆,起点是某条最短边(也就是现在边权为零的某条边)的某个端点,并且这条链不经过零边
如何最小化一条链的权值和?我们考虑从某条最短边的某个端点开始在链上走,假如经过三条边 (a,b,c),满足权值 (w_b gt w_c),那么可以发现,设 (a=(u,v),b=(v,x)) ,我们选取 ((u,x)) 代替 (a,b) 一定不会更差,所以这条链上的边权基本是递增的
所以说这个链的权值基本上就是每条边的权值和
但是存在一个问题,就是 (a) 不存在的时候,也就是第一、二条边,这个并不能保证顺序,所以我们给每个点订一个初值,
(当时就写到上面那里,然后就忘了写了。。。)
503
首先把 (frac{(A_i - A_j) B_i B_j}{2A_iA_j}) 化简,令 $C_i = frac {B_i} {A_i} $,那么就有 (frac{(A_i - A_j) B_i B_j}{2A_iA_j} =frac 1 2 (B_iC_j - B_jC_i))
发现右边那个东西是叉积,等价于把 ((B_i, C_i) ,(B_j, C_j)) 放在平面直角坐标系里,这两个点与原点组成的三角形的有向面积
那么题目变成求一个上凸壳 + 一个下凸壳
单调队列维护一下即可
504
设最优解为 ((l_1, r_1, x_1), (l_2, r_2, x_2) dots(l_k, r_k, x_k)) 表示把 (l_1) 到 (r_1) 加上 (x_1),(l_2) 到 (r_2) 加上 (x_2),……
那么不难发现 (l_i) 互不相同,因为可以将 ((l,r_1,x_1)) 和 ((l, r_2, x_2)) 变成 ((l, r_1, x_1 + x_2)) 和 ((r_1+1, r_2, x_2 - x_1)) (这里假设 (r_2 geq r_1))
首先发现区间不好做,我们通过差分把区间加变成单点加
首先令 (a_i) 表示第 (i) 个元素距离 (7) 的倍数差多少,然后把 (a) 差分一下
现在问题变成了求最少的操作数,每次操作是选一个位置 (+x),另一个位置 (-x) (可以不选)
注意这里没有顺序要求,完全可以在后面的一个位置上 (+x),在前面的一个位置上 (-x)
而且 (-x) 等价于 (+(7-x))
所以可以先贪心地将 (x) 和 (7 - x) 进行匹配,因为一次操作只影响两个位置,最优的操作也只能消去两个位置,所以贪心没有问题
现在变成了一堆数,这堆数最多有三种,1和6中有一种,2和5中有一种,3和4中有一种,每次操作取出一个数,然后把任意另一个数减去这个数,直到所有数都为0为止,问最小操作次数
发现答案最劣为数的个数,那么和数的个数差多少呢?就是某些数可以被其他的数之和给消掉,也就是说,每一组数,这组数的和为 (7) 的倍数,就可以让答案减去1,所以我们变成了把这堆数分组,看最多能分出多少和为 (7) 的倍数的组
显然这种组里面每个数出现次数不会超过 (6),否则一定能拆成两个组(废话),而最多有三种数,所以可以 (7^3) 预处理所有组,然后令 (f[i][j][k]) 表示三种数分别有 (i,j,k) 个的时候的答案,(dp) 一下即可,复杂度看似 (O(n^3 imes 组数)) 过不去,实际上由于 (i + j + k <= n) 并且 (i,j,k) 的和是已经消去一些数之后的答案,而且因为每一组的和必须是 (7) 的倍数,所以组数和 (7^3) 差距甚远,一般只有几十,所以常数实际上非常小(极限数据大概跑0.6s)
505
分块暴力大法好!
因为修改对某一组的询问的影响显然可以 (O(1)) 计算,所以可以分块暴力
就是令块大小为 (m),然后每修改块大小次的时候就 (O(20 n)) 暴力重构,询问的时候就用答案加上每一次修改对其的影响,复杂度 (O(frac {20n^2} {m} + nm)),由均值不等式,取 (m = sqrt {20n} = 1414) 时,可以做到 (1e8),而且常数几乎为 (1)
正解是树状数组维护系数?没搞懂。。。