2021.11.14猫猫模拟赛3

前言

题解

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\) 太大那么显然可以,否则根据之前背包的结果可以求出。

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,发现连续空位段之间的顺序没有关系,复杂度就是划分数级别的。

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

上一篇:CF1605D - Treelabeling——二分图思维题


下一篇:Java操作Hive系列1-Hive UDF