給定部分三元組 (x, y, z),另一部分由隨機函數生成。求最長鏈長度,要求嚴格偏序:a.x > b.x 且 a.y > b.y 且 a.z > b.z。
av:左半部所有點更新bv:僅 x != mid+1.x 的點更新x == mid+1.x 用 bv,否則用 avbool cmp(int a, int b) {
if (po[a].y != po[b].y) return po[a].y < po[b].y;
return a > b; // y 相等時序號大的在前,防止同 y 互相更新
}
void solve(int l, int r) {
if (l == r) { ans = max(ans, dp[l]); sz[l] = po[l].z; return; }
int mid = (l+r)>>1;
// 分治左半部
// 合併排序 y
solve(l, mid);
// 初始化 BIT
// 左半部更新 BIT (av/bv)
// 右半部查詢 BIT 更新 dp
solve(mid+1, r);
// 合併 z 有序
}
int A, B, C = ~(1<<31), M = (1<<16)-1;
int rd() {
A = 36969 * (A & M) + (A >> 16);
B = 18000 * (B & M) + (B >> 16);
return (C & ((A << 16) + B)) % 1000000;
}
O(N log²N),N ≤ 300,000 可在時限內通過。