大佬们,线段树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;
}