线段树56区全TLE,不知该如何优化了,求助!
  • 板块P2357 守墓人
  • 楼主_CC_lld
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/7/14 08:36
  • 上次更新2023/10/27 20:29:46
查看原帖
线段树56区全TLE,不知该如何优化了,求助!
436123
_CC_lld楼主2022/7/14 08:36

大佬们,线段树56分,后面错的点全TLE,不知该怎么优化了。。。
求大佬教一下。

#include <bits/stdc++.h>
using namespace std;

long long n, f, a[200100];
long long cnt, l, r, k;

struct xdtree {
	long long l, r, sum, lazy;
} t[200100 * 4];

inline long long read (long long & x)
{
	long long f;
	char c;
	for (f = 1, c = getchar (); c < '0' || c > '9'; c = getchar ())
	    if (c == '-')
		    f = -1;
	
	for (x = 0; c <= '9' && c >= '0'; c = getchar ())
	    x = x * 10 + (c & 15);
	
	x *= f;
} 

inline void build (long long p, long long l, long long r) {
	t[p]. l = l, t[p]. r = r;
	if (l == r) {
		t[p]. sum = a[l];
		return ;
	}
	
	int mid = (l + r) >> 1;
	
	build (p * 2, l, mid);
	build (p * 2 + 1, mid + 1, r);
	
	t[p]. sum = t[p * 2]. sum + t[p * 2 + 1]. sum;
}

inline void push_down (long long p) {
	if (t[p]. lazy && t[p]. l != t[p]. r) {
		t[p * 2]. sum += (t[p * 2]. r - t[p * 2]. l + 1) * t[p]. lazy;
		t[p * 2 + 1]. sum += (t[p * 2 + 1]. r - t[p * 2 + 1]. l + 1) * t[p]. lazy;
		t[p * 2]. lazy += t[p]. lazy;
		t[p * 2 + 1]. lazy += t[p]. lazy;
		t[p]. lazy = 0;
	}
}

inline void change (long long p, long long l, long long r, long long k) {
	if (t[p]. l >= l && t[p]. r <= r) {
		t[p]. sum += k * (t[p]. r - t[p]. l + 1);
		t[p]. lazy += k;
		return ;
	}
	
	push_down (p);
	
	long long mid = (t[p]. l + t[p]. r) >> 1;
	
	if (l <= mid)
	    change (p * 2, l, r, k);
	
	if (r > mid)
	    change (p * 2 + 1, l, r, k);
	
	t[p]. sum = t[p * 2]. sum + t[p * 2 + 1]. sum;
}

inline long long search (long long p, long long l, long long r) {
	if (t[p]. l == t[p]. r)
		return t[p]. sum;
	
	push_down (p);
	
	long long mid = (t[p]. l + t[p]. r) >> 1,
	    summ = 0;
	
	if (l <= mid)
	    summ += search (p * 2, l, r);
	
	if (r > mid)
	    summ += search (p * 2 + 1, l, r);
	
	return summ;
}

int main () {
	read (n), read (f);
	for (int i = 1; i <= n; ++ i)
	    read (a[i]);
	
	build (1, 1, n);
	
	for (int i = 1; i <= f; ++ i) {
		
		read (cnt);
		
		if (cnt == 1) {
			read (l), read (r), read (k);
			change (1, l, r, k);
		}
		
		else if (cnt == 2) {
			read (k);
			change (1, 1, 1, k);
	    }
	    
	    else if (cnt == 3) {
			read (k);
			change (1, 1, 1, -k);
		}
			
		else if (cnt == 4) {
			read (l), read (r);
			printf ("%lld\n", search (1, l, r));
		}
			
		else if (cnt == 5)
			printf ("%lld\n", search (1, 1, 1));
	}
	return 0;
} 
2022/7/14 08:36
加载中...