0tps求调
查看原帖
0tps求调
942071
_xzh_楼主2024/8/20 20:27
#include<bits/stdc++.h>
using namespace std;
long long a[100040];
int tree[400400],lazy[400400];
long long pushup(int node){
	int left_node=2*node;
    int right_node=2*node+1;
    tree[node]=tree[left_node]+tree[right_node];
}
void build_tree(int node,long long l,long long r){
    if(l==r){
        tree[node]=a[l];
        return;
    }
    else{
        long long mid=(l+r)/2;
        long long left_node=2*node;
        long long right_node=2*node+1;
        build_tree(left_node,l,mid);
        build_tree(right_node,mid+1,r);
        pushup(node);
    }
}
void pushdown(int node,long long k){
    if(lazy[node]){
        long long left_node=2*node;
        long long right_node=2*node+1;
        lazy[left_node]+=lazy[node];
        lazy[right_node]+=lazy[node];
        tree[left_node]+=lazy[node]*(k-(k/2));
        tree[right_node]+=lazy[node]*(k/2);
        lazy[node]=0;
    }
}
void update(int node,long long l,long long r,long long left,long long right,long long val){
    if(left<=l&&right>=r){
        lazy[node]+=val;
        tree[node]+=val*(r-l+1);
    }
    else{
        pushdown(node,r-l+1);
        int mid=(l+r)/2;
        int left_node=2*node;
        int right_node=2*node+1;
        if(left<=mid)update(left_node,l,mid,left,right,val);
        if(right>mid)update(right_node,mid+1,r,left,right,val);
        pushup(node);
    }
}
long long query(int node,long long l,long long r,long long left,long long right){
    if(left<=l&&right>=r){
        return tree[node];
    }
    else{
        pushdown(node,r-l+1);
        long long mid=(l+r)/2;
        long long left_node=2*node;
        long long right_node=2*node+1;
        long long left_sum=0,right_sum=0;
        if(left<=mid){
            left_sum=query(left_node,l,mid,left,right);
        }
        if(right>mid){
            right_sum=query(right_node,mid+1,r,left,right);
        }
        return left_sum+right_sum;
    }
}
int n,q;
int main(){
    scanf("%d%d",&n,&q);
    for(long long i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    build_tree(1,1,n);
    while(q--){
        int t;
        long long l,r,val;
        scanf("%d",&t);
        if(t==2){
            scanf("%lld%lld",&l,&r);
            printf("%lld\n",query(1,1,n,l,r));
        }
        else if(t==1){
            scanf("%lld%lld%lld",&l,&r,&val);
            update(1,1,n,l,r,val);
        }
    }
    return 0;
}

一个TLE,一个MLE,其他RE

2024/8/20 20:27
加载中...