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)\)

posted @ 2021-11-14 13:41  conprour  阅读(45)  评论(0编辑  收藏  举报