A、B 略。
ABC233C - Product
实际上就是一个简单 dp,但是
- 数组上范围比较大,需要用 map 维护下标以及转移点。
- 答案爆
long long
,需使用__int128
。
using i128 = __int128;
vector<map<i128, i128>> mp;
int main() {
i128 n, X; read(n, X);
mp.resize(n + 1);
mp[0][1] = 1;
FOR(i, 1, n) {
int l; read(l);
FOR(j, 1, l) {
i128 x; read(x);
for (auto p : mp[i - 1])
mp[i][p.first * x] += p.second;
}
}
print(mp[n][X]);
return output(), 0;
}
ABC233D - Count Interval
记录前缀和,开 map
查询即可。
ABC233E - Σ[k=0…10100]floor(X/10k)
看着很困难实际上观察每一位的贡献即可。进一下位就做完了。
ABC233F - Swap and Sort
简要题意:给定排列 P P P, n ≤ 1000 n\le 1000 n≤1000。同时给定 m m m 组关系 ( a i , b i ) (a_i, b_i) (ai,bi),每次可以交换 P a i P_{a_i} Pai 和 P b i P_{b_i} Pbi。构造一个最多 5 × 1 0 5 5\times 10^5 5×105 步的方案使得 P P P 为升序。
整个问题可以抽象成一张图。然后可以发现,当且仅当数字 p i p_i pi 和点 i i i 在一个连通分量内时整个问题有解,这个问题可以写一个并查集之类的东西判断一下。
然后构造方案。由于不要求最优性,所以我们可以直接考虑建出一个生成树,然后从点度为 1 1 1 的点开始逐个复位并删点。操作次数最多为 999 + 998 + ⋯ + 1 = 499500 999 + 998 + \cdots + 1 = 499500 999+998+⋯+1=499500。评测记录。
ABC233G - Strongest Takahashi
简要题意:给定一张 N × N N\times N N×N( 1 ≤ N ≤ 50 1\le N\le 50 1≤N≤50)网格,里面若干个格子有障碍。每次可以选择一个 D × D D\times D D×D 的区域然后消耗 D D D 点体力将其中的障碍消去。问将所有障碍消去的最小体力消耗。
这种高维度的 dp 一直是我的弱点。。。考虑一个 A × B A\times B A×B 的矩形区域(子问题),我们显然需要 C = max ( A , B ) C = \max(A,B) C=max(A,B) 的体力来覆盖整个矩形。然而可能存在更少的体力消耗就能覆盖。具体地,当存在一个空行/空列时,我们就可以考虑将子矩形划开,变成两个独立子问题,看一下有没有更优解。
所以设一个 f l , u , r , d f_{l,u,r,d} fl,u,r,d 来进行 dp(使用记搜转移)即可,转移复杂度似乎是 O ( n 5 ) O(n^5) O(n5) 的,评测记录。
ABC233Ex - Manhattan Christmas Tree
简要题意:给定平面内 n n n 个点, q q q 次询问到 ( a , b ) (a, b) (a,b) 第 k k k 近的点到 ( a , b ) (a, b) (a,b) 的距离,这里的距离指曼哈顿距离。 5 × 1 0 5 5\times 10^5 5×105,7s。
首先我们发现曼哈顿距离很不好处理第 k k k 近之类的问题,因为既要考虑两个维度又有绝对值。所以考虑将每个点 ( x , y ) (x, y) (x,y) 变成 ( x + y , x − y ) (x + y, x - y) (x+y,x−y),这样原图的曼哈顿距离就可以被转化为切比雪夫距离。
于是我们对于每个询问就可以二分一下第 k k k 近的距离,查询有多少个点到 ( a , b ) (a,b) (a,b) 的切比雪夫距离 ≤ d \le d ≤d,这个查询其实就是一个二维数点(查询矩形和),可以通过写一个主席树来实现。复杂度为 O ( ( n + Q ) log 2 X ) O((n + Q)\log^2X) O((n+Q)log2X), X X X 为点的值域。主席树写着有点心烦,要注意细节,评测记录。