2024.9.19 LGJ Round
A
给定数组 \(a,b\),长度为 \(n\),\(\sum a,\sum b\le V=10^7\),问 \(\sum_{i=1}^n\sum_{j=1}^n\sqrt{|a_i-b_j|}\)。
躺尸题,\(a,b\) 不同的数只有 \(\sqrt V\) 种。
B
坐标轴上有 \(n\) 个点,每个点 \((x,y)\) 你必须令其变为 \((0,y)\) 或 \((x,0)\),问两两点距离最大值最小。
\(n\le 10^5,|x|,|y|\le 10^8\)。
贪心,当确定了 \(y\) 轴坐标最大值与最小值后,在这个区间里的全部变成 \((0,y)\),不在的变为 \((x,0)\)。
考虑二分答案,显然这个可以双指针处理,以 \(x\) 排序后,预处理前后缀最大值即可。
最后我们还要把 \(x,y\) 轴坐标反过来处理一遍。
D
有 \(n\) 个位置,每个位置分属一种颜色。操作有两种,求出最后每个颜色的 \(cnt\)。
一是区间加 \(k\),那么在这个区间里每个位置其所属的颜色 \(cnt\gets cnt+k\);二是区间改颜色。
朴素的做法:考虑线段树,每个节点有两种标记:还需区间加多少;是否有区间该颜色。
对于区间加,我们先把标记撒到 \(\log n\) 个节点上,如果该节点有改颜色标记,那么直接加上并取消标记。
否则,就把区间加标记留下。这样做一个节点两种标记不同时存在。
对于区间改颜色,我们把标记撒的时候,如果有区间加,就要下放;如果是改颜色,直接覆盖即可。
仅此。
高妙的做法:倒序遍历操作,如果是区间加就直接加上,区间改颜色就是区间求和并清零。