大佬帮忙看看o(╥﹏╥)o 全WA
查看原帖
大佬帮忙看看o(╥﹏╥)o 全WA
1395328
zzjccc楼主2024/10/5 16:30
#include<iostream>
#include<cmath>
#define _int128 int
using namespace std;
const int N=(1e5+5)*4;
const int mod=998244353;
int n,m;
int sum[N],len[N],lazy[N];
int len_2[N],len_sum[N];
int con[N];
int a[N];

int sqr(int x){
    return x*x;
}
int gcd(int a,int b){
    if(b==0){
        return a;
    }
    if(a==0){
        return b;
    }
    while(b!=0){
        int temp=b;
        b=a%b;    
        a=temp;     
    }
    return a;
}

int power(int a,int x) {
    int ans=1; 
    while(x>0){ 
        if(x%2==1){  
            ans=(ans*a)%mod;  
        }
        a=(a*a)%mod;  
        x/=2;  
    }
    return ans;  
}

void push_up(const int &id){
    sum[id]=sum[id<<1]+sum[id<<1|1];
    len_sum[id]=len[id]*sum[id]+len_sum[id<<1]+len_sum[id<<1|1];
    con[id]=sqr(sum[id])+con[id<<1]+con[id<<1|1];
}

void Lazy(const int &id,const int &l,const int &r,const int &v){
    sum[id]+=v*(r-l+1);
    lazy[id]+=v;
    con[id]+=2*v*len_sum[id]+sqr(v)*len_2[id];
    len_sum[id]+=v*len_2[id];
}
void push_down(const int &id,const int &l,const int &r){
    if(lazy[id]){
        int mid=(l+r)>>1;
        Lazy(id<<1,l,mid,lazy[id]);
        Lazy(id<<1|1,mid+1,r,lazy[id]);
        lazy[id]=0;
    }
}

void build(const int &id,const int &l,const int &r){
    if(l==r){
        sum[id]=len_sum[id]=(int)a[l];
        len[id]=len_2[id]=1;
        lazy[id]=0;
        con[id]=sqr(sum[id]);
        return;
    }
    int mid=(l+r)>>1;
    build(id<<1,l,mid);
    build(id<<1|1,mid+1,r);
    len[id]=len[id<<1]+len[id<<1|1];
    len_2[id]=sqr(len[id])+len_2[id<<1]+len_2[id<<1|1];
    push_up(id);
}

void update(const int &id,const int &l,const int &r,const int &x,const int &y,const int &v) {
    if (x<=l&&y>=r) {
        Lazy(id,l,r,v);
        return;
    }
    int mid = (l + r) >> 1;
    push_down(id,l,r);
    if(x<=mid){
        update(id<<1,l,mid,x,y,v);
    }
    if(y>mid){
        update(id<<1|1,mid+1,r,x,y,v);
    }
    push_up(id);
}

void query(){
    int p=con[1],q=sum[1];
    int gd=gcd(p,q);
    p/=gd,q/=gd;
    int ans=((p%mod)*power(q,mod-2))%mod;
    cout<<ans<<endl;
}

signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    while(m--){
        int op;
        cin>>op;
        if(op==2){
            query();
        }
        else{
            int l,r,v;
            cin>>l>>r>>v;
            update(1,1,n,l,r,v);
        }
    }
    return 0;
}


2024/10/5 16:30
加载中...