【赏关】线段树板子样例已过WA0pts带hack数据码风不离谱求调
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll n, m, opt, x, y, k, a[100005];
struct segment{
ll l, r, sum, lazy;
}b[500000];
void build(ll s, ll e, ll t){
b[t].l = s;
b[t].r = e;
if(s == e){
b[t].sum = a[s];
return;
}
ll p = s + ((e - s) >> 1);
build(s, p, t * 2);
build(p + 1, e, t * 2 + 1);
b[t].sum = b[t * 2].sum + b[t * 2 - 1].sum;
return;
}
ll scarch(ll t){
if(x <= b[t].l && y >= b[t].r){
return b[t].sum;
}
ll p = b[t].l + ((b[t].r - b[t].l) >> 1);
if(b[t].lazy){
b[t * 2].sum += b[t].lazy * (p - b[t].l + 1);
b[t * 2 + 1].sum += b[t].lazy * (b[t].r - p);
b[t * 2].lazy += b[t].lazy;
b[t * 2 + 1].lazy += b[t].lazy;
}
b[t].lazy = 0;
ll ans = 0;
if(x <= p){
ans += scarch(t * 2);
}
if(y > p){
ans += scarch(t * 2 + 1);
}
return ans;
}
void update(ll t){
if(x <= b[t].l && y >= b[t].r){
b[t].sum += (b[t].r - b[t].l + 1) * k;
b[t].lazy += k;
return;
}
ll p = b[t].l + ((b[t].r - b[t].l) >> 1);
if(b[t].lazy){
b[t * 2].sum += b[t].lazy * (p - b[t].l + 1);
b[t * 2 + 1].sum += b[t].lazy * (b[t].r - p);
b[t * 2].lazy += b[t].lazy;
b[t * 2 + 1].lazy += b[t].lazy;
}
b[t].lazy = 0;
if(x <= p){
update(t * 2);
}
if(y > p){
update(t * 2 + 1);
}
b[t].sum = b[t * 2].sum + b[t * 2 + 1].sum;
return;
}
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++){
cin >> a[i];
}
build(1, n, 1);
for(int i = 0; i < m; i++){
cin >> opt;
if(opt == 1){
cin >> x >> y >> k;
update(1);
}
else{
cin >> x >> y;
cout << scarch(1) << endl;
}
}
return 0;
}
hack数据:
输入:
8 10
640 591 141 307 942 58 775 133
2 1 5
2 3 8
2 3 6
2 5 8
2 4 8
1 4 8 60
2 1 6
2 5 8
1 3 7 15
1 2 6 86
正确输出:
2621
2356
1448
1908
2215
2859
2148
我的输出:
1582
2713
1981
1981
2288
2517
2221
我认为因为hack数据一上来就是输出操作,所以main(),build()和scarch()里面一定有至少一个错误,但与oi.wiki的代码比对多次无果。