求助P2023 [AHOI2009] 维护序列
  • 板块学术版
  • 楼主Push_Y
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/7/11 19:14
  • 上次更新2023/11/6 23:16:45
查看原帖
求助P2023 [AHOI2009] 维护序列
135485
Push_Y楼主2020/7/11 19:14

找了半天不知道错在哪,求助:怎么找线段树题代码错在哪啊?

#include <bits/stdc++.h>
#define ls x<<1
#define rs x<<1|1
using namespace std;

inline int gin(){
	char c=getchar();
	int s=0,f=1;
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=(s<<3)+(s<<1)+(c^48);
		c=getchar();
	}
	return s*f;
}

const int N=1e5+10;
int n,p,m,a[N];

struct node{
	long long sum,ad,mu;
}t[N<<2];

void pushup(int x){
	t[x].sum=(t[ls].sum+t[rs].sum)%p;
}

void build(int x,int l,int r){
	t[x].mu=1;
	if(l==1){
		t[x].sum=a[l];
		return;
	}
	int mid=l+r>>1;
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(x);
}

void weihu(int x,int k){
	t[ls].sum=(t[ls].sum*t[x].mu+t[x].ad*(k+1>>1))%p;
	t[rs].sum=(t[rs].sum*t[x].mu+t[x].ad*(k>>1))%p;
	t[ls].mu=t[ls].mu*t[x].mu%p;
	t[rs].mu=t[rs].mu*t[x].mu%p;
	t[ls].ad=(t[ls].ad*t[x].mu+t[x].ad)%p;
	t[rs].ad=(t[rs].ad*t[x].mu+t[x].ad)%p;
	t[x].mu=1,t[x].ad=0;
}

void multiply(int x,int l,int r,int L,int R,int c){
	if(L<=l && r<=R){
		t[x].mu=t[x].mu*c%p;
		t[x].ad=t[x].ad*c%p;
		t[x].sum=t[x].sum*c%p;
		return;
	}
	weihu(x,r-l+1);
	int mid=l+r>>1;
	if(L<=mid)multiply(ls,l,mid,L,R,c);
	if(R>mid)multiply(rs,mid+1,r,L,R,c);
	pushup(x);
}

void add(int x,int l,int r,int L,int R,int c){
	if(L<=l && r<=R){
		t[x].ad=(t[x].ad+c)%p;
		t[x].sum=(t[x].sum+(r-l+1)*c)%p;
		return;
	}
	weihu(x,r-l+1);
	int mid=l+r>>1;
	if(L<=mid)add(ls,l,mid,L,R,c);
	if(R>mid)add(rs,mid+1,r,L,R,c);
	pushup(x);
}

long long ask(int x,int l,int r,int L,int R){
	if(L<=l && r<=R)return t[x].sum;
	weihu(x,r-l+1);
	int mid=l+r>>1;
	long long ans=0;
	if(L<=mid)ans+=ask(ls,l,mid,L,R);
	if(R>mid)ans+=ask(rs,mid+1,r,L,R);
	ans=ans%p;
	return ans;
}

int main(){
	n=gin();p=gin();
	for(int i=1;i<=n;i++)a[i]=gin();
	build(1,1,n);
	m=gin();
	while(m--) {
		int op=gin(),li=gin(),ri=gin();
		if(op==1)multiply(1,1,n,li,ri,gin());
		else if(op==2)add(1,1,n,li,ri,gin());
		else printf("%lld\n",ask(1,1,n,li,ri));
	}
	return 0;
}

2020/7/11 19:14
加载中...