TLE 55pts 求调:ST 表,快读快写
查看原帖
TLE 55pts 求调:ST 表,快读快写
714254
tder楼主2024/1/20 23:14
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int Maxsz = 1e6 + 5, N = 1e6 + 5;
inline int read() {
    int r = 0, f = 1;
    char c = getchar();
    while(c != '-' && (c < '0' || c > '9')) c = getchar();
    if(c == '-') {
        f = -1;
        c = getchar();
    }
    while(c >= '0' && c <= '9') {
        r *= 10; r += c - '0';
        c = getchar();
    }
    return r * f;
}
inline void write(int x) {
    if(x < 0) {
        putchar('-'); 
        x = -x;
    }
    if(x > 9) write(x / 10);
    putchar('0' + x % 10);
}
template<class Tp>
bool _Cmp(Tp a, Tp b) {
    return a > b;
}
template<class Tp, bool (*Cmp)(Tp a, Tp b) = _Cmp, const int N = Maxsz>
class St {
    private:
        Tp s[N][(int)log2(N) + 5];
        int z = 0;
        Tp Max(Tp a, Tp b) {
            if(Cmp(a, b)) return a;
            else return b;
        }
    public:
        void build(Tp *b, Tp *e) {
            z = 0;
            for(Tp *i = b; i <= e; i++) s[(++z)][0] = *i;
            int t = log2(z);
            for(int j = 1; j <= t; j++) 
                for(int i = 1; i <= z - (int)pow(2, j) + 1; i++)
                    s[i][j] = Max(s[i][j - 1], s[i + (int)pow(2, j - 1)][j - 1]);
        }
        Tp get(int l, int r) {
            int k = log2(r - l + 1);
            return Max(s[l][k], s[r - (int)pow(2, k) + 1][k]);
        }
};
int n, m, a[N], l[N], r[N], s[N], k[N];
St<int> t;
signed main() {
    n = read(); m = read();
    for(int i = 1; i <= n; i++) {
        a[i] = read();
        l[i] = l[i - 1] + !a[i];
        s[i] = s[i - 1] + (a[i] && !a[i - 1]);
    }
    for(int i = n; i >= 1; i--) r[i] = r[i + 1] + (bool)a[i];
    for(int i = 1; i <= n; i++) k[i] = l[i] + r[i];
    t.build(k + 1, k + n + 1);
    while(m--) {
        int q, x, y;
        q = read(); x = read(); y = read();
        if(q == 1) {
            write(t.get(x, y) - l[x - 1] - r[y + 1]);
            putchar('\n');
        } else {
            write((s[x] != s[y]) + 1);
            putchar('\n');
        }
    }
    return 0;
}
2024/1/20 23:14
加载中...