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

浙公网安备 33010602011771号