ARC104

ARC104

高中后做的第一场 ARC。以后可能考虑多做 ARC。

A

不写。

B

不写。

C(DP、分段问题)

看来要复健了,这种题做 \(50\min\),开始还没注意到数据范围。

思路

发现最终答案构成若干个区间,区间内部为相交且相等的区间 \([A_i,B_i]\),交界处没有区间跨过。

这显然是一个分段问题。定义 \(f_i\) 表示 \(i\) 之前是否有解。容易 \(O(n)\) 枚举 \(O(n)\) check。

时间复杂度:\(O(n^3)\)。空间复杂度 \(O(n)\)

总结

涉及技巧:分段问题。

分段可以说是经典问题,思考的时候先从基本的结构入手思考。

记得数组开两倍。

D(DP、平均值转化)

刚开始看错题,然后一直不会/kk

标签:DP,平均值转化。

思路

只会一个 naive 的 \(O(n^4k^2)\) 做法。后来想 \(O(n^3k)\) 的时间里归约到一个类似分拆数的问题,但是发现分拆数做不了上界,寄。

正解

考虑做一些转化。平均数和子集和有关系:\(x=\sum_{i=1}^k S_i/k\)。稍稍变形可以变成 \(\sum_{i=1}^k (S_i-x)=0\)。原问题等价于在 \([1-x,n-x]\) 区间里面选数使得和为 \(0\)

考虑继续转化,将 \([1-x,0)\)\((0,n-x]\) 分类,发现这又相当于在 \((0,x-1]\)\((0,n-x]\) 中选数使得它们的和相等。发现我们已经去除了集合大小的问题,前缀和优化 DP 然后对于每个 \(x\) 枚举和即可。

时间复杂度 \(O(n^3k)\)。空间复杂度 \(O(n^3k)\)

总结

涉及技巧:对于平均数/除法的常见转化。

上面对平均数的转化是常见技巧,它的效果是去除了集合大小对平均数的影响。

E(概率、 暴力)

见过类似的套路搞搞就出来了。

标签:概率,双射,暴力。

思路

显然问题可以通过枚举大小关系在 \(O(n!)\) 的时间里面归约到求单个大小关系的概率的问题。考虑一些特殊情况:如果 \(A_i\) 全部相等,令 \(t=A_i\),构造出的大小关系为数列 \(B\)。那么只需要做两步:

  • 计数满足条件 \(i\neq j,B_i=B_j\leftrightarrow X_i=X_j\)\(X\) 的个数。
  • 假设不同元素个数为 \(c\),把上面的个数除去 \(c!\)。这是因为显然我们可以通过不断进行交换操作 \((x,y),\forall i,X_i=x,X_i\gets y.\forall i,X_i=y,X_i\gets x\)。来建立数列之间的双射。

对于一般的情况,容易想到把 \(A_i\) 离散后分成不同的段,枚举每个 \(X_i\) 所在段数的情况就可以归约到上面的问题。

时间复杂度 \(O(n^{n+2}n!)\),可能跑不满。

总结

涉及技巧:数列之间大小关系的问题构建双射,大小关系分段,概率。

这题最核心的部分在于把 \(A_i\) 划分成段的操作。实际做题可以构造出一些平凡的问题然后尝试归约。

upd:其实乘个组合数就好了,我 naive/kk

F(DP、计数、图论建模)

思路

开始想考虑模拟入栈出栈的过程,然后发现 DP 不太好做,因为很多地方有后效性。

后来试图找到 \(p_i\) 的等价形式,没有找出来。

不过发现因为是栈,所以点入栈出栈呈现相互包含的区间。试图使用区间 DP,每次在后面区间留一些 \(-1\) 的点等前面区间出来再填。然后写不动,感觉是错的。

正解

其实把上面建个树就好了。

考虑把 \(i\)\(p_i\) 连边,最后得到一个森林,我们只需要计数森林即可,如果加一个 \(0\) 点就是计数树。和上面一样,发现一个子树是一个区间,然后枚举端点把两个区间合并成一个森林,需要注意森林中的点要保证根结点从前往后是不降的。还有一个转移是把森林加一个根变成一棵树,这个只需要 \((i,j)\to (i-1,j)\) 即可。

另外 DP 需要记录根节点大小,但是一个显著的问题是不同大小的根节点可能存储的是同一棵树。这个只需要钦定根是子树最大值 \(+1\) 即可。

时间复杂度 \(O(n^4)\)

总结

这个 \(p_i=\max_{h_j>h_i} j\) 建树的套路似乎比较常见,对图论建模还是不熟,需要多练习。

posted @ 2022-07-15 22:12  yllcm  阅读(55)  评论(0)    收藏  举报