ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-06-24 11:00:45  阅读:222  来源: 互联网

标签:Atcoder power int Sum Cumulative mid long static MOD


要特别注意下精度,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;
    }
}

 

标签:Atcoder,power,int,Sum,Cumulative,mid,long,static,MOD
来源: https://www.cnblogs.com/fishcanfly/p/16408008.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有