关于差分zkw
查看原帖
关于差分zkw
297355
InsomniaFly楼主2021/10/10 10:52

蒟蒻敲了个差分zkw 结果炸得连渣都不剩

调了1h之后找不出问题 对着板子又调了1h还是不知道哪里的问题

自闭了 求救

#include<bits/stdc++.h>
#define il inline
#define ls i<<1
#define rs i<<1|1
using namespace std;
const int N = 100005;
int sum[N << 2], M;
il int read() {
    int X = 0; bool flag = 1; char ch = getchar();
    while(!isdigit(ch) && ch != 45) ch = getchar();
    while(ch < 48 || ch > 57) { if(ch == 45) flag = 0; ch = getchar();}
    while(ch >= 48 && ch <= 57) { X = (X << 1) + (X << 3) + ch - 48; ch = getchar(); }
    if(flag) return X;
    return ~(X - 1);
}
il void build(int n) {
    for(M = 1; M <= n + 1; M <<= 1);
    for(int i = M + 1; i <= M + n; ++i)
        sum[i] = read();
    for(int i = M - 1; i; --i)
        sum[i] = min(sum[ls], sum[rs]), sum[ls] -= sum[i], sum[rs] -= sum[i];
}

il void update(int l, int r, int x) {
    int d, s, t;
    for(s = M + l - 1, t = M + r + 1; s ^ t ^ 1; s >>= 1, t >>= 1) {
        if(~s & 1) sum[s ^ 1] += x;
        if( t & 1) sum[t ^ 1] += x;
        d = min(sum[s], sum[s ^ 1]), sum[s] -= d, sum[s ^ 1] -= d, sum[s >> 1] += d;
        d = min(sum[t], sum[t ^ 1]), sum[t] -= d, sum[t ^ 1] -= d, sum[t >> 1] += d;
    }
    for(; s != 1; s >>= 1) d = min(sum[s], sum[s ^ 1]), sum[s] -= d, sum[s ^ 1] -= d, sum[s >> 1] += d;
}

il int query(int l, int r) {
    int sans = 0, tans = 0, ans, s = M + l - 1, t = M + r + 1;
    if(s != t) {
        for(; s ^ t ^ 1; s >>= 1, t >>= 1) {
            sans += sum[s], tans += sum[t];
            if(~s & 1) sans += min(sans, sum[s ^ 1]);
            if( t & 1) tans += min(tans, sum[t ^ 1]);
        }
    }
    ans = min(sans + sum[s], tans + sum[t]);
    while(s > 1) ans += sum[s >>= 1];
    return ans;
}

signed main() {
    int n = read(), m = read();
    build(n);
    while(m--) {
        int opt = read(), l, r, x;
        if(opt & 1) { l = read(), r = read(), x = read(); update(l, r, x); }
        else { l = read(), r = read(); cout << query(l, r) << endl; }
    }
    return 0;
}
2021/10/10 10:52
加载中...