求助!!哪位神犇帮忙看看
查看原帖
求助!!哪位神犇帮忙看看
1011466
FuZekai_楼主2024/3/24 12:02

最后三个测试点WA了 (T_T)

** 求助 **

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, m;
ll a[100005], tree[100005 << 2], mark[100005 << 2];

int build(ll l, ll r, ll p){
   if(l == r){
   	tree[p] = a[l];
   	return 0;
   }
   ll 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 0;
   
}

int push_down(ll p, ll len){
   mark[p * 2] += mark[p];
   mark[p * 2 + 1] += mark[p];
   tree[p * 2] += (len - len / 2) * mark[p];
   tree[p * 2 + 1] += (len / 2) * mark[p];
   mark[p] = 0;
   return 0;
}

int add(ll l, ll r, ll d, ll p, ll cl, ll cr){
   if(cr < l or cl > r) return 0;
   if(cr <= r and cl >= l){
   	tree[p] += (cr - cl + 1) * d;
   	if(cr > cl) mark[p] += d;
   	return 0;
   }
   ll mid = (cl + cr) / 2;
   push_down(p, cr - cl + 1);
   add(l, r, d, p * 2, cl, mid);
   add(l, r, d, p * 2 + 1, mid + 1, cr);
   tree[p] = tree[p*2] + tree[p*2+1];
}

int query(ll l, ll r, ll p, ll cl, ll cr){
   if(cr < l or cl > r) return 0;
   if(cr <= r and cl >= l){
   	return tree[p];
   }
   ll mid = (cl + cr) / 2;
   push_down(p, cr - cl + 1);
   return query(l, r, p * 2, cl, mid) + query(l, r, p * 2 + 1, mid + 1, cr);
}

int main(){
   ios::sync_with_stdio(0);
   cin >> n >> m;
   for(int i = 1; i <= n; i ++) cin >> a[i];
   build(1, n, 1);
   while(m--){
   	short method;
   	cin >> method;
   	if(method == 2){
   		ll l, r;
   		cin >> l >> r;
   		cout << query(l, r, 1, 1, n) << endl;
   	}else{
   		ll l, r, k;
   		cin >> l >> r >> k;
   		add(l, r, k, 1, 1, n);
   	}
   }
   return 0;
}
2024/3/24 12:02
加载中...