2021.11.14猫猫模拟赛3
前言
今天模拟的时候头脑比前几天都清醒,不过题也更难了,所以没占到什么便宜。
昨天写总结也说是坐牢,现在看来今天才是真坐牢。
同样没有机会使用对拍。
开局遍历,\(T1\) 暴力只有 \(20\),\(T2\) 一错全错不可做,\(T3\) 暴力有 \(?\),\(T4\) 暴力很难写,但是估计有 \(20\)。
把大量时间花在 \(T1\) 了,先写了个很好写的暴力背包(现在事后想起来忘记滚动了),然后想起了昨天的经验,把表打了出来,发现规律性很强,答案大致分段而且相邻的两个数答案不同,且差值取值只有 \(1,2,3\)。然而之后就没有进展了。
\(T3\) 暴力 DFS 非常简单,但是貌似只有 \(10pts\),于是 check
函数里按照单调队列写,降低了一个 \(n\) 的复杂度。同时发现答案单调不增而且分段的性质,能想到是 DP 但是不会设计。根据这个性质剪枝了一个 \(n\) 的复杂度。至此,感觉可以过 \(20-30pts\) 了(好开心呢)。
由于 \(T4\) 暴力难写就没写,剩下 \(1h\) 左右去研究 \(T1,T3\) 优化,未果。
总结
整场时间分配问题不是很大,因为没有很多好拿的分,所以时间比较充裕。虽然花费了很长时间想题也没做出来,但也是合理的规划,因为之前就先把暴力打了。
就是没什么思路有点难受,感觉浑身解数使不出来。
题解
senpai
枚举前缀长度 \(s\),满足条件当且仅当 \((\sum_{i=1}^si^2-n)/2\) 可以表示为不大于 \(s^2\) 的平方数之和。
归纳可以得出 \(\forall n\ge 13\),\([129,129+n^2)\) 可以写成不大于 \(n^2\) 的平方数之和。
所以对 \(s\le 12\) 的部分暴力跑背包,\(s>12\) 的时候,若 \((\sum_{i=1}^si^2-n)/2\) 太大那么显然可以,否则根据之前背包的结果可以求出。
貌似还需要用到平方和公式:\(\sum ^{n} _{i = 1} i ^ 2 = \frac{n(n + 1)(2n + 1)}{6}\)
hamil
容易发现最优解路径的点数是 \(n\),构造就用双向链表维护,记录颜色交替的顶点 \(p\),若当前要插入顶点 \(i\) 则看一看 \((p,i)\) 的颜色与 \((pre_p,p)\) 的颜色是否相同,如果相同就断掉 \((p,nxt_p)\),连接 \((p,i),(i,nxt_i)\),否则断掉 \((pre_p,p)\),连接 \((pre_p,i),(i,p)\),并更新顶点 \(p\) 的位置。注意特判整条链的颜色相同的情况(此时只能往链的一头加点)。
时间复杂度 \(O(n^2)\)。
perm
显然 \(f\) 不升,\(f_1=n\),\(f_n=1\),否则无解。
考虑从小到大放数,设现在要放 \(p(<n)\),\(f_k>p\),\(f_{k+1}\le p\)(这样的 \(k\) 必定存在),则放了 \(p\) 之后连续空位长度最大值是 \(k\)。这显然也是充分条件。
对这个条件 dp,发现连续空位段之间的顺序没有关系,复杂度就是划分数级别的。
(条件发现的差不多了,然而还是写不出 DP)
sum
容易发现 \(g\) 会有一堆一大段相同,所以转置一下,考虑求 \(c(x)\) 表示使所有子段和 \(\le x\) 的最小操作次数。
设 \(p_i\) 表示对 \(1,2,\cdots,i\) 的操作次数之和,则 \(p_i\ge p_{i-1}\),\(p_j-p_i\ge\sum_{k=i+1}^ja_i-x\pod{i<j}\),要让 \(p_n\) 尽量小。
这是一个差分约束形式,最暴力的方法就是造一个有向图跑最长路:
- \(i\rightarrow j\) 连权值为 \(\sum_{k=i}^{j-1}a_k-x\) 的边(\(1\le i<j\le n+1\))
- \(i\rightarrow i+1\) 连权值为 \(0\) 的边(\(1\le i\le n\))
然后就可以看出来 \(c(x)=\max_k(t_k-xk)\),其中 \(t_k\) 表示 \(k\) 个互不相交的段的和最大值,这个是经典问题。
随着 \(x\) 减少取到最大值的 \(k\) 也是增加的,所以拿这一堆直线切出的就是一个凸包。
最后求答案的时候把询问离线下来,分界点就是 \(t_{k+1}-t_k\),左开右闭的每一段是一堆线段形成等差数列的形式,最后剩下的散块要特判。
时间复杂度 \(O((n+q)\log n)\)。