线段树超时40
查看原帖
线段树超时40
804759
oiler153楼主2023/5/25 22:34
#include<iostream>
#include<cmath>
using namespace std;
long long op,x,y,k,n,m,b[114514],p;
struct tree{
    long long lazy2,lazy1,he;
    long long l,r;
}a[1919810];
long long build(long long jie,long long l,long long r){
    a[jie].lazy2=1,a[jie].l=l,a[jie].r=r;
    if(l==r)
        return a[jie].he=b[l];
    return a[jie].he=(build(jie*2,l,(l+r)/2)+build(jie*2+1,(l+r)/2+1,r))%p;
}
void push(long long jie){
    a[jie].lazy1%=p,
    a[jie].lazy2%=p,
    a[jie*2].lazy1%=p,
    a[jie*2].lazy2%=p,
    a[jie*2+1].lazy1%=p,
    a[jie*2+1].lazy2%=p,
    a[jie*2].lazy2=(a[jie].lazy2*a[jie*2].lazy2)%p,
    a[jie*2+1].lazy2=(a[jie].lazy2*a[jie*2+1].lazy2)%p,
    a[jie*2].lazy1*=a[jie].lazy2,
    a[jie*2+1].lazy1*=a[jie].lazy2,
    a[jie*2].lazy1+=a[jie].lazy1,
    a[jie*2+1].lazy1+=a[jie].lazy1,
    a[jie].he*=a[jie].lazy2;a[jie].he%=p,
    a[jie].he=(a[jie].he+a[jie].lazy1*(a[jie].r-a[jie].l+1))%p,
    a[jie].lazy2=1;a[jie].lazy1=0;
}
void add(long long jie,long long x,long long y,long long k){
    if(a[jie].r<x||a[jie].l>y)
        return ;
    if(a[jie].l>=x&&a[jie].r<=y)
        a[jie].lazy1=(k+a[jie].lazy1)%p;
    else{
        push(jie);
        add(jie*2,x,y,k);
        add(jie*2+1,x,y,k);
        a[jie].he=((min(a[jie].r,y)-max(a[jie].l,x)+1)*k+a[jie].he)%p;
    }
}
long long search(long long jie,long long x,long long y){
    push(jie);
    if(a[jie].r<x||a[jie].l>y)
        return 0;
    if(a[jie].l>=x&&a[jie].r<=y)
        return a[jie].he%p;
    return (search(jie*2,x,y)+search(jie*2+1,x,y))%p;
}
long long  read(){
    long long x=0;char ch=getchar();
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return x;
}
void cheng(long long jie,long long x,long long y,long long k){
    if(a[jie].r<x||a[jie].l>y)
        return ;
    else if(a[jie].l>=x&&a[jie].r<=y)
        a[jie].lazy1=a[jie].lazy1*k%571373,a[jie].lazy2=a[jie].lazy2*k%p;
    else{
        a[jie].he+=search(1,max(a[jie].l,x),min(a[jie].r,y))*(k-1)%p;
		cheng(jie*2,x,y,k);
		cheng(jie*2+1,x,y,k);
    }
}
void write(long long x) {
  	static int sta[35];
  	int top = 0;
  	do {
	    sta[top++] = x % 10, x /= 10;
  	} while (x);
  	while (top) putchar(sta[--top] + 48);
	  putchar('\n');
}
int main(){
    n=read();p=read();
    for(int i=1;i<=n;i++)
        b[i]=read();
    build(1,1,n);m=read();
    while(m--){
        op=read();
        if(op==2){
            x=read(),
            y=read(),
            k=read(),
            add(1,x,y,k%p);
        }else if(op==3){
            x=read(),
            y=read(),
            write(search(1,x,y));
        }else if(op==1){
            x=read(),
            y=read(),
            k=read(),
            cheng(1,x,y,k%p);
        }
    }
}
2023/5/25 22:34
加载中...