警示后人
查看原帖
警示后人
414231
_Fatalis_楼主2023/5/25 13:12

如果你 WA 的不明所以,而且只 AC 了 sub1 1,2 和 sub2 1,那么请检查你代码中对数组的清空是否取到了 n+nn + n。

// Copyright 2023 Lotuses
#include <cstdio>
#include <cstring>
#include <vector>

#define int long long

const int maxn = 2e6 + 100;
char ch[maxn];
int a[maxn], s[maxn];
int t[4 * maxn];

signed main() {
    #ifdef LOCAL
        freopen(".in", "r", stdin);
        freopen(".out", "w", stdout);
    #endif
    
    int T;
    read(T);
    while (T--) {
        int n, ans = 0;
        read(n);
        scanf("%s", ch + 1);
        s[1] = 0;
        for (int i = 1; i <= n; i++) {
            a[i] = ch[i] == '(' ? 1 : -1;
            s[i + 1] = s[i] + a[i];
        }

        n++;
        memset(t, 0, sizeof(int) * (n + n + 100)); // plz attention
        for (int i = 1; i <= n; i++) {
            t[s[i] + n]++;
        }

        for (int i = -n, cnt = 0, s = 0; i <= n; i++) {
            for (int c = 1; c <= t[i + n]; c++, cnt++) {
                s += i;
                ans += (cnt + 1) * i - s; 
                debug(i, cnt + 1, s, ans);
            }
        }
        
        ans += n * (n - 1) / 2;
        // memset(t, 0, sizeof(t));
        for (int i = 0; i <= n + n; i++) t[i] = 0;
        for (int i = 1; i <= n; i++) {
            ans -= i - t[s[i] + n - 1] - 1;
            t[s[i] + n] = i;
        }

        // memset(t, 0, sizeof(t));
        for (int i = 0; i <= n + n; i++) t[i] = n + 1;
        for (int i = n; i >= 1; i--) {
            ans -= t[s[i] + n - 1] - i - 1;
            t[s[i] + n] = i;
        }

        
        memset(t, 0, sizeof(int) * (n + n + 100)); // plz attention
        for (int i = 1; i <= n; i++) {
            t[s[i] + n]++;
            if (s[i] > s[i + 1]) {
                ans += t[s[i] + n] * (t[s[i] + n] - 1) / 2;
                t[s[i] + n] = 0;
            }
        }

        for (int i = 1; i <= n; i++) {
            ans += t[s[i] + n] * (t[s[i] + n] - 1) / 2;
            t[s[i] + n] = 0;
        }

        writeln(ans);
    }
    return 0;
}

2023/5/25 13:12
加载中...