9pts 求调
查看原帖
9pts 求调
322620
Nygglatho楼主2023/2/2 06:54

如题,只过了第一个测试点

#include "bits/stdc++.h"
using namespace std;
typedef long long ll;

const int M = 100000;

int n, m;

ll a[M * 4];
ll b[M * 4];
ll c[M * 4];
ll d[M * 4];

void build(int p, int l, int r) {
	if (l == r) {
		d[p] = a[l];
		return;
	}
	
	int m = (l + r) / 2;
	build(p * 2, l, m);
	build(p * 2 + 1, m + 1, r);
	d[p] = d[p * 2] + d[p * 2 + 1];
}

void pushdown(int p, int l, int r) {
	int m = (l + r) / 2;
	d[p * 2] += c[p] * (m - l + 1); d[p * 2 + 1] += c[p] * (r - m);
	c[p * 2] += c[p]; c[p * 2 + 1] += c[p];
	c[p] = 0;
    //cout<<"pushdown:";for(int i=1;i<=4*n;++i)cout<<d[i]<<' ';cout<<endl;
}

void add(int p, int l, int r, int s, int t, ll v) {
	if (l <= s && t <= r) {
		c[p] += v;
		d[p] += v * (t - s + 1);
        //cout<<p<<' '<<d[p]<<endl;
		return;
	}
    //cout<<"add:";for(int i=1;i<=4*n;++i)cout<<d[i]<<' ';cout<<endl;
	if (s != t) pushdown(p, s, t);
	int m = (s + t) / 2;
	if (l <= m) add(p * 2, l, r, s, m, v);
	if (m < r) add(p * 2 + 1, l, r, m + 1, t, v);
    d[p] = d[p * 2] + d[p * 2 + 1];
}

ll query(int p, int l, int r, int s, int t) {
	if (l <= s && t <= r) {
		return d[p];
	}
	if (s != t) pushdown(p, s, t);
	int m = (s + t) / 2;
	ll k = 0ll;
	if (l <= m) k += query(p * 2, l, r, s, m);
	if (m < r) k += query(p * 2 + 1, l, r, m + 1, t);
	return k;
}

int main() {
	scanf ("%d%d", &n, &m);
	for (int i = 1; i <= n; ++i) scanf ("%d", &a[i]);
	for (int i = n - 1; i > 0; --i) a[i + 1] = a[i + 1] - a[i];
	//for(int i=1;i<=n;++i)cout<<a[i]<<' ';cout<<endl;
	build(1, 1, n);
    //for(int i=1;i<=4*n;++i)cout<<d[i]<<' ';cout<<endl;
	for (int i = 1; i <= m; ++i) {
		int op;
		scanf ("%d", &op);
		
		if (op == 1) {
			int l, r;
			ll K, D;
			scanf ("%d%d%lld%lld", &l, &r, &K, &D);
			add(1, l, l, 1, n, K);
			if (l < r) {add(1, l + 1, r, 1, n, D);}
			if (r < n) {add(1, r + 1, r + 1, 1, n, -(K + D * (r - l)));}
            //for(int i=1;i<=4*n;++i)cout<<d[i]<<' ';cout<<endl;
		} else {
			int x;
			scanf ("%d", &x);
			printf ("%lld\n", query(1, 1, x, 1, n));
		}
		
	}
}
2023/2/2 06:54
加载中...