2.19 2.20 比赛补题

2.19 ~ 2.20

所有我觉得 Subtask 的思考过程很有意义的题目会写一下每个 Subtask 怎么拿,按照难度排序。后面的分数默认综合所有前面已经提及的 Subtask 的分数。

2.19 联考

A

首先,我们考虑题面中的提示,我们可以将 \(f(n,x,k)\) 设为将 \(1,2,3,\cdots,n\) 的序列拆成 \(k\) 个部分,最长的一部分是 \(x\) 的方案数。

然后,我们拆成 \(k\) 个部分后,将这 \(k\) 个部分重排可以得到最后美丽值为 \(x\) 的排列。但是,在题面中的例子 \(1234,56,7,89\) 内,我们发现如果重拍后是 \(89,7,1234,56\) 则最长的一段不再是我们分段的 \(1234\),而是两部分拼接起来的 \(123456\)

这个子问题可以转化为,求 \(1\sim k\) 的排列个数,使得不存在任意 \(p_{i+1}=p_i+1\)

\(L_i\) 表示 \(k=i\) 时的答案,则考虑 \(L_i\) 的转移情况。

在放 \(i\) 的时候,有两种合法方法

  • 先考虑一个合法 \(i-1\) 的排列,然后将 \(i\) 放在任意一个不在 \(i-1\) 以后的位置上。不考虑约束,\(i\)\(i-1+1=i\) 种方法,考虑约束,贡献为 \((i-1)\times L_{i-1}\)

  • 考虑一个不合法 \(i-1\) 的排列,且只有一组不合法的相邻元素,将 \(i\) 放在这两个不合法的相邻元素之间即可。“只有一组不合法相邻元素”等价于

    • 删去其中一个不合法元素后,是合法序列,有 \(i-2\) 种删法 和 \(h_{i-2}\) 种排列

    • 将删去的不合法元素放在唯一一个可以致使排列不合法的位置上,只有一个位置。

    • \(\leftrightarrow (i-2)\times L_{i-2}\) 种排列

    • 然后考虑 \(i\) 只有一种放法

答案为 \(L_i=(i-1)\times L_{i-1} + (i-2) \times L_{i-2}\)

然后 \(n\le 51\) 就是好做题了。考虑一个 \(dp\)\(f_{now,k,l,t}\) 表示把 \(now\) 分成 \(k\) 份,使得最长的一段的长度是 \(l\) 的方案数,目前的这一段的长度是 \(t\)

可以用记忆化搜索来维护,若 \(now=n+1\),则贡献为 \(L_k\times l\)。其余情况通过枚举 \(now\) 是跟着前面这一段还是另起一段即可。答案为 \(f_{2,1,1,1}\)

时间复杂度 \(O(n^4)\),可以轻松通过 \(n \le 51\) 的数据,用递推维护不难做到 \(O(n^3)\),但是没给这个分,所以没写。

ll dfs(ll n,ll k,ll t,ll l){
	if(f[n][k][t][l]) return f[n][k][t][l];
	if(n==orin+1) return (a[k]*l)%mod; 	
	ll ans=(dfs(n+1,k+1,1,l)+dfs(n+1,k,t+1,max(t+1,l)))%mod;
	return f[n][k][t][l]=ans;
}

考虑优化计算将 \(n\) 拆成 \(k\) 个部分,最长的一段为 \(x\) 的这一部分问题。

这个问题可以理解为,\(h(n,x,k)\) 表示在 \(1\sim x\) 中找 \(k\) 个数(可重复),和为 \(n\),原来的问题 \(g(n,x,k)\) 可以表示为 \(h(n,x,k)-h(n,x-1,k)\)

容易发现,\(h(n,x,k)=\sum^k_{i=0} (-1)^i\binom{n-ix-1}{i-1}\binom{i}{x}\)

显然 \(ix \le n\)。这个东西就变成了 \(O(n^2\log n)\) 原因是调和级数。

for (ll i=1;i<=n;i++)
    for (ll j=1;j<=n;j++)
        for (ll k=0;k<=i;++k){
            if (k*j>=n)break;
            if(k%2==0) add(dp[i][j],C[i][k]*C[n-k*j-1][i-1]%mod);
            else add(dp[i][j],mod-(C[i][k]*C[n-k*j-1][i-1]%mod));
        }

B

Subtask 1 (20pts)

反转两次无意义。所以这是一个 01 序列可以枚举的。

枚举以后暴力反转然后比较字典序即可。时间复杂度 \(O(2^n\times n)\)\(O(2^n\times n^2)\)

Subtask 4 (40pts)

打表发现,所有前缀最小值放在最前面,其他的按原来次序放就行。

Subtask 2 (60pts)

我们考虑对于前 \(i\) 个数,最小的字典序是什么。

考虑对于现在欲反转的 \(i\),我们可以独自反转他,也可以同时反转他和 \(j\)(满足 \(j\le i\))。反转三个手玩一下发现没意义。

例如 $ 1 4 3 5 2$ 反转 \(2,3,5\) 号位置,

$ 4 1 3 5 2 \ 3 1 4 5 2 \ 2 5 4 1 3$

可以拆成两次 反转两个 的操作。

所以前 \(j\) 个的最小值有以下两种可能,对于任意一个可以反转的 \(i\)

  • \(1\sim i\) 的最优序列+\([i+1,j]\) 按序排列

  • \([i+1,j]\) 降序排列+\(1\sim i\) 的最优排列

每次判断最优反转即可。

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

Subtask 3 5 (100pts)

由于我钦定出题人难以在卡掉 \(O(n\log^2n)\) 的情况下放过 \(O(n\log n)\),而且题解对 Subtask 5 讲解过少。所以我只写一下 Subtask 3,反正也过的了 Subtask 5。

考虑字典序的本质:两个字符串不相同的第一位的大小。所以本质上可以理解为 \(a[lcp(a,b)+1]\)\(b[lcp(a,b)+1]\) 比大小。

\(lcp(a,b)\) 用二分+哈希求是典。

我们维护每一个 \(i\)\(1\sim i\) 的最优序列的前缀哈希序列(用来求 lcp),然后维护正哈希和反哈希,取较优值即可。

C

Tc 1~8

考虑直觉。如果现在有几种宝石可以选,可能选右端点最近的那个。这就好比几个任务现在摆在你面前,肯定先选 ddl 最接近的。时间复杂度 \(O(nm\log m)\)

Tc 9~20

flow 题喵。神仙题喵。

2.20 联考

A

Subtask 1(12pts)

很不好写的dfs枚举。

Subtask 2(36pts)

\(g_i\) 表示从 \(S\) 开始 \(i\) 步之内的最大值。

\(h_i\) 表示从 \(T\) 开始 \(i\) 步之内的最大值。

画出来可以理解为两条折线。我们的目标是 \(h_i\) 始终与 \(g_i\) 重合或在其上方。

我们考虑两个操作分别说明什么

  • 花费 \(A\) 的代价,使得一条折线平着的一段上升 \(1\)
  • 花费 \(B\) 的代价,使得 \(h_i \to h_{i+1}\)

这个东西你可以枚举现在不满足条件的这一段到底变到跟谁一样高就可以达成目的。

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

Subtask 3(48pts)

瞎贪就是对的。

Subtask 4(60pts)

考虑前面那个东西感觉 \(A\)\(B\) 看起来神秘。现在没有 \(A\) 了,就好做很多。

倒着 \(dp\)。设 \(dp_i\) 表示满足 \(dis_x>i\) 的所有约束的最小代价。

如果这一段折线在下,就花 \(B\) 的代价连一条边去 \(h_{i+1}\)

这个东西很好写。

Subtask 5 6(100pts)

考虑 \(A\) 操作。我们如果对于 \(i\),想让 \(h_i \to g_j\) 当且仅当 \(dp_{j+1}+(g_j-h_i)\times A)\) 最小。但是 \(h_i \times A\)\(dp_i\) 而言是固定的,所以维护 \(dp_{j+1}+g_j\times A\) 的后缀最小值。

时间复杂度是 \(O(m\log m+n)\),瓶颈是最短路。

B

下文 \(m\)\(\max b_i\)\(cnt_i\) 表示 \(i\)\(b\) 中的出现次数。

Subtask 1(12pts)

暴力。

Subtask 3(29pts)

首先,我们可以打表发现直接排序是最优的。

进一步发现,每个数自己组成一个子区间也是最优的,这里产生了 \(m!\) 种方案。 \(cnt_x=2\) 的情况除了以下的混合方法,还可以当作括号用,但是这里不存在 \(cnt_x=2\),易维护。

同时,如果有以下两种情况,则是可以混合的。

  • \(cnt_x=cnt_y\),可以 \(xyxyxyxy\) 这样混合。
  • \(cnt_x=cnt_y+1\),可以 \(xyxyxyxyx\) 这样混合。

然后枚举 \(m^2\) 种混合方案是否可行,容易 \(dp\)

Subtask 2(52pts)

变相说明 \(n\le 160\),感觉有区间 \(dp\)\(O(n^4)\) 做法。

Subtask 4,5,6(100pts)

对于 \(xyx\) 这样的段,不可以套括号。

对于 \(xxx\)\(xyxy\),可以套。

\(dp_{A,B}\) 表示有 \(A\) 个不可套段,\(B\) 个可套段的方案数。需要枚举长度剩下几个、\(cnt_x=2\) 的数剩下几个,复杂度较大,为 \(O(n^5)\)

对于 \(cnt_a=2\) 的数,考虑作为左右括号套可套段,或者作为左右括号套空气即可。

C

设数据组数为 \(t\)

Subtask 1(5pts)

\(G'\) 实际建出来即可,然后给每一个点一个编号即可。

时间复杂度 \(O(t(k+T)n^{2k})\)

Subtask 2(15pts)

问题转化为,有多少 \(k\) 维向量 \(Q\) 满足其与 \(T\) 任意一个向量 \(T_i\) 恰好有 \(\forall 1\le j\le k\quad (Q_j,T_{i,j}) \in E\)

如果 \(k=2\),可以枚举每一位是否满足 \((Q_j,T_{i,j})\in E\)

但是如果直接把整个 \(k\) 维向量塞进 set 里,常数过大。
因而可以哈希一下再塞。

时间复杂度 \(O(t(n+m+T(k+n^k\log m))\)。貌似比较卡常。

Subtask 3,4(45pts)

类似的枚举做法,但是不能枚举某一位实际的数值。而是枚举 bool 量,\((Q_j,T_{i,j})\) 是否 \(\in E\),最后乘法原理计算。

没写。时间复杂度 \(O(t(n+m+T(k+n2^k\log m))\)

Subtask 5,6,7,8(100pts)

不会,看起来好神仙qwq

Div 4

G

考虑唯一的变量是 don't care,如果没有这个这道题纯模拟就行。

考虑我们可以把 C 当作 P 或 S 的任意一个。

所以我们设 \(f_{u,P/1}\) 表示把 \(s_u\) 当作 P/S,在 \(u\) 子树内的最小代价。

如果 \(s_u=P\),则 \(f_{u,1}\) 会被定义为 \(\inf\)

反之同理。

对于 \(f_{u,1}\),他显然等于 \(\sum_{v\in son_u} \min(f_{v,0}+1,f_{v,1})\)

对于 \(f_{u,0}\),显然等于 \(\sum_{v\in son_u} \min(f_{v,1}+1,f_{v,0})\)

然后处理一下 \(\inf\) 的情况即可。

答案是 \(\min(f_{1,0},f_{1,1})\)

posted @ 2024-02-29 15:01  wtcqwq  阅读(9)  评论(0)    收藏  举报