WA #8-10,已开long long,求助
查看原帖
WA #8-10,已开long long,求助
1155717
Arkweedy楼主2024/9/23 21:58

求求指出WA原因,感谢!!!

提交链接

源代码:

#include<bits/stdc++.h>

#define ll long long
#define i64 long long
#define ull unsigned long long
#define int long long

using namespace std;

class SegTree {
public:
    int size;
    vector<int>a;
    vector<int>tree;
    vector<int>lazy;

    SegTree(){
        size = 0;
    }

    SegTree(int n)
    {
        size = n;
        tree.resize(n * 5);
        lazy.resize(n * 5);
        a.resize(n + 1);
    }

    SegTree(vector<int>&a)
    {
        this->a = a;
        size = a.size()-1 ;
        tree.resize(size * 5);
        lazy.resize(size * 5);
    }

    void build()
    {
        int l = 1, r = size, p = 1;
        build(l, r, p);
    }

    void build(int l,int r,int p)
    {
        if (l == r)
            tree[p] = a[l];
        else {
            int mid = (l + r) / 2;
            build(l, mid, p * 2);
            build(mid + 1, r, (p * 2) + 1);
            tree[p] = tree[(p * 2)] + tree[(p * 2) + 1];
        }
        return;
    }

    int qry(int lo, int hi)
    {
        return query_without_lazy(1, size, lo, hi, 1);
    }

    int qrywl(int lo, int hi)
    {
        return query_with_lazy(1, size, lo, hi, 1);
    }

    int query_without_lazy(int l, int r,int lo,int hi ,int p)
    {
        if (l >= lo && r <= hi) {
            return tree[p];
        }
        else if (l > hi || r < lo) {
            return 0;
        }
        else {
            int mid = (l + r) / 2;
            return query_without_lazy(l, mid, lo, hi, p * 2) + query_without_lazy(mid + 1, r, lo, hi, (p * 2) + 1);
        }
    }

    void upd(int lo, int hi, int v)
    {
        update_via_lazy(1, size, lo, hi, 1, v);
    }

    void update_via_lazy(int l, int r, int lo, int hi, int p, int v)//
    {
        if (l >= lo && r <= hi) {//l,r in lo,hi
            lazy[p] += v;
            return;
        }
        else if (l > hi || r < lo) {//disjoint
            return;
        }
        else {
            tree[p] += (min(hi, r) - max(lo, l) + 1) * v;
            int mid = (l + r) / 2;
            update_via_lazy(l, mid, lo, hi, p * 2, v);
            update_via_lazy(mid + 1, r, lo, hi, (p * 2) + 1, v);
            return;
        }
    }

    int query_with_lazy(int l, int r, int lo, int hi, int p)
    {
        int mid = (l + r) / 2;
        lazy[p * 2] += lazy[p];
        lazy[(p * 2) + 1] += lazy[p];
        tree[p] += (r - l + 1) * lazy[p];
        lazy[p] = 0;

        if (l >= lo && r <= hi) {//perfect cover,stay
            return tree[p];
        }
        else if (l > hi || r < lo) {
            return 0;
        }
        else {
            int mid = (l + r) / 2;
            return query_with_lazy(l, mid, lo, hi, p * 2) + query_with_lazy(mid + 1, r, lo, hi, (p * 2) + 1);
        }
    }
};


void solve()
{
    
    int n;
    cin >> n;
    int q;
    cin >> q;
    vector<int>a;
    a.resize(n + 1);

    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    SegTree t(a);
    t.build();
    
    for (int i = 0; i < q; i++) {
        int op;
        cin >> op;
        if (op == 2) {
            int l, r;
            cin >> l >> r;
            cout << t.qrywl(l, r) << endl;;
        }
        else {
            int l, r, v;
            cin >> l >> r >> v;
            t.upd(l, r, v);
        }
    }
    return;
}

signed main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);

    
        solve();
    return 0;
}

2024/9/23 21:58
加载中...