为啥最后一个大样例样例本地没有输出,交上去AC
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt")
#include <bits/stdc++.h>
using namespace std;
#define _f(i, a, b) for (int i = a; i <= b; ++i)
#define _d(i, a, b) for (int i = a; i >= b; --i)
using pii = pair<int, int>;
using ll = long long;
#define fi first
#define se second
static constexpr int N = 5e5 + 5;
bool dp[2005][2005];
int c;
bool solve2(int a[], int b[], int n, int m) {
if(a[1] <= b[1] || a[n] <= b[m]) return 0;
_f(i, 1, n) _f(j, 1, m) dp[i][j] = 0;
dp[1][1] = 1;
_f(i, 1, n) _f(j, 1, m) if(a[i] > b[j]) dp[i][j] |= (dp[i][j - 1] | dp[i - 1][j] | dp[i - 1][j - 1]);
return dp[n][m];
}
namespace mian {
struct node { int prevmn, prevmx, premin, premax, sufmin, sufmax, sufvmn, sufvmx; } p[N], q[N];
bool check1(int s, int t, int n, int m) {
if(s == 1 || t == 1) return 1;
if(p[s - 1].prevmn < q[t - 1].prevmn) return check1(p[s - 1].premin, t, n, m);
if(p[s - 1].prevmx < q[t - 1].prevmx) return check1(s, q[t - 1].premax, n, m);
return 0;
}
bool check2(int x, int y, int n, int m) {
if (x == n || y == m) return 1;
if (p[x + 1].sufvmn < q[y + 1].sufvmn) return check2(p[x + 1].sufmin, y, n, m);
if (q[y + 1].sufvmx > p[x + 1].sufvmx) return check2(x, q[y + 1].sufmax, n, m);
return 0;
}
bool solve(int a[], int b[], int n, int m) {
if(a[1] >= b[1]) return 0;
p[1].premin = p[1].premax = 1, p[1].prevmn = p[1].prevmx = a[1];
q[1].premin = q[1].premax = 1, q[1].prevmn = q[1].prevmx = b[1];
p[n].sufmin = p[n].sufmax = n, p[n].sufvmn = p[n].sufvmx = a[n];
q[m].sufmin = q[m].sufmax = m, q[m].sufvmn = q[m].sufvmx = b[m];
_f(i, 2, n) {
if(a[i] < p[i - 1].prevmn) p[i].prevmn = a[i], p[i].premin = i;
else p[i].prevmn = p[i - 1].prevmn, p[i].premin = p[i - 1].premin;
if(a[i] > p[i - 1].prevmx) p[i].prevmx = a[i], p[i].premax = i;
else p[i].prevmx = p[i - 1].prevmx, p[i].premax = p[i - 1].premax;
}
_f(i, 2, m) {
if(b[i] < q[i - 1].prevmn) q[i].prevmn = b[i], q[i].premin = i;
else q[i].prevmn = q[i - 1].prevmn, q[i].premin = q[i - 1].premin;
if(b[i] > q[i - 1].prevmx) q[i].prevmx = b[i], q[i].premax = i;
else q[i].prevmx = q[i - 1].prevmx, q[i].premax = q[i - 1].premax;
}
if(8 <= c && c <= 14) return check1(p[n].premin, q[m].premax, n, m);
_d(i, n - 1, 1) {
if(a[i] < p[i + 1].sufvmn) p[i].sufvmn = a[i], p[i].sufmin = i;
else p[i].sufvmn = p[i + 1].sufvmn, p[i].sufmin = p[i + 1].sufmin;
if(a[i] > p[i + 1].sufvmx) p[i].sufvmx = a[i], p[i].sufmax = i;
else p[i].sufvmx = p[i + 1].sufvmx, p[i].sufmax = p[i + 1].sufmax;
}
_d(i, m - 1, 1) {
if(b[i] < q[i + 1].sufvmn) q[i].sufvmn = b[i], q[i].sufmin = i;
else q[i].sufvmn = q[i + 1].sufvmn, q[i].sufmin = q[i + 1].sufmin;
if(b[i] > q[i + 1].sufvmx) q[i].sufvmx = b[i], q[i].sufmax = i;
else q[i].sufvmx = q[i + 1].sufvmx, q[i].sufmax = q[i + 1].sufmax;
}
if(p[n].prevmn >= q[m].prevmn || p[n].prevmx >= q[m].prevmx) return 0;
return check1(p[n].premin, q[m].premax, n, m) && check2(p[n].premin, q[m].premax, n, m);
}
} ;
int n, m, qq, x[N], y[N], xx[N], yy[N];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
#ifndef ONLINE_JUDGE
freopen("1.txt", "r", stdin);
freopen("2.txt", "w", stdout);
#endif
auto sol = [](int a[], int b[]) {
if(n >= 2000 or m >= 2000)
return mian::solve(a, b, n, m) || mian::solve(b, a, m, n);
return solve2(a, b, n, m) || solve2(b, a, m, n);
} ;
cin >> c >> n >> m >> qq;
_f(i, 1, n) cin >> x[i];
_f(i, 1, m) cin >> y[i];
cout << sol(x, y);
while(qq--) {
_f(i, 1, n) xx[i] = x[i];
_f(i, 1, m) yy[i] = y[i];
int kx, ky, px, vx; cin >> kx >> ky;
while(kx--) cin >> px >> vx, xx[px] = vx;
while(ky--) cin >> px >> vx, yy[px] = vx;
cout << sol(xx, yy);
}
return 0;
}
// by zzzcr.