【Atcoder F – Cumulative Cumulative Cumulative Sum】线段树


要特别注意下精度,long,int范围。WA了几次

 

import java.util.Scanner;

class Main {
  //  static long[] A2 ;//i^2*AI
  //  static long[] A1;//i*Ai;
    static long[] A;   //Ai;
    static long[] f2;
    static long[] f1;
    static long[] f0;
    static long power2;

    static long MOD = 998244353l;


    public static long power(long a,long power){
            if(power == 1){
                return a;
            }
            if(power == 0){
                return 1;
            }
            long x = power(a,power/2);
            if(power %2 == 0){
                return x*x%MOD;
            }
            return (x*x%MOD)*a%MOD;
    }

    public static void main(String[] args) {
       int n,q;
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        q = in.nextInt();
        A = new long[n+1];
     //   A2 = new long[n+1];
     //   A1 = new long[n+1];

        f0 = new long[4*n+1];
        f1 = new long[4*n+1];
        f2 = new long[4*n+1];

        power2 = power(2,MOD -2);
        for (int i = 1; i <=n; i++) {
            A[i] = in.nextLong();
     //       A1[i] = A[i]*i%MOD;
      //      A2[i] = A[i]*i%MOD*i%MOD;
        }
        //构造树
        buildTree(1,1,n);
        //查询
        for (int i = 0; i < q; i++) {
            int op = in.nextInt();
            if(op == 1){
                int x = in.nextInt();
                long v = in.nextInt();
                updateTree(1,1,n,x,v);
            }else{
                int x = in.nextInt();
                long ans = query(1,1,n,1,x,x);
                System.out.println(ans);
            }
        }
    }

    public static long query(int index,int l,int r,int L,int R,int x){
        if(l == L && r== R){
            long ans = (f2[index] - f1[index]*(2*x+3)%MOD + f0[index]*(x+1)%MOD*(x+2)%MOD + MOD)%MOD*power2%MOD;
            ans = ans % MOD;
            ans = (ans+ MOD) % MOD;
            return ans;
        }
        int mid =  (l+r) / 2;
        if(R<=mid){
            long ans = query(index*2,l,mid,L,R,x);
            return ans;
        }else{
            if(L>mid){
                return query(index*2+1,mid+1,r,L,R,x);
            }else{
                long ans = query(index*2,l,mid,L,mid,x);
                ans +=query(index*2+1,mid+1,r,mid+1,R,x);
                ans %=MOD;
                return ans;
            }
        }
    }


    public static void updateTree(int index,int l,int r,int x,long v){
        if( l==r) {
            A[x] = v;
            f0[index] = v;
            f1[index] = v*l%MOD;
            f2[index] = v*l%MOD*l%MOD;
            return;
        }
        int mid = (l+r)/2;
        if(x<=mid){
            //更新左边
            updateTree(index*2,l,mid,x,v);
        }else{
            updateTree(index*2+1,mid+1,r,x,v);
        }


        f0[index] =  f0[2*index] + f0[2*index+1];
        f0[index] %=MOD;
        f1[index] = f1[2*index] + f1[2*index+1];
        f1[index] %= MOD;
        f2[index] = f2[2*index] + f2[2*index+1];
        f2[index] %=MOD;
    }


    public static void buildTree(int index,int l,int r){
        if( l == r){
            f0[index] = A[l];
            f1[index] = A[l]*l%MOD;
            f2[index] = A[l]*l%MOD*l%MOD;
            return;
        }
        int mid = (l+r)/2;

        buildTree(2*index,l,mid);
        buildTree(2*index+1,mid+1,r);

        f0[index] =  f0[2*index] + f0[2*index+1];
        f0[index] %=MOD;
        f1[index] = f1[2*index] + f1[2*index+1];
        f1[index] %= MOD;
        f2[index] = f2[2*index] + f2[2*index+1];
        f2[index] %=MOD;
    }
}

 

原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/270242.html

(0)
上一篇 2022年6月24日 11:39
下一篇 2022年6月24日 11:39

相关推荐

发表回复

登录后才能评论