TLE 后四个点求卡常
查看原帖
TLE 后四个点求卡常
912738
Nine_Suns楼主2023/12/2 18:59

这是代码,复杂度应该是对的,常数太大了,求大佬卡卡常

#include <bits/stdc++.h>

using namespace std;
const int N = 5e5+5; 
int c, n, m, q, a[N], b[N], p[N][2], v[N][2], maxn[N], minn[N], tt[N]; 

bool solve (int a[], int n, int b[], int m) {
    if (a[1] <= b[1] || a[n] <= b[m]) return 0; 
    maxn[n] = n; minn[n] = n; 
    for (int i = n-1;i >= 1;i--) { 
        maxn[i] = maxn[i+1]; minn[i] = minn[i+1]; 
        if (a[i] > a[maxn[i]]) maxn[i] = i; 
        if (a[i] < a[minn[i]]) minn[i] = i; 
    } 
    int l = 1, r = 1, t = 1, z = 1; tt[m] = m; 
    for (int i = m-1;i >= 1;i--) {
        tt[i] = tt[i+1]; 
        if (b[i] < b[tt[i]]) tt[i] = i; 
    } 
    while (t <= n) {
        int g = maxn[t], gm = minn[g]; 
        for (int i = t;i <= g;i++) {
            while (r < m && a[i] > b[r+1]) r++; 
            while (l <= m && a[i] <= b[l]) l++; 
            if (l > r) return 0; 
        }
        if (r < m) return 0; 
        while (z < m && b[tt[z+1]] < a[gm]) z++; 
        if (z < l) return 0; 
        l = r = z; 
        t = gm+1; 
    } 
    return 1;
}

int main () {
//    freopen("expand.in", "r", stdin); 
//    freopen("expand.out", "w", stdout); 
	scanf("%d%d%d%d", &c, &n, &m, &q); 
	for (int i = 1;i <= n;i++) scanf("%d", &a[i]); 
	for (int i = 1;i <= m;i++) scanf("%d", &b[i]); 
	int t = 1; 
	int ans = solve(a, n, b, m)|solve(b, m, a, n); 
	printf("%d", ans); 
	while (q--) {
		int k1, k2; scanf("%d%d", &k1, &k2); 
		for (int i = 1;i <= k1;i++) {
			scanf("%d%d", &p[i][0], &v[i][0]); swap(v[i][0], a[p[i][0]]); 
		}
		for (int i = 1;i <= k2;i++) {
			scanf("%d%d", &p[i][1], &v[i][1]); swap(v[i][1], b[p[i][1]]); 
		}
		ans = solve(a, n, b, m)|solve(b, m, a, n); 
		printf("%d", ans); 
		for (int i = 1;i <= k1;i++) a[p[i][0]] = v[i][0];  
		for (int i = 1;i <= k2;i++) b[p[i][1]] = v[i][1]; 
	}
	return 0;
}
2023/12/2 18:59
加载中...