D
题目大意
给定一个序列\(A = (A_0,\cdot,A_{N - 1})\),判断是否能找到一个四元组\((x,y,z,w)\)满足:
- \(0 \le x < y < z < w \le N\)
- \(\sum_{i = x} ^ {y - 1} A_i = P\)
- \(\sum_{i = y} ^ {z - 1} A_i = Q\)
- \(\sum_{i = z} ^ {w - 1} A_i = R\)
\(3 \le N \le 2 \times 10^5,1 \le A_i \le 10^9,1 \le P,Q,R \le 10^15\)
Solution
对于每个\(i\),设\(ps_i,qs_i,rs_i\)为以\(i\)为左端点的连续数列和分别为\(P,Q,R\)的右端点位置(没有设为inf),这个可以用双指针完成(或者二分),然后枚举每个\(i\),设\(x = i\),先跳到\(x \leftarrow ps_x + 1\),再跳到\(x \leftarrow qs_x + 1\),最后跳到\(x \leftarrow rs_x\),每一步判断是否合法。
时间复杂度\(O(n)\)或\(O(n \log{n})\),取决于求解\(ps_i,qs_i,rs_i\)的方式。
E
题目大意
一个人起点在\((0,0)\),给定\(N,M,A,B,C,D,E,F\),他可以走\(N\)步,每一步可以这样走:
- \((x,y) \rightarrow (x + A,y + B)\)
- \((x,y) \rightarrow (x + C,y + D)\)
- \((x,y) \rightarrow (x + E,y + F)\)
有\(M\)个障碍物\((x_1,y_1),\cdots,(x_M,y_M)\)是走的时候不能经过的,求走\(N\)步的合法的不同路径数量,对\(998244353\)取模。
\(1 \le N \le 300,0 \le M \le 10^5,-10^9 \le A,B,C,D,E,F ,X_i,Y_i \le 10^9\)
Solution
设\(dp_{i,j,k}\)为走了\(i\)次1操作,\(j\)次2操作,\(k\)次3操作的合法路径数量。那么当前位置为\((x = Ai+Cj+Ek,y = Bi + Dj + Fk)\),如果当前位置为障碍物,\(dp{i,j,k} = 0\),否则
\(dp_{i,j,k} = dp_{i - 1,j,k}\cdot [i \ge 1] + dp_{i,j - 1,k}\cdot[j \ge 1] + dp_{i,j,k - 1} \cdot [k \ge 1]\)
复杂度\(O(n^3\log{m})\),其中\(\log{m}\)是用map判断是否是障碍物。
F
题目大意
给两个长度为\(n\)的数对\(x = (x_1,\cdots,x_n),y = (y_1,\cdots,y_n)\),定义:
\[d(x,y) = \sum_{i = 1} ^ n |x_i - y_i| \]给定两个长度为\(n\)的数列\(p = (p_1,\cdots,p_n),q = (q_1,\cdots,q_n)\),求出满足\(d(p,r) \le D,d(q,r) \le D\)(\(D\)给定)的序列\(r\)的个数,对\(998244353\)取模。
Solution
设\(dp_i,j,k\)为在前\(i\)位中\(\sum_{l = 1} ^ i |r_i - p_i| = j, \sum_{l = 1} ^ i |r_i - q_i| = k\)的合法数量。
转移:枚举\(x \in [-2D,2D]\),计算\(d1 = |x - p_i|,d2 = |x - q_i|\),\(dp_{i,j,k} = \sum_x dp_{i - 1,j - d1,k - d2}\cdot [j \ge d1,k \ge d2]\)
答案就是\(\sum_{i = 0} ^ D \sum_{j = 0} ^ D dp_{n,i,j}\)
复杂度\(O(nD^3)\),过不去
设\(l = \min \{p_i,q_i\},r = \max\{p_i,q_i\},s = r - l\),分不同情况考虑:
- \(l \le x \le r\) :有\(d1 + d2 = r - l \to dp_{i,j,k} = \sum_{j' + k' = j + k - s}dp_{i - 1,j',k'}\)
- \(x < l\) 或 \(x > r\):有\(d1 + d2 = r - x\)或\(d1 + d2 = x - l \to dp_{i,j,k} = \sum_{j' - k' = i - j + s 或j' - k' = i - j - s} dp_{i - 1,j',k'}\)
这样转移就\(O(1)\)了,总复杂度\(O(nD^2)\),空间上\(i\)一维滚掉,可以过。