65pts 求调喵。

P9870 [NOIP2023] 双序列拓展

@[LuoTianyi_Official](/user/424089) 这个马蜂……
by OIerGuo @ 2024-01-03 14:11:59


@[OIerGuo](/user/1015780) 好好好提供一个马蜂正常的版本 ``` #include <iostream> #define int long long using namespace std; int a[1000005], b[1000005], pminna[1000005], pmaxxa[1000005], sminna[1000005], smaxxa[1000005], pminnb[1000005], pmaxxb[1000005], sminnb[1000005], smaxxb[1000005], aa[1000005], bb[1000005], n, m; bool upper_left(int x, int y) { if (x == 1 || y == 1) return true; if ((a[1] - b[1]) * (a[pminna[x-1]] - b[pminnb[y-1]]) > 0) return upper_left(a[1] < b[1] ? pminna[x-1] : x, a[1] < b[1] ? y : pminnb[y-1]); if ((a[1] - b[1]) * (a[pmaxxa[x-1]] - b[pmaxxb[y-1]]) > 0) return upper_left(a[1] < b[1] ? x : pmaxxa[x-1], a[1] < b[1] ? pmaxxb[y-1] : y); return false; } bool lower_right(int x, int y) { if (x == n || y == m) return true; if ((a[1] - b[1]) * (a[sminna[x+1]] - b[sminnb[y+1]]) > 0) return lower_right(a[1] < b[1] ? sminna[x+1] : x, a[1] < b[1] ? y : sminnb[y+1]); if ((a[1] - b[1]) * (a[smaxxa[x+1]] - b[smaxxb[y+1]]) > 0) return lower_right(a[1] < b[1] ? x : smaxxa[x+1], a[1] < b[1] ? smaxxb[y+1] : y); return false; } signed main() { int c, q; cin >> c >> n >> m >> q; for (int i=1; i<=n; i++) cin >> a[i]; for (int i=1; i<=m; i++) cin >> b[i]; a[0] = b[0] = 0x3fffffff; for (int i=1; i<=n; i++) pminna[i] = a[i] < a[pminna[i-1]] ? i : pminna[i-1]; for (int i=n; i>=1; i--) sminna[i] = a[i] < a[sminna[i+1]] ? i : sminna[i+1]; for (int i=1; i<=m; i++) pminnb[i] = b[i] < b[pminnb[i-1]] ? i : pminnb[i-1]; for (int i=m; i>=1; i--) sminnb[i] = b[i] < b[sminnb[i+1]] ? i : sminnb[i+1]; a[0] = b[0] = 0; for (int i=1; i<=n; i++) pmaxxa[i] = a[i] > a[pmaxxa[i-1]] ? i : pmaxxa[i-1]; for (int i=n; i>=1; i--) smaxxa[i] = a[i] > a[smaxxa[i+1]] ? i : smaxxa[i+1]; for (int i=1; i<=m; i++) pmaxxb[i] = b[i] > b[pmaxxb[i-1]] ? i : pmaxxb[i-1]; for (int i=m; i>=1; i--) smaxxb[i] = b[i] > b[smaxxb[i+1]] ? i : smaxxb[i+1]; cout << ((a[1] - b[1]) * (a[n] - b[m]) > 0 && (a[1] - b[1]) * (a[pminna[n]] - b[pminnb[m]]) > 0 && (a[1] - b[1]) * (a[pmaxxa[n]] - b[pmaxxb[m]]) > 0 && upper_left(pminna[n], pminnb[m]) && lower_right(pminna[n], pminnb[m])); while (q--) { int kx, ky, px, vx; cin >> kx >> ky; for (int i=1; i<=n; i++) aa[i] = a[i]; for (int i=1; i<=n; i++) bb[i] = b[i]; while (kx--) cin >> px >> vx, a[px] = vx; while (ky--) cin >> px >> vx, b[px] = vx; a[0] = b[0] = 0x3fffffff; for (int i=1; i<=n; i++) pminna[i] = a[i] < a[pminna[i-1]] ? i : pminna[i-1]; for (int i=n; i>=1; i--) sminna[i] = a[i] < a[sminna[i+1]] ? i : sminna[i+1]; for (int i=1; i<=m; i++) pminnb[i] = b[i] < b[pminnb[i-1]] ? i : pminnb[i-1]; for (int i=m; i>=1; i--) sminnb[i] = b[i] < b[sminnb[i+1]] ? i : sminnb[i+1]; a[0] = b[0] = 0; for (int i=1; i<=n; i++) pmaxxa[i] = a[i] > a[pmaxxa[i-1]] ? i : pmaxxa[i-1]; for (int i=n; i>=1; i--) smaxxa[i] = a[i] > a[smaxxa[i+1]] ? i : smaxxa[i+1]; for (int i=1; i<=m; i++) pmaxxb[i] = b[i] > b[pmaxxb[i-1]] ? i : pmaxxb[i-1]; for (int i=m; i>=1; i--) smaxxb[i] = b[i] > b[smaxxb[i+1]] ? i : smaxxb[i+1]; cout << ((a[1] - b[1]) * (a[n] - b[m]) > 0 && (a[1] - b[1]) * (a[pminna[n]] - b[pminnb[m]]) > 0 && (a[1] - b[1]) * (a[pmaxxa[n]] - b[pmaxxb[m]]) > 0 && upper_left(a[1] < b[1] ? pminna[n] : pmaxxa[n], a[1] < b[1] ? pmaxxb[m] : pminnb[m]) && lower_right(a[1] < b[1] ? pminna[n] : pmaxxa[n], a[1] < b[1] ? pmaxxb[m] : pminnb[m])); for (int i=1; i<=n; i++) a[i] = aa[i]; for (int i=1; i<=n; i++) b[i] = bb[i]; } } ```
by LuoTianyi_Official @ 2024-01-03 14:12:56


犯了一些弱智错误 复制数组的时候 `b` 的数组长度也写成 `n` 了 此贴结。
by LuoTianyi_Official @ 2024-01-03 18:16:39


|