为啥同样的思路题解 AC 我 TLE 了
查看原帖
为啥同样的思路题解 AC 我 TLE 了
574944
Micnation_AFO楼主2022/7/24 18:44

如题,我甚至闲着没事干加了 check() 函数

#include <iostream>
#include <stack>
#include <cstring>
//#pragma GCC optimize (2)

typedef long long LL;
using namespace std;
const LL N = 1e5 + 10;
const LL mod = 12345678910;

LL n;
LL a[N];
stack<LL> s;

int read() {
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') { f = (ch == '-' ? -1 : f); ch = getchar(); }
    while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
    return x * f;
}

int check(int &x, int l, int r) {
    //()() || (())
    if (r - l + 1 == 4) {
        if (a[l] == 0 && a[l + 1] == 1 && a[l + 2] == 0 && a[l + 3] == 1) return (x = 2);
        if (a[l] == 0 && a[l + 1] == 0 && a[l + 2] == 1 && a[l + 3] == 1) return (x = 2);
    }
    //()()() || ((())) || (()()) || (())()
    if (r - l + 1 == 6) {
        if (!a[l] && a[l + 1] && !a[l + 2] && a[l + 3] && !a[l + 4] && a[l + 5]) return (x = 3);
        if (!a[l] && !a[l + 1] && !a[l + 2] && a[l + 3] && a[l + 4] && a[l + 5]) return (x = 4);
        if (!a[l] && !a[l + 1] && a[l + 2] && !a[l + 3] && a[l + 4] && a[l + 5]) return (x = 4);
        if (!a[l] && !a[l + 1] && a[l + 2] && a[l + 3] && !a[l + 4] && a[l + 5]) return (x = 3);
    }
    //()()()() || (()()()) || (()())() || ()(()()) || ((())()) || (())()() || ()(())() || ()()(())
    if (r - l + 1 == 8) {
        if (!a[l] && a[l + 1] && !a[l + 2] && a[l + 3] && !a[l + 4] && a[l + 5] && !a[l + 6] && a[l + 7]) return (x = 4);
        if (!a[l] && !a[l + 1] && a[l + 2] && !a[l + 3] && a[l + 4] && !a[l + 5] && a[l + 6] && a[l + 7]) return (x = 6);
        if (!a[l] && !a[l + 1] && a[l + 2] && !a[l + 3] && a[l + 4] && a[l + 5] && !a[l + 6] && a[l + 7]) return (x = 5);
        if (!a[l] && a[l + 1] && !a[l + 2] && !a[l + 3] && a[l + 4] && !a[l + 5] && a[l + 6] && a[l + 7]) return (x = 5);
        if (!a[l] && !a[l + 1] && !a[l + 2] && a[l + 3] && a[l + 4] && !a[l + 5] && a[l + 6] && a[l + 7]) return (x = 6);
        if (!a[l] && !a[l + 1] && a[l + 2] && a[l + 3] && !a[l + 4] && a[l + 5] && !a[l + 6] && a[l + 7]) return (x = 4);
        if (!a[l] && a[l + 1] && !a[l + 2] && !a[l + 3] && a[l + 4] && a[l + 5] && !a[l + 6] && a[l + 7]) return (x = 4);
        if (!a[l] && a[l + 1] && !a[l + 2] && a[l + 3] && !a[l + 4] && !a[l + 5] && a[l + 6] && a[l + 7]) return (x = 4);
    }
    //(((((((((())))))))))
    if (r - l + 1 == 20) {
        for (int i = l; i <= l + 9; i++) 
            if (a[l] == 1) return 0;
        for (int i = l + 10; i <= r; i++)
            if (a[r] == 0) return 0;
        return 1024;
    }
    return 0;
}

LL score(LL l, LL r) {
    int x;
    if (check(x, l, r)) return x;
    if (l + 1 == r) return 1;
    while (s.size()) s.pop();
    s.push(a[l]);
    LL val = 0;
    for (LL i = l + 1; i <= r; i++) {
        if (s.size() && a[i] != s.top()) s.pop();
        else s.push(a[i]);
        if (s.empty()) {
            if (i != r) return (score(l, i) % mod + score(i + 1, r) % mod) % mod;
            else return 2 * (score(l + 1, r - 1) % mod) % mod;
        }
    }
    return -1;
}

int main() {
	//freopen("pain.in", "r", stdin);
	//freopen("pain.out", "w", stdout);
    cin >> n;
    for (LL i = 1; i <= n; i++) a[i] = read();
    cout << score(1, n) << endl;
    return 0;
}

第二个点本地开 O2 在一分钟左右/kk

2022/7/24 18:44
加载中...