70pts,线段树,玄关求调
查看原帖
70pts,线段树,玄关求调
890024
wangwenyu123楼主2024/7/17 14:35

rt,调了几个小时,救救蒟蒻吧

#include<bits/stdc++.h>
using namespace std;
struct node {
	long long ll,rr,v,lazy,_lazy;
} t[1400060];
long long h[100060];
long long s;
void build(long long id,long long l,long long r) {
	t[id].ll=l;
	t[id].rr=r;
	t[id]._lazy=1;
	t[id].lazy=0; 
	if(l==r) {
		t[id].v=h[l]%s;
		return;
	}
	long long mid=(l+r)/2;
	build(2*id,l,mid);
	build(2*id+1,mid+1,r);
	t[id].v=(t[2*id].v+t[2*id+1].v)%s;
}
void pushdown(long long id) {
	//cout<<"-----------"<<t[id].lazy+t[id]._lazy<<' '<<id<<endl;
	//cout<<id<<"  :::   "<<t[id].lazy<<" rrrrr "<<t[id]._lazy<<endl;//if(id==2)&&t[id].v==60
	if(t[id].lazy!=0||t[id]._lazy!=0) {
		long long a=t[id].lazy,b=t[id]._lazy,c=2*id,d=2*id+1;
		t[c].v=(b*t[c].v)%s+a*(t[c].rr-t[c].ll+1);
		t[c].v%=s;
		t[d].v=(b*t[d].v)%s+a*(t[d].rr-t[d].ll+1);
		t[d].v%=s;
		t[c]._lazy=(t[c]._lazy*b)%s;
		t[d]._lazy=(t[d]._lazy*b)%s;
		t[c].lazy=((t[c].lazy*b)%s+a)%s;
		t[d].lazy=((t[d].lazy*b)%s+a)%s;
		t[id].lazy=0;t[id]._lazy=1;
	}
}
void change(long long x,long long y,long long k,long long l,long long r,long long id) { 
	//if(k==3&&id==4)
	//cout<<"ikkkkkkkkkkkkkkkk   "<<id<<"   :::  "<<t[id].v<<endl;
	if(x<=l&&y>=r) {
		t[id].v+=k*(r-l+1);
		t[id].v%=s;
		
		//if(k==6&&id==2)cout<<"ikkkkkkkk "<<t[id].v<<endl;
		t[id].lazy+=k;
		t[id].lazy%=s;
		return;
	}
	pushdown(id);
	long long mid=(l+r)/2;
	if(x<=mid)change(x,y,k,l,mid,id*2);
	if(y>mid)change(x,y,k,mid+1,r,id*2+1);
	t[id].v=(t[id*2].v+t[id*2+1].v)%s;
}
void _change(long long x,long long y,long long k,long long l,long long r,long long id) {
	//if(k==2)
	//	cout<<id<<"  ::::  "<<t[id].v<<"   kkkkkkkkk"<<endl;
	if(x<=l&&y>=r) {
		t[id].v*=k;
		t[id].v%=s;//
		t[id]._lazy*=k;
		t[id]._lazy%=s;
		t[id].lazy*=k;
		t[id].lazy%=s;
		return;
	}
	pushdown(id);
	long long mid=(l+r)/2;
	if(x<=mid)_change(x,y,k,l,mid,id*2);
	if(y>mid)_change(x,y,k,mid+1,r,id*2+1);
	t[id].v=(t[id*2].v+t[id*2+1].v)%s;
}
long long search(long long x,long long y,long long l,long long r,long long id) {
	//cout<<id<<endl;
	if(x<=l&&y>=r) {
		return t[id].v;
	}
	pushdown(id);
	long long mid=(l+r)/2,p=0,q=0;
	if(x<=mid)p=search(x,y,l,mid,id*2)%s;
	if(y>mid)q=search(x,y,mid+1,r,id*2+1)%s;
	return p+q;
}
int main() {
	//freopen("xx.in","r",stdin);
	long long n,m,x,y,k;
	cin>>n>>m>>s;
	for(long long i=1; i<=n; i++)cin>>h[i];
	build(1,1,n);
	//建树for(int i=1;i<=100;i++)cout<<t[i].ll<<'-'<<t[i].rr<<'='<<t[i].v<<endl;
	while(m--) {
		int op;
		cin>>op;
		if(op==1) {
			cin>>x>>y>>k;
			_change(x,y,k,1,n,1);
		} else {
			if(op==2) {
				cin>>x>>y>>k;
				change(x,y,k,1,n,1);
			} else {
				cin>>x>>y;
				cout<<search(x,y,1,n,1)%s<<endl;
			}
		}
		//cout<<"ttt"<<t[1].v<<endl;
		//change
//if(m==1)
//for(int i=1; i<=11; i++)cout<<t[i].ll<<'-'<<t[i].rr<<'='<<t[i].v<<endl;
		//cout<<"-----------------------------"<<endl;
	}
	return 0;
}
2024/7/17 14:35
加载中...