Loading

abc353

a.

模拟。

b.

模拟。

c.

先求出式子 \(\sum_{i=1}^{n} \sum_{j=i+1}^{n} a[i] + a[j]\),这个很显然为 \(\sum_{i=1}^{n} (n-1)a[i]\),记为 \(ans\)。再考虑取模。发现,只有两两的和大于等于 \(10^8\) 才会对答案有影响,所以对于每一个 \(a[i]\),求有多少 \(a[j] + a[i] \ge 10^8\),减去相应贡献即可。有一些细节。

提交记录

d.

\(sz[i]\)\(a[i]\) 的位数。对于每个数 \(a[i]\),都为前面 \(i-1\) 个数贡献了 \(a[i]\),为后面的每个数贡献了 \(a[i] \times 10^{sz[j]}\)。因此答案即为 \(\sum_{i=1}^{n} (i-1)\times a[i] + \sum_{i=1}^{n} \sum_{j=i+1}^{n} a[i] \times 10^{sz[j]}\)。这个从后往前枚举可以 \(O(n)\) 求出。

提交记录

e.

遇到这种题,首先考虑把他放到trie上。对于两个字符串,他们的最长公共前缀为两个串在字典树上的共同经过的点的个数。因此对于树上的每个点,记它被经过的次数为 \(res[i]\),它对答案做出的贡献即为 \(res[i]\times(res[i] - 1)\)。最终的答案为 \(\sum_{i=1}^{cnt} res[i]\times (res[i]-1) / 2\)

提交记录

f.

鸽了,明天写

g.

\(dp[i][j]\) 表示考虑前 \(i\) 个活动,现在在城市 \(j\) 的最大利润。 \(dp[i][j] = \max_{1 \le k \le n} (dp[i-1][k]-c|j-k|+p_k)\)。答案即为 \(\max_{1 \le i \le n} dp[m][i]\)

考虑优化这个dp,发现这个绝对值可以拆开分两种情况,一种是 \(k<=j\)\(p[i][j] = \max_{1 \le k \le j} (dp[i-1][k]-cj+ck+p_k)\)。另一种是 \(k>=j\)\(p[i][j] = \max_{j \le k \le n} (dp[i-1][k]-ck + cj +p_k)\)

这两个式子,发现只有 \(i-1\) 这一层对当前有贡献,所以可以用两棵线段树,一棵维护 \(dp[i][j] - cj\),一棵维护 \(dp[i][j] + cj\),单点修改区间查询。时间复杂度 \(O(m \ logn)\)

提交记录

posted @ 2024-05-13 02:13  你说得太对辣  阅读(21)  评论(0)    收藏  举报