rt.
为什么仿制了一遍题解中的代码可以ac,而我的代码会在最后wa掉3个点?
感谢。
我的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
int n;
const int N = 100010;
int a[N];
struct segtree
{
int l, r, v, t;
}node[N << 2];
void build(int p, int l, int r)
{
node[p].l = l;
node[p].r = r;
if(l == r)
{
node[p].v = a[l];
return;
}
int mid = (l + r) >> 1;
build(p << 1, l, mid);
build(p << 1 | 1, mid + 1, r);
node[p].v = node[p << 1].v + node[p << 1 | 1].v;
return;
}
void tag(int p)
{
if(node[p].t != 0)
{
node[p << 1].t += node[p].t;
node[p << 1 | 1].t += node[p].t;
node[p << 1].v += node[p].t * (node[p << 1].r - node[p << 1].l + 1);
node[p << 1 | 1].v += node[p].t * (node[p << 1 | 1].r - node[p << 1 | 1].l + 1);
node[p].t = 0;
}
return;
}
void segpd(int p, int l, int r, int k)
{
if((node[p].r <= r) && (node[p].l >= l))
{
node[p].t += k;
node[p].v += k * (node[p].r - node[p].l + 1);
return;
}
if((node[p].r < l) || (node[p].l > r))return;
tag(p);
int mid = (node[p].r + node[p].l) >> 1;
if(mid >= l)segpd(p << 1, l, r, k);
if(mid < r)segpd(p << 1 | 1, l, r, k);
node[p].v = node[p << 1].v + node[p << 1 | 1].v;
return;
}
long long segsum(int p, int l, int r)
{
if((node[p].r <= r) && (node[p].l >= l))return node[p].v;
if((node[p].r < l) || (node[p].l > r))return 0;
tag(p);
int mid = (node[p].r + node[p].l) >> 1;
long long ans = 0;
if(mid >= l)ans += segsum(p << 1, l, r);
if(mid < r)ans += segsum(p << 1 | 1, l, r);
return ans;
}
int main()
{
int m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)scanf("%d", &a[i]);
build(1, 1, n);
for(int i = 1; i <= m; i++)
{
int op;
scanf("%d",&op);
if(op == 1)
{
int x, y, k;
scanf("%d%d%d",&x,&y,&k);
segpd(1, x, y, k);
}
else if(op == 2)
{
int x, y;
scanf("%d%d",&x,&y);
printf("%lld\n", segsum(1, x, y));
}
}
}
仿制的代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N];
struct segtree
{
int l, r;
long long v, t;
}node[N << 2];
void bulid(int p, int l, int r)
{
node[p].l = l;
node[p].r = r;
if(l == r)
{
node[p].v = a[l];
return;
}
int mid = (l + r) >> 1;
bulid(p << 1, l, mid);
bulid(p << 1 | 1, mid + 1, r);
node[p].v = node[p << 1].v + node[p << 1 | 1].v;
}
void tag(int p)
{
if(node[p].t)
{
node[p << 1].v += node[p].t * (node[p << 1].r - node[p << 1].l + 1);
node[p << 1 | 1].v += node[p].t * (node[p << 1 | 1].r - node[p << 1 | 1].l + 1);
node[p << 1].t += node[p].t;
node[p << 1 | 1].t += node[p].t;
node[p].t = 0;
}
}
void segpd(int p, int l, int r, int k)
{
if(l <= node[p].l && r >= node[p].r)
{
node[p].v += ( long long )k * (node[p].r - node[p].l + 1);
node[p].t += k;
return;
}
tag(p);
int mid = (node[p].l + node[p].r) >> 1;
if(l <= mid) segpd(p << 1, l, r, k);
if(r > mid) segpd(p << 1 | 1, l, r, k);
node[p].v = node[p << 1].v + node[p << 1 | 1].v;
}
long long segsum(int p, int l, int r)
{
if(l <= node[p].l && r >= node[p].r) return node[p].v;
tag(p);
int mid = (node[p].l + node[p].r) >> 1;
long long ans = 0;
if(l <= mid) ans += segsum(p << 1, l, r);
if(r > mid) ans += segsum(p << 1 | 1, l, r);
return ans;
}
int main()
{
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]);
bulid(1, 1, n);
for(int i = 1; i <= m; i++)
{
int op, x, y, k;
scanf("%d", &op);
if(op == 1)
{
scanf("%d%d%d", &x, &y, &k);
segpd(1, x, y, k);
}
else
{
scanf("%d%d", &x, &y);
cout << segsum(1, x, y) << endl;
}
}
return 0;
}