样例过0pts全WA蒟蒻求助
查看原帖
样例过0pts全WA蒟蒻求助
1457343
asdqwe122楼主2025/7/25 18:34

rt

算法是线段树差分,样例能过,自己写了几个数据也过了,但是提交就全红,代码如下:

#include<bits/stdc++.h>
#define FOR(i, a, b) for(int (i) = (a); (i) <= (b); (i)++)
#define itn int
using namespace std;
int a[100005], b[100005];
struct aaaa{
	int ll, rr, sum, lazy; 
}e[400005]; 

void build(int k, int l, int r){
	e[k].ll = l, e[k].rr = r, e[k].lazy = 0;
	if(l == r){
		e[k].sum = a[l];
		return;
	}
	int mid = (l + r) / 2;
	build(k*2, l, mid);
	build(k*2+1, mid+1, r);
	e[k].sum = e[k*2].sum + e[k*2+1].sum;
	return;
}

void addd(int k, int l, int r, int s){
	//cout << k << '%' << l << '%' << r << '%' << (r < e[k].ll || e[k].rr < l) << endl;
	if(r < e[k].ll || e[k].rr < l)return;
	if(l <= e[k].ll && e[k].rr <= r){
		e[k].sum += (e[k].rr - e[k].ll + 1) * s;
		e[k].lazy += s;
		//cout << k << "%%" << e[k].sum << "%" << e[k].lazy << endl;
		return;
	}
	int mid = (e[k].ll + e[k].rr) / 2;
	addd(k*2, l, r, s);
	addd(k*2+1, l, r, s);
	e[k].sum = e[k*2].sum + e[k*2+1].sum;
	//cout << k << '%' << e[k].sum << endl;
	return;
}

void pushdown(int k){
	e[k*2].sum += e[k].lazy*(e[k*2].rr - e[k*2].ll + 1);
	e[k*2].lazy += e[k].lazy;
	e[k*2+1].sum += e[k].lazy*(e[k*2+1].rr - e[k*2+1].ll + 1);
	e[k*2+1].lazy += e[k].lazy;
	e[k].lazy = 0;
}

int find(int k, int l, int r){
	//cout << k << '#' << l << '#' << r << '#' << (r < e[k].ll || e[k].rr < l) << endl;
	if(r < e[k].ll || e[k].rr < l)return 0;
	if(e[k].lazy)pushdown(k);
	if(l <= e[k].ll && e[k].rr <= r){
		//cout << "##" << e[k].sum << endl;
		return e[k].sum;
	}
	int mid = (e[k].ll + e[k].rr) / 2, ans = 0;
	ans += find(k*2, l, r);
	ans += find(k*2+1, l, r);
	//cout << '#' << ans << endl;
	return ans;
}

int main(){
	int n,m;
	cin >> n >> m;
	FOR(i, 1, n)cin >> a[i];
	for(int i = n-1; i; i--){
		a[i+1] = a[i+1] - a[i];
	}
	build(1, 1, n);
	FOR(i, 1, m){
		int opt;
		cin >> opt;
		if(opt == 1){
			int l, r, K, D;
			cin >> l >> r >> K >> D;
			addd(1, l, l, K);
			addd(1, l+1, r, D);
			addd(1, r+1, r+1, -K-(r-l)*D);
		}
		else if(opt == 2){
			int p;
			cin >> p;
			cout << find(1, 1, p) << endl;
		}
	}
	return 0;
}
2025/7/25 18:34
加载中...