大佬们救救我
查看原帖
大佬们救救我
358971
朦胧_XY楼主2022/8/17 11:58

同样的代码,一个AC,一个全WA

WA代码:

#include<iostream>
#define ll long long
#define N 100005
using namespace std;
ll n, m, p, a[N], add[N << 2], mul[N << 2];
struct node{
	ll l, r, w;
}tree[N << 2];
void build(ll k, ll x, ll y){
	tree[k].l = x, tree[k].r = y, mul[k] = 1;
	if(x == y){
		tree[k].w = a[x] % p;
		return;
	}
	ll mid = x + y >> 1;
	build(k << 1, x, mid);
	build(k << 1 | 1, mid + 1, y);
	tree[k].w = (tree[k << 1].w + tree[k << 1 | 1].w) % p;
}
void down(ll k, ll x, ll y){
	if(!add[k] && mul[k] == 1) return;
	ll mid = x + y >> 1;
	tree[k << 1].w = (tree[k << 1].w * mul[k] + add[k] * (mid - x + 1) % p) % p;
	tree[k << 1 | 1].w = (tree[k << 1 | 1].w * mul[k] + add[k] * (y - mid) % p) % p;
	mul[k << 1] = (mul[k << 1] * mul[k]) % p;
	mul[k << 1 | 1] = (mul[k << 1 | 1] * mul[k]) % p;
	add[k << 1] = (add[k << 1] * mul[k] + add[k]) % p;
	add[k << 1 | 1] = (add[k << 1 | 1] * mul[k] + add[k]) % p;
	add[k] = 0, mul[k] = 1;
} 
void Mul(ll k, ll x, ll y, ll v){
	if(x <= tree[k].l && tree[k].r <= y){
		add[k] *= v, add[k] %= p;
		mul[k] *= v, mul[k] %= p;
		tree[k].w *= v, tree[k].w %= p;
		return;
	}
	ll mid = tree[k].l + tree[k].r >> 1;
	down(k, tree[k].l, tree[k].r);
	if(mid >= x) Mul(k << 1, x, y, v);
	if(mid < y) Mul(k << 1 | 1, x, y, v);
	tree[k].w = (tree[k << 1].w + tree[k << 1 | 1].w) % p;
}
void Add(ll k, ll x, ll y, ll v){
	if(x <= tree[k].l && tree[k].r <= y){
		add[k] += v, add[k] %= p;
		tree[k].w += v * (tree[k].r - tree[k].l + 1), tree[k].w %= p;
		return;
	}
	ll mid = tree[k].l + tree[k].r >> 1;
	down(k, tree[k].l, tree[k].r);
	if(mid >= x) Add(k << 1, x, y, v);
	if(mid < y) Add(k << 1 | 1, x, y, v);
	tree[k].w = (tree[k << 1].w + tree[k << 1 | 1].w) % p;
}
ll query(ll k, ll x, ll y){
	if(x <= tree[k].l && tree[k].r <= y){
		return tree[k].w;
	}
	ll mid = tree[k].l + tree[k].r >> 1, ts = 0;
	down(k, tree[k].l, tree[k].r);
	if(mid >= x) ts += query(k << 1, x, y), ts %= p;
	if(mid < y) ts += query(k << 1 | 1, x, y), ts %= p;
	return ts;
}
int main(){
	ll f, t, g, c;
	scanf("%lld%lld", &n, &p);
	for(int i = 1; i <= n; i++){
		scanf("%lld", &a[i]);
	}
	build(1, 1, n);
	scanf("%lld", &m);
	for(int i = 1; i <= m; i++){
		scanf("%d", &f);
		if(f == 1){
			scanf("%lld%lld%lld", &t, &g, &c);
			Mul(1, t, g, c);
		}
		else if(f == 2){
			scanf("%lld%lld%lld", &t, &g, &c);
			Add(1, t, g, c);
		}
		else{
			scanf("%lld%lld", &t, &g);
			printf("%lld\n", query(1, t, g));
		}
	}
	return 0;
}

AC代码:

#include<iostream>
#define N 100005
#define ll long long
using namespace std;
ll n, m, p, a[N], add[N << 2], mul[N << 2];
struct node{
	ll l, r, w;
}tree[N << 2];
void build(ll k, ll x, ll y){
	tree[k].l = x, tree[k].r = y, mul[k] = 1;
	if(x == y){
		tree[k].w = a[x] % p;
		return;
	}
	ll mid = x + y >> 1;
	build(k << 1, x, mid);
	build(k << 1 | 1, mid + 1, y);
	tree[k].w = (tree[k << 1].w + tree[k << 1 | 1].w) % p;
}
void down(ll k, ll x, ll y){
	if(!add[k] && mul[k] == 1) return;
	ll mid = x + y >> 1;
	tree[k << 1].w = (tree[k << 1].w * mul[k] + ((mid - x + 1) * add[k]) % p) % p;
	tree[k << 1 | 1].w = (tree[k << 1 | 1].w * mul[k] + ((y - mid) * add[k]) % p) % p;
	mul[k << 1] = (mul[k << 1] * mul[k]) % p;
	mul[k << 1 | 1] = (mul[k << 1 | 1] * mul[k]) % p;
	add[k << 1] = (add[k << 1] * mul[k] + add[k]) % p;
	add[k << 1 | 1] = (add[k << 1 | 1] * mul[k] + add[k]) % p;
	add[k] = 0, mul[k] = 1;
} 
void Mul(ll k, ll x, ll y, ll v){
	if(x <= tree[k].l && tree[k].r <= y){
		add[k] = (add[k] * v) % p;
		mul[k] = (mul[k] * v) % p;
		tree[k].w *= v, tree[k].w %= p;
		return;
	}
	ll mid = tree[k].l + tree[k].r >> 1;
	down(k, tree[k].l, tree[k].r);
	if(x <= mid) Mul(k << 1, x, y, v);
	if(mid < y) Mul(k << 1 | 1, x, y, v);
	tree[k].w = (tree[k << 1].w + tree[k << 1 | 1].w) % p;
}
void Add(ll k, ll x, ll y, ll v){
	if(x <= tree[k].l && tree[k].r <= y){
		add[k] += v, add[k] %= p;
		tree[k].w += (tree[k].r - tree[k].l + 1) * v;
		tree[k].w %= p;
		return;
	}
	ll mid = tree[k].l + tree[k].r >> 1;
	down(k, tree[k].l, tree[k].r);
	if(x <= mid) Add(k << 1, x, y, v);
	if(mid < y) Add(k << 1 | 1, x, y, v);
	tree[k].w = (tree[k << 1].w + tree[k << 1 | 1].w) % p;
}
ll query(ll k, ll x, ll y){
	if(x <= tree[k].l && tree[k].r <= y) return tree[k].w;
	ll mid = tree[k].l + tree[k].r >> 1, ts = 0;
	down(k, tree[k].l, tree[k].r);
	if(x <= mid) ts += query(k << 1, x, y), ts %= p;
	if(mid < y) ts += query(k << 1 | 1, x, y), ts %= p;
	return ts;
}
int main(){
	ll t, g, c, f;
	scanf("%lld%lld", &n, &p);
	for(int i = 1; i <= n; i++){
		scanf("%lld", &a[i]);
	}
	build(1, 1, n);
	scanf("%lld", &m);
	for(int i = 1; i <= m; i++){
		scanf("%lld", &f);
		if(f == 1){
			scanf("%lld%lld%lld", &t, &g, &c);
			Mul(1, t, g, c);
		}
		else if(f == 2){
			scanf("%lld%lld%lld", &t, &g, &c);
			Add(1, t, g, c);
		}
		else{
			scanf("%lld%lld", &t, &g);
			printf("%lld\n", query(1, t, g));
		}
	}
	return 0;
}

WA的那个代码样例过了,下载的数据也过了,就是全WA,不知为啥。。QAQ

2022/8/17 11:58
加载中...