CE求助
  • 板块学术版
  • 楼主寒鸽儿
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/3/23 16:41
  • 上次更新2023/10/28 05:52:33
查看原帖
CE求助
88735
寒鸽儿楼主2022/3/23 16:41

给了点很奇怪的报错信息,表示不是很能看懂。
本地编译没有任何问题的说。
本地的环境:

$ clang -v
Apple clang version 12.0.5 (clang-1205.0.22.9)
Target: x86_64-apple-darwin20.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

是站外题,在洛谷 IDE 上的报错信息是:

下面是源代码:

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)

using namespace std;

typedef long long ll;

#define blk(x) (((x) - 1) / blk)
#define hob(x) ((x)*blk+1)
#define eob(x) min(((x)+1)*blk, n)

const int maxn = 5e5;

namespace seqq {
    const int blk = 707, nb = maxn / blk + 1;
    struct seqA {
        int a[maxn + 10], n;
        ll preS[maxn + 10], tag[nb + 10];
        void init(int _n) {
            n = _n;
            rep(i,1,n) preS[i] = a[i] + preS[i - 1];
        }
        void inc(int x, int c) {
            int bx = blk(x);
            per(i,blk(n),bx+1) tag[i] += c;
            per(i,eob(bx),x) preS[i] += c;
            // cout << n << ' ' << min(n, (blk + 1) * x) << endl;
            // cout << x << ' ' << eob(bx) << endl;
            a[x] += c;
        }
        int qry(int x) {
            return preS[x] + tag[blk(x)];
        }
    } seq;
};

const int blk = 707, nb = maxn / blk + 1;
struct block {
    int a[maxn + 10], bcnt[nb + 10][maxn + 10], tag[maxn + 10], n;
    ll sum[nb + 10];
    void init(int _n) {
        n = _n;
        // cout << "###############" << endl;
        // rep(i,1,n) cout << a[i] << ' '; cout << endl;
        rep(i,blk(1),blk(n)) {
            int s = hob(i), t = eob(i); sum[i] = 0;
            rep(j,s,t) ++ bcnt[i][a[j]], sum[i] += seqq::seq.preS[a[j]];
            per(j,n - 1,1) bcnt[i][j] += bcnt[i][j + 1];
            // cout << sum[i] << ' ';
        }
        // cout << endl;
        // rep(i,blk(1),blk(n)) {
        //     rep(j,1,n) cout << bcnt[i][j] << ' '; cout << endl;
        // }
        // cout << "###############" << endl;

    }
    void modify(int x, int ac) {
        rep(i,blk(1),blk(n)) sum[i] += 1ll * bcnt[i][x] * ac;
    }
    ll qry(int l, int r) {
        return r == 1 ? _qry(r) : _qry(r) - _qry(l - 1);
    }
    ll _qry(int x) {
        ll ret = 0;
        int bx = blk(x);
        rep(i,0,bx - 1) ret += sum[i];
        // cout << hob(bx) << ' ' << x << endl;
        rep(i,hob(bx),x) ret += seqq::seq.qry(a[i]); // , cout << a[x] << ' ' << ret << endl;
        return ret;
    }
} blker[2];

int main() {

    if(fopen("yl.in", "r")) {
        freopen("yl.in", "r", stdin);
        freopen("yl.out", "w", stdout);
    }

    int n, q, opt, l, r;
    scanf("%d", &n);
    rep(i,1,n) scanf("%d", seqq::seq.a + i);
    seqq::seq.init(n);
    rep(i,1,n) {
        scanf("%d %d", &l, &r);
        blker[0].a[i] = r;
        blker[1].a[i] = l - 1;
    }
    blker[0].init(n);
    blker[1].init(n);
    scanf("%d", &q);
    // rep(i,1,n) cout << seqq::seq.qry(i) << ' '; cout << endl;
    rep(i,1,q) {
        scanf("%d %d %d", &opt, &l, &r);
        if(opt == 1) {
            int dis = r - seqq::seq.a[l];
            // cout << l << ' ' << dis << endl;
            seqq::seq.inc(l, dis);
            // rep(i,1,n) cout << seqq::seq.qry(i) << ' '; cout << endl;
            blker[0].modify(l, dis);
            blker[1].modify(l, dis);

        } else if(opt == 2) {
            // cout << blker[0].qry(l, r) << endl;
            printf("%lld\n", blker[0].qry(l, r) - blker[1].qry(l, r));
        }
    }
    return 0;
}
2022/3/23 16:41
加载中...