求助线段树!!!
  • 板块学术版
  • 楼主Turtle_ReG
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/9/3 21:14
  • 上次更新2023/10/27 12:39:40
查看原帖
求助线段树!!!
708995
Turtle_ReG楼主2022/9/3 21:14

如题,问题如下 P3373 看测评记录里面有很多同学,对的和错的数据点都和我一样qwq,自己改了半天一点头绪都没有 求大佬救救!!!

附上代码:

#include<bits/stdc++.h>
#define ll long long int
#define il inline
#define maxn 500001
using namespace std;
ll ans[maxn<<2],tag[maxn<<2],a[maxn],n,m,tax[maxn<<2],p1;
il void read(){
	cin>>n>>m>>p1;
	for(int i=1;i<=n;i++)cin>>a[i];
}
il ll ls(ll p){
	return p<<1;
} 
il ll rs(ll p){
	return p<<1|1;
}
il void push_up(ll p){
	ans[p]=ans[ls(p)]+ans[rs(p)];
}
il void build(ll p,ll l,ll r){
	tag[p]=0; 
	if(l==r){ans[p]=a[l];return;}
	ll mid=(l+r)/2;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	push_up(p);
}
il void f(ll p,ll l,ll r,ll k,ll x){ 
	tag[p]+=(x-1)*tag[p]+k;
	tag[p]%=p1;
	tax[p]*=x;
	tax[p]%=p1;
	ans[p]*=x;
	ans[p]+=k*(r-l+1);
	ans[p]%=p1;
}/*应该是这里出问题了qwq
	*/ 
il void push_down(ll p,ll l,ll r){ 
	ll mid=(l+r)/2;
	f(ls(p),l,mid,tag[p],tax[p]);
	f(rs(p),mid+1,r,tag[p],tax[p]);
	tag[p]=0;
	tax[p]=1;
}
il void update(ll p,ll nl,ll nr,ll l,ll r,ll k,ll x){
	if(nl<=l&&nr>=r){f(p,l,r,k,x);return;}
	push_down(p,l,r);
	ll mid=(l+r)/2;	
	if(nl<=mid)update(ls(p),nl,nr,l,mid,k,x);
	if(nr>mid)update(rs(p),nl,nr,mid+1,r,k,x);
	push_up(p);
}
il ll query(ll p,ll ql,ll qr,ll l,ll r){
	ll res=0;
	if(ql<=l&&qr>=r){return ans[p];}
	push_down(p,l,r);
	ll mid=(l+r)/2;
	if(ql<=mid)res+=query(ls(p),ql,qr,l,mid)%p1;
	if(qr>mid)res+=query(rs(p),ql,qr,mid+1,r)%p1;
	return res%p1;
}
int main(){
	ll ord,x,y,k,t;	
	read();
	for(int i=1;i<=n;i++)tax[i]=1;	
	build(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>ord;
		if(ord==1){
			cin>>x>>y>>k;	
			update(1,x,y,1,n,0,k);
		}
		else if(ord==2){
			cin>>x>>y>>k;
			update(1,x,y,1,n,k,1);
		}
		else if(ord==3){cin>>x>>y;
		t=query(1,x,y,1,n);
		cout<<t<<endl; 
		}
	}
	return 0;
}
2022/9/3 21:14
加载中...