蒟蒻三问线段树
查看原帖
蒟蒻三问线段树
226142
无名ZWH楼主2020/6/1 18:40
#include<bits/stdc++.h>
using namespace std;
long long a[1000500],tr[1000500],ans[1000500],b[1000500],he[1000050],lazy[1000500],busy[1000050];
long long mid,n,m,ji=0,sum=0,pop;
void build(long long k,long long l,long long r)
{
	busy[k]=1;
    lazy[k]=0;
    if(l==r){
        tr[k]=a[l]%pop;
        return ;
    }
    long long mid=(r-l)/2+l;
    build(k*2,l,mid);
    build(k*2+1,mid+1,r);
    tr[k]=tr[k*2+1]+tr[k*2]; 
    tr[k]=tr[k]%pop;
}
void check(long long x,long long y)
{
    for(;x!=1;){
        tr[x/2]+=y;
        tr[x/2]=tr[x/2]%pop;
        x=x/2;
    }
}
void push(long long k,long long l,long long r)
{
	tr[k]=tr[k]*busy[k]%pop;
	busy[k*2]=busy[k*2]*busy[k]%pop;
	lazy[k*2]=lazy[k*2]*busy[k]%pop;
    busy[k*2+1]=busy[k*2+1]*busy[k]%pop;
    lazy[k*2+1]=lazy[k*2+1]*busy[k]%pop;
    busy[k]=1;
    if(lazy[k]!=0){
        lazy[k*2]+=lazy[k];
        lazy[k*2+1]+=lazy[k];
        lazy[k*2+1]=lazy[k*2+1]%pop;
        lazy[k*2]=lazy[k*2]%pop;
    	tr[k]+=(r-l+1)*lazy[k]%pop;
		lazy[k]=0;
    }
}
void change(long long k,long long l,long long r,long long cha1,long long cha2,long long jia)//cha1?a2??¨¬|???¨¬????????¡ì?¨¦??¨¬???|?¡ì????¡ìo?cha2?a??¨¬???¨¬????|?¡ì????¡ìo?l?a??¡ì?¨¦??¨¬???????¡ìo?r?a??¨¬???¨¬????????¡ìo?jia?a2??¨¬????¡ì?¨¦??
{
    if(l==cha1&&r==cha2)
    {
		check(k,tr[k]*(jia-1)*busy[k]);
		check(k,lazy[k]*(jia-1));
		busy[k]=jia*busy[k]%pop;
        lazy[k]=lazy[k]*jia%pop;
        return ;
    }
    if(l<=cha1&&r>=cha2){
    	push(k,l,r);
        long long mid=(r-l)/2+l;
        if(mid>=cha2) change(k*2,l,mid,cha1,cha2,jia);
        if(mid+1<=cha1) change(k*2+1,mid+1,r,cha1,cha2,jia);
        if(mid<cha2&&cha1<mid+1) {
            change(k*2,l,mid,cha1,mid,jia);
            change(k*2+1,mid+1,r,mid+1,cha2,jia);
        }
    }
} //-------------------------------------------------------------------
void gai(long long k,long long l,long long r,long long cha1,long long cha2,long long jia)//cha1?a2??¨¬|???¨¬????????¡ì?¨¦??¨¬???|?¡ì????¡ìo?cha2?a??¨¬???¨¬????|?¡ì????¡ìo?l?a??¡ì?¨¦??¨¬???????¡ìo?r?a??¨¬???¨¬????????¡ìo?jia?a2??¨¬????¡ì?¨¦??
{
    if(l==cha1&&r==cha2){
        check(k,(cha2-cha1+1)*jia);
        lazy[k]+=jia;
        lazy[k]=lazy[k]%pop;
        return ;
    }
    if(l<=cha1&&r>=cha2){
    	push(k,l,r);
        long long mid=(r-l)/2+l;
        if(mid>=cha2) gai(k*2,l,mid,cha1,cha2,jia);
        if(mid+1<=cha1) gai(k*2+1,mid+1,r,cha1,cha2,jia);
        if(mid<cha2&&cha1<mid+1) {
            gai(k*2,l,mid,cha1,mid,jia);
            gai(k*2+1,mid+1,r,mid+1,cha2,jia);
        }
    }
} //-------------------------------------------------------------------
void yong(long long k,long long l,long long r,long long cha1,long long cha2)
{
    if(l==cha1&&r==cha2){
        sum=sum+busy[k]*tr[k]+(r-l+1)*lazy[k];
        sum=sum%pop;
        return ;
    }
    if(l<=cha1&&r>=cha2){
    	push(k,l,r);
        long long mid=(r-l)/2+l;
        if(mid>=cha2) yong(k*2,l,mid,cha1,cha2);
        if(mid+1<=cha1) yong(k*2+1,mid+1,r,cha1,cha2);
        if(mid<cha2&&cha1<mid+1) {
            yong(k*2,l,mid,cha1,mid);
            yong(k*2+1,mid+1,r,mid+1,cha2);
        }
    }
} 
int main()
{
    scanf("%lld%lld%lld",&n,&m,&pop);
    for(long long i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    build(1,1,n);
    long long pan,l1,l2,c;
    for(long long i=1;i<=m;i++){
        scanf("%lld",&pan);
        if(pan==1){
        	scanf("%lld%lld%lld",&l1,&l2,&c);
        	change(1,1,n,l1,l2,c);
        }
        if(pan==2){
            scanf("%lld%lld%lld",&l1,&l2,&c);
            gai(1,1,n,l1,l2,c);
        }
        if(pan==3){
            ji++;
            scanf("%lld%lld",&l1,&l2);
            sum=0;
            yong(1,1,n,l1,l2);
            ans[ji]=sum;
            sum=0;
        }
    }
    for(long long i=1;i<=ji;i++){
        printf("%lld\n",ans[i]);
    }
    return 0;
}

30分(#1#3#4)
感觉没问题
求dalao指点

2020/6/1 18:40
加载中...