本人妹子,WA声一片,听灌佬多,线段树板子求条
  • 板块灌水区
  • 楼主Immortal_Deity
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/8/26 23:38
  • 上次更新2024/8/27 12:27:53
查看原帖
本人妹子,WA声一片,听灌佬多,线段树板子求条
372326
Immortal_Deity楼主2024/8/26 23:38
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 114514 * 4;
int n,m;
int a[N],tree[N],lay[N];
void build(int l,int r,int p){
    if(l == r){
        tree[p] = a[r];
        return ;
    }
    int mid = l + r >> 1;
    build(l,mid,p * 2);
    build(mid + 1,r,p * 2 + 1);
    tree[p] = tree[p * 2] + tree[p * 2 + 1];
}
int query(int l,int r,int s,int t,int p){
    if(l <= s && t <= r){
        return tree[p];
    }
    int mid = s + t >> 1;
    int sum = 0;
    if(lay[p] && s != t){
        tree[p * 2] += lay[p] * (m - s + 1);
        tree[p * 2 + 1] += lay[p] * (t - m);
        lay[p * 2] += lay[p];
        lay[p * 2 + 1] += lay[p];
        lay[p] = 0; 
    }
    if(l <= mid) sum += query(l,r,s,mid,p * 2);
    if(mid < r) sum += query(l,r,mid + 1,t,p * 2 + 1);
    return sum;
}
void update(int l,int r,int c,int s,int t,int p){
    if(l <= s && t <= r){
        tree[p] += (t - s + 1) * c;
        lay[p] += c;
        return ;
    }
    int m = s + t >> 1;
    if(lay[p] && s != t){
        tree[p * 2] += lay[p] * (m - s + 1);
        tree[p * 2 + 1] += lay[p] * (t - m);
        lay[p * 2] += lay[p];
        lay[p * 2 + 1] += lay[p];
        lay[p] = 0; 
    }
    if(l <= m){
        update(l,r,c,s,m,p * 2);
    }
    if(m < r){
        update(l,r,c,m + 1,t,p * 2 + 1);
    }
    tree[p] = tree[p * 2] + tree[p * 2 + 1];
}
signed main(){
    
    cin >> n >> m;
    for(int i = 1;i <= n;i ++ ){
        cin >> a[i];
    }
    build(1,n,1);
    while(m -- ){
        int op;
        cin >> op;
        if(op == 1){
            int x,y,k;
            cin >> x >> y >> k;
            update(x,y,k,1,n,1);
        }
        else{
            int x,y;
            cin >> x >> y;
            cout << query(x,y,1,n,1) << endl;
        }
    }
}

甚至验证码里都是WA

2024/8/26 23:38
加载中...