全RE求助
查看原帖
全RE求助
528289
apphhzp楼主2022/11/5 17:35

rtrt实际上是1WA+9RE

源码(自己搞了个n=100000的样例,也扩大过数组,没试出问题):

#include<bits/stdc++.h>//前奏过长
using namespace std;
#define in_bufsize (1<<1)
#define out_bufsize (1<<1)
#define flush() (out->sputn(Obuf, optr - Obuf),optr = Obuf)
#define getc() getchar() //ist==ied?ied=Ibuf+in->sgetn(ist = Ibuf, in_bufsize),(ist==ied?EOF:*ist++):*ist++
#define putc(c) putchar(c) //optr==Obuf+out_bufsize?(out->sputn(Obuf, out_bufsize),optr = Obuf),*optr++ = c:*optr++=c
#define rull reg unsigned long long
#define ull unsigned long long
#define lli long long 
#define reg register
#define pow2(x) (1<<(x))
#define lb(x) (x&-x)
#define clamp(v,max,min) ((v)>(max)?(max):(v)<(min)?(min):(v))
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define abs(x) ((x)<0?(-(x)):(x))
#define FileRW freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
static char Obuf[out_bufsize], Ibuf[in_bufsize],*optr = Obuf, *ist = 0, *ied = 0;
static streambuf *out=cout.rdbuf(), *in=cin.rdbuf();
inline int read(){
	reg int a=0;
	reg bool isF=0;
	reg char c=getc();
	while(c<'0'||c>'9'){
		isF=(c=='-');
		c=getc();
	}
	while(c>='0'&&c<='9'){
		a=(a<<3)+(a<<1)+(c^48);
		c=getc();
	}
	return isF?-a:a;
}
inline void swrite(string s){
	for(reg unsigned int i=0;s[i]!='\0';++i){
		putc(s[i]);
	}
}
inline void write(reg int a){
	if(a==INT_MIN){
		swrite("-2147483648");
		return;
	}
	if(a<0){
		a=-a;
		putc('-');
	}
	reg short top=0;
	static char sc[15];
	do{
		sc[top++]=a%10+48;
		a/=10;
	}while(a);
	while(top){
		putc(sc[--top]);
	}
}
int n,p,m;
lli a[100005],tr[100005<<2],la[100005<<2],la_mul[100005<<2];//la_mul是维护乘积的懒惰标记,tr是区间和,la是维护和的懒惰标记
#define ls(x) ((x)<<1)
#define rs(x) ((x)<<1|1)
#define push_up(x)  tr[x]=(tr[ls(x)]+tr[rs(x)])%p
inline void push_down(reg int l,reg int r,reg int dian){
	if(la[dian]||la_mul[dian]!=1){
		reg int mid=(l+r)>>1,lc=ls(dian),rc=rs(dian);
		la_mul[lc]=(la_mul[lc]*la_mul[dian])%p;
		la_mul[rc]=(la_mul[rc]*la_mul[dian])%p;
		la[lc]=(la[lc]*la_mul[dian])%p;
		la[rc]=(la[rc]*la_mul[dian])%p;
		tr[lc]=(tr[lc]*la_mul[dian])%p;
		tr[rc]=(tr[rc]*la_mul[dian])%p;
		la[lc]=(la[lc]+la[dian])%p;
		tr[lc]=(tr[lc]+la[dian]*(mid-l+1)%p)%p;
		la[rc]=(la[rc]+la[dian])%p;
		tr[rc]=(tr[rc]+(la[dian]*(r-mid)%p))%p;
		la[dian]=0;
		la_mul[dian]=1;
	}
}
void build(reg int l,reg int r,reg int dian){
	la_mul[dian]=1;
	if(l==r){
		tr[dian]=a[l];
		return;
	}
	reg int mid=(l+r)>>1;
	build(l,mid,ls(dian));
	build(mid+1,r,rs(dian));
	push_up(dian);
}
void update_add(reg int L,reg int R,reg int k,reg int l,reg int r,reg int dian){
	if(L<=l&&r<=R){
		tr[dian]=(tr[dian]+k*(r-l+1))%p;
		la[dian]=(la[dian]+k)%p;
		return;
	}
	push_down(l,r,dian);
	reg int mid=(l+r)>>1;
	if(L<=mid){
		update_add(L,R,k,l,mid,ls(dian));
	}
	if(R>mid){
		update_add(L,R,k,mid+1,r,rs(dian));
	}
	push_up(dian);
}
void update_mul(reg int L,reg int R,reg int k,reg int l,reg int r,reg int dian){
	if(L<=l&&r<=R){
		tr[dian]=(tr[dian]*k)%p;
		la_mul[dian]=(la_mul[dian]*k)%p;
		la[dian]=(la[dian*k])%p;
		return;
	}
	push_down(l,r,dian);
	reg int mid=(l+r)>>1;
	if(L<=mid){
		update_mul(L,R,k,l,mid,ls(dian));
	}
	if(R>mid){
		update_mul(L,R,k,mid+1,r,rs(dian));
	}
	push_up(dian);
}
lli ask(reg int L,reg int R,reg int l,reg int r,reg int dian){
	if(L<=l&&r<=R){
		return tr[dian];
	}
	push_down(l,r,dian);
	reg int mid=(l+r)>>1;
	return ((L<=mid?ask(L,R,l,mid,ls(dian)):0)+(R>mid?ask(L,R,mid+1,r,rs(dian)):0))%p;
}
int main(){
	n=read();
	p=read();
	for(reg int i=1;i<=n;i++){
		a[i]=read();
	}
	build(1,n,1);
	m=read();
	for(reg int i=0,mode,t,g,c;i<m;i++){
		mode=read();
		t=read();
		g=read();
		if(mode!=3){
			c=read();
			if(mode==2){
				update_add(t,g,c,1,n,1);
			}else{
				update_mul(t,g,c,1,n,1);
			}
		}else{
			write(ask(t,g,1,n,1)%p);
			putc('\n');
		}
	}
	flush();
	return 0;
}
2022/11/5 17:35
加载中...