社区讨论

数列分块七0分求调

学术版参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mhjae2g6
此快照首次捕获于
2025/11/03 23:20
4 个月前
此快照最后确认于
2025/11/03 23:20
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
const int N=4e5+20;
int tot=1,len;
int a[N];
int l[N],r[N],from[N],lazy[N],lazy2[N],Lazy[N];
int opt;
int L,R,k;
bool vis[N];
const int mod=10007;
const int kk=3e10;
void change(int o,int ll,int rr,int k){
    if(o==1){
        if(from[ll]==from[rr]){
            for(int i=ll;i<=rr;i++) a[i]+=k;
            return ;
        }
        for(int i=ll;i<=r[from[ll]];i++) a[i]+=k;
        for(int i=from[ll]+1;i<from[rr];i++) lazy[i]+=k;
        for(int i=l[from[rr]];i<=rr;i++) a[i]+=k;
    }
    else{
        if(from[ll]==from[rr]){
            for(int i=l[from[ll]];i<=r[from[ll]];i++){
                a[i]=((a[i]*lazy2[from[i]]+kk*mod)%mod+lazy[from[i]]+kk*mod)%mod;
            }
            lazy2[from[ll]]=1,lazy[from[ll]]=0;
            for(int i=ll;i<=rr;i++){
                a[i]=(a[i]*k+kk*mod)%mod;
            }
            return ;
        }
        for(int i=l[from[ll]];i<=r[from[ll]];i++){
           a[i]=((a[i]*lazy2[from[i]]+kk*mod)%mod+lazy[from[i]]+kk*mod)%mod;
        }
        lazy2[from[ll]]=1,lazy[from[ll]]=0;
        for(int i=ll;i<=r[from[ll]];i++){
             a[i]=(a[i]*k+kk*mod)%mod;
        }
        for(int i=from[ll]+1;i<from[rr];i++) lazy2[i]=lazy2[i]*k%mod,lazy[i]=lazy[i]*k%mod;
        for(int i=l[from[rr]];i<=r[from[rr]];i++){
           a[i]=((a[i]*lazy2[from[i]]+kk*mod)%mod+lazy[from[i]]+kk*mod)%mod; 
        }
        lazy2[from[rr]]=1,lazy[from[rr]]=0;
        for(int i=l[from[rr]];i<=rr;i++){
             a[i]=(a[i]*k+kk*mod)%mod;
        }
    }
}
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    len=sqrt(n);
    l[tot]=1;
    lazy2[tot]=1;
    for(int i=1;i<=n;i++){
        from[i]=tot;
        if(i%len==0){
            r[tot]=i;
            if(i!=n){
                tot++;
                lazy2[tot]=1;
                l[tot]=i+1;
            }
        }
    }   
    if(!r[tot]) r[tot]=n;
    for(int i=1;i<=n;i++){
        cin>>opt;
        if(opt==0){
            cin>>L>>R>>k;
            change(1,L,R,k);
        }
        if(opt==1){
            cin>>L>>R>>k;
            change(2,L,R,k);
        }
        if(opt==2){
            cin>>L>>R>>k;
cout<<(((a[R]*lazy2[from[R]]+kk*mod)%mod+lazy[from[R]]+kk*mod))%mod<<"\n";
        }
    }
}

回复

5 条回复,欢迎继续交流。

正在加载回复...