1. 程式人生 > 資訊 >哪吒汽車公佈哪吒 S 內飾官圖:17.6 英寸中控屏、12.3 英寸副屏、AR-HUD

哪吒汽車公佈哪吒 S 內飾官圖:17.6 英寸中控屏、12.3 英寸副屏、AR-HUD

ARC133

A 比較 naive。F 棄了。

B - Dividing Subsequence

給定兩個 \(n\) 的排列,求最大的 \(k\),滿足能夠分別選出兩個長度為 \(k\) 的子序列,使得 \(a_i|b_i\)

直接對應連邊發現邊數是 \(O(n\log n)\) 的。

然後就是對應位置不交錯最大匹配的問題,考慮將有序對 \((i,-j)\) 排序,然後求 \(j\) 的最長上升子序列即可。

C - Row Column Sums

填充 \(n\times m\) 的表格,滿足均 \(\in [0,P)\)

且在 \(\bmod P\) 意義下,每行的和為 \(a_i\)

,每列的和為 \(b_i\),最大化全域性和。

感覺這種猜結論題做多了不是很有利於訓練,不過挺有趣的。

有解的充要條件是 \(\sum a=\sum b\)

先令所有數為 \(P-1\),然後求出每一行需要調整的量之和,每一列需要調整的量之和。

那麼最終減少的量就是兩者的 \(\max\)

構造方法考慮,如果行列均需要 \(-1\) 那就減小這個格子,然後不妨設行需要再減,這個此時減少的數一定是 \(P\) 的倍數。

那麼不難用在同一行 \(+1,-1\) 的方法將所有需要減小的數調整至同一列,這一列直接減小就完了。

D - Range XOR

\(L\leq l\leq r\leq R\)

\(l\bigoplus (l+1)\bigoplus\cdots\bigoplus r=V\)\((l,r)\) 數。

首先拆成字首和,即 \(s_r\bigoplus s_{l},(L-1\leq l<r\leq R)\)

然後打個表,發現 \(s_i\) 很有規律:

  • \(i=4k+0,s_i=i\)
  • \(i=4k+1,s_i=1\)
  • \(i=4k+2,s_i=i+1\)
  • \(i=4k+3,s_i=0\)

發現需要討論 \(16\) 種情況,實際只要討論二進位制前兩位,然後用簡潔的數位 DP 就可以得到答案。

const int P = 998244353;
int f[60][2][2][2];

void Pl(int &x, int y) {x += y; if(x >= P) x -= P;}

int main() {
	LL L, R, V;
	scanf("%lld %lld %lld", &L, &R, &V), L --;
	int ans = 0, num[4] = {0, 1, 3, 0};
	rep(a, 0, 3) rep(b, 0, 3) if((num[a] ^ num[b]) == (V & 3)) {
		memset(f, 0, sizeof(f));
		f[1][a >= (L & 3)][a < b][b <= (R & 3)] = 1;
		rep(i, 2, 59) rep(j, 0, 1) rep(k, 0, 1) rep(l, 0, 1) rep(x, 0, 1) rep(y, 0, 1)
			if(f[i - 1][j][k][l] && (((a % 2 ? 0 : x) ^ (b % 2 ? 0 : y)) == (V >> i & 1))) {
				int Lt = L >> i & 1;
				int Rt = R >> i & 1;
				Pl(f[i][x > Lt || x == Lt && j][x < y || x == y && k][y < Rt || y == Rt && l], f[i - 1][j][k][l]);
			}
		Pl(ans, f[59][1][1][1]);
	}
	printf("%d\n", ans);
	return 0;
}

E - Cyclic Medians

給定 \(n,m,V,S\),對於任意長度分別為 \(n,m\) 的序列 \(A,B\),求操作結束的結果之和。

操作為:

  • 初始滿足 \(a_i,b_i\in[0,V),x=S\)
  • 對於 \(i=0\sim n\times m-1\),令 \(x\gets \text{medium}(x, a_{(i\bmod n)+1},b_{(i\bmod m)+1})\),即變為三者的中位數。
  • 得到最終的 \(x\) 為結果。

考慮如果給了你 \(A,B\) 序列,怎麼儘量快的判定最終結果。

中位數套路的二分答案,然後變為了 \(0,1\) 問題,顯然若有 \((x,0,0)/(x,1,1)\) 的局面出現,那麼此時 \(x=0/1\)

只有不發生這種情況時,\(x\) 可以維持原數。

這對計數是很有利的,因為對於每個 \(k\in[0,V)\),求出 \(\geq k\) 的局面和就做完了。

而對於不能維持原數的情況,\(0/1\) 明顯是對稱的局面(考慮翻轉後一一對應),那麼就是 (總局面 - 不動局面) / 2。

問題變為求任意時刻沒有一對 \(a_i=b_j\) 的方案數。

簡單數論知識發現,按照 \(\bmod \gcd(n,m)\) 的等價類分類,同序列的等價類相等,不同序列不等。

\(g=\gcd(n,m)\),對於列舉的 \(k\),不動點方案數顯然是:

\[\displaystyle (k^{n/g}\times (V-k)^{m/g}+k^{m/g}\times (V-k)\times ^{n/g})^g \]

直接列舉 \(k\) 計算即可。