蒟蒻求助qwq
查看原帖
蒟蒻求助qwq
196903
南阳刘子骥楼主2021/11/15 10:10

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;
}
2021/11/15 10:10
加载中...