mx 刚学分块,50pts 求助
查看原帖
mx 刚学分块,50pts 求助
328877
intawl楼主2023/7/28 21:05

WA on 6~10,已经 #define int long long 了

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 100005, maxm = 1005;
int l[maxm], r[maxm], maxx[maxm], sum[maxm];
int pos[maxn], a[maxn];
int n, m, k, kc;
void update(int p) {
    int mp = 0, sp = 0;
    for (int i = l[p]; i <= r[p]; i++)
        mp = max(mp, a[i]),
        sp += a[i];
    maxx[p] = mp, sum[p] = sp;
}
void modify(int L, int R) {
    int p = pos[L], q = pos[R];
    if (p == q) {
        if (maxx[p] == 1) return ;
        for (int i = L; i <= R; i++)
            a[i] = sqrt(a[i]);
        update(p); return ;
    }
    for (int i = p + 1; i < q; i++) 
        if (maxx[i] > 1) {
            for (int j = l[i]; j <= r[i]; j++)
                a[j] = sqrt(a[j]);
            update(i);
        }
    if (maxx[p] > 1) {
        for (int i = L; i <= r[p]; i++)
            a[i] = sqrt(a[i]);
        update(p);
    }
    if (maxx[q] > 1) {
        for (int i = l[q]; i <= R; i++)
            a[i] = sqrt(a[i]);
        update(q);
    }
}
int query(int L, int R) {
    int p = pos[L], q = pos[R];
    if (p == q) {
        int res = 0;
        for (int i = L; i <= R; i++) 
            res += a[i];
        return res;
    }
    int res = 0;
    for (int i = p + 1; i < q; i++) res += sum[i];
    for (int i = L; i <= r[p]; i++) res += a[i];
    for (int i = l[q]; i <= R; i++) res += a[i];
    return res;
}
signed main() {
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
    k = sqrt(n), kc = n / k;
    for (int i = 1; i <= k; i++)
        l[i] = (i - 1) * kc + 1,
        r[i] = i * kc;
    if (r[k] < n) ++k, l[k] = r[k - 1] + 1, r[k] = n;
    for (int i = 1; i <= k; i++)
        for (int j = l[i]; j <= r[i]; j++)
            pos[j] = i,
            maxx[i] = max(maxx[i], a[j]),
            sum[i] += a[j];
    scanf("%lld", &m);
    while (m--) {
        int opt, l, r;
        scanf("%lld%lld%lld", &opt, &l, &r);
        if (!opt) modify(l, r);
        else printf("%lld\n", query(l, r));
    }
    return 0;
}

感觉代码可读性还是不错的(雾)

2023/7/28 21:05
加载中...