游记
Day1
开场看了看题目:
- $T1$ 看上去比较经典,应该不难;
- $T2$ 的这个式子有点类似于 $CF461D$ ?但是做法应该完全不一样,因为条件和符号差别很大;
- $T3$ 感觉是个难题,想不到模拟以外的做法。
$T1$
首先感觉是二分答案,因为极差和最小值两个东西不好同时处理。
之后写了个枚举 $a$ 的左端点,但是查出错了,就写了枚举最小值和最大值,外面有个排序。
时间复杂度 $O(n \log n)$,应该没啥问题。期望得分 $100$。
$T2$
先将 $b$ 第一行和第一列当成 $0$ 的 $a'$ 算出,再算第一行和第一列对 $a$ 的贡献,算出来的式子应该类似于 $a_{i,j}=(-1)^{x(i,j)}a_{1,i}+(-1)^{y(i,j)} a_{j,1}+(-1)^{z(i,j)}a_{1,1}+a'_{i,j}$。$x,y,z$ 是关于 $i,j$ 的函数。
又因为知道 $0\leq a_{i,j}\leq 10^6$,就有若干个不等式。但是不等式是三元的,没有很好的处理方法。
我现在手上唯一能解不等式的只有差分约束,但是必须得是二元,且二元的系数分别为 $1,-1$。
考虑将 $a_{1,1}$ 也用二元的式子表示,可以将 $a$ 加入第零行和第零列,并钦定 $a_{0,0}=0$,其它新加的位置没有任何限制。
可以发现,对于原来 $a$ 的任何第一行第一列的取值,都有对应的第零行第零列的取值。
于是就变成了二元的,现在的式子类似于 $a_{i,j}=(-1)^jA_i+(-1)^iB_j+a'_{i,j}$,虽然是二元的,但是系数可能不是 $1,-1$。
考场上感觉可以将不等式加减,改变系数,但是显然不等式加减会将约束放宽,但我当时并没有想到,以为和整式消元一样。。。写完发现过不了样例,调了很长时间,才发现不能加减。
最后只能去写暴力,写了个 $m=2$ 的,做法大概是设 $a_{1,m}=x$,然后直接手动解不等式,时间复杂度 $O(n)$。考完才知道输出写错了。期望得分 $0$。
$T3$
$T2$ 花的时间太长了,所以只写了一个模拟。
期望得分 $16$。
Day2
开场看了看题目:
- $T1$ 感觉是个难题,树上的链的奇怪题;
- $T2$ 有个状压的做法,复杂度很高;
- $T3$ 感觉是个难题,支配这个概念以前没有接触过。
$T1$
首先没啥思路,看了看部分分,有一个是一条链,开始的思路是分块,后来想到可以用奇怪的单调队列(?),复杂度 $O(n\log n+q\log n)$。
之后就想其它部分分,想到了二分+暴力跳,复杂度 $O(nc+qc\log c)$。期望得分 $70$?
当时也想过优化暴力跳,但是不知道怎么找上一个颜色为 $c$ 的,以为必须要 $O(nc)$ 预处理。考完才发现可以离线下来边做边求或树剖。
$T2$
写完 $T1$ 部分分花了很长时间,第一次看 $T2$ 的时候还把题看错了,只能做到 $O(2^nn^2m^2)$,优化了半天,才发现过不了样例。
看了看样例解释,发现题看错了,那么可以做到 $O(2^nn^2m)$,常数特别小($\frac 14$,应该还更小),就写了一下,再写了一个 $O(n!\times n)$ 检查。
期望得分 $100$。
$T3$
看了看题,先写了一个 $O(qn^2)$ 的大暴力。
后来再分类讨论了一下一棵树的情况,写了一个倍增,$O(n\log n+q\log n)$。
期望得分 $45$。
总结
思考还要更全面,不能在一个思路上陷得太深。如果陷深了,发现错了,还要调整好心态。
- $day1T2$,发现不等式加减不能做的时候,可以去想能不能凑系数,而不是直接自闭去打暴力。
- $day2T1$,找上一个颜色为某个值的,离线就是 $O(1)$ 的,但是当时却没有想到离线,而一直就是在线回答询问。
大概就是:
- 原来的思路类似于 $dfs$,相当于往一个思路一直走下去,直到不行再往回退,退得太多了就放弃了。
- 现在要把它改成 $bfs$,考虑多种可能可行的解决方案,看哪一种可以做,不能做就换。但是不要随便放弃一个思路。
以 $day2T1$ 为例,可以先把可能的解法列出来,像这种树上的链,不带修改的问题,做法有:倍增、树剖,点分治。
- 如果往点分想,容易得到一个通过线段树维护的做法;
- 如果往倍增想,能得到一个二分的做法,当时是往倍增想了,但是稍微想了一下就放弃了这个思路;
- 如果往树剖想,能得到一个加倍增的做法。
这个 $day1T2$ 往不等式加减想实在是太傻了,但是当时就是陷进去了。看来还是要补一下数学,可以再学学文化课换换思维。
OI方面,还是先把基础的算法做扎实吧。