【赏关】线段树板子样例已过WA0pts带hack数据码风不离谱求调
查看原帖
【赏关】线段树板子样例已过WA0pts带hack数据码风不离谱求调
670355
Nuclear_Fish_cyq楼主2023/7/7 20:57

【赏关】线段树板子样例已过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的代码比对多次无果。

2023/7/7 20:57
加载中...