要特别注意下精度,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 F - Cumulative Cumulative Cumulative Sum】线段树的更多相关文章

  1. 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)

    题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...

  2. AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)

    题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i ...

  3. Codeforces Round #463 F. Escape Through Leaf (李超线段树合并)

    听说正解是啥 set启发式合并+维护凸包+二分 根本不会啊 , 只会 李超线段树合并 啦 ... 题意 给你一颗有 \(n\) 个点的树 , 每个节点有两个权值 \(a_i, b_i\) . 从 \( ...

  4. 【BZOJ3638】Cf172 k-Maximum Subsequence Sum 线段树区间合并(模拟费用流)

    [BZOJ3638]Cf172 k-Maximum Subsequence Sum Description 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交 ...

  5. CF280D k-Maximum Subsequence Sum(线段树)

    在做这题时我一开始把\(tag\)写入了结构体 #include <iostream> #include <cstdio> #include <cstring> # ...

  6. Codeforces Round #271 (Div. 2) F. Ant colony (RMQ or 线段树)

    题目链接:http://codeforces.com/contest/474/problem/F 题意简而言之就是问你区间l到r之间有多少个数能整除区间内除了这个数的其他的数,然后区间长度减去数的个数 ...

  7. BZOJ 3155: Preprefix sum( 线段树 )

    刷刷水题... 前缀和的前缀和...显然树状数组可以写...然而我不会, 只能写线段树了 把改变成加, 然后线段树维护前缀和, 某点p加, 会影响前缀和pre(x)(p≤x≤n), 对[p, n]这段 ...

  8. Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)

    题目地址:http://codeforces.com/contest/474/problem/F 由题意可知,最后能够留下来的一定是区间最小gcd. 那就转化成了该区间内与区间最小gcd数相等的个数. ...

  9. ZOJ 4009 And Another Data Structure Problem(ZOJ Monthly, March 2018 Problem F,发现循环节 + 线段树 + 永久标记)

    题目链接  ZOJ Monthly, March 2018 Problem F 题意很明确 这个模数很奇妙,在$[0, mod)$的所有数满足任意一个数立方$48$次对$mod$取模之后会回到本身. ...

  10. 校赛F 比比谁更快(线段树)

    http://acm.cug.edu.cn/JudgeOnline/problem.php?cid=1153&pid=5 题意:给你一个字符串,各两个操作: ch=0,[l,r]降序 ch=1 ...

随机推荐

  1. 分享实用小工具:JAVA版本位运算工具类

    将二进制数中的每位数字1或0代表着某种开关标记,1为是,0为否,则一个数字可以代表N位的开关标记值,可有效减少过多的变量定义 或 过多的表字段,同时也能在一些复杂的组合判断场景下利用位与.位或.异或等 ...

  2. Libata Error Message 解析

    Libata error messages     Contents [hide]  1 Overview 2 Prefix 3 Exception line 4 Input taskfile 5 O ...

  3. RDM6300 125KHz ID卡读卡器

    RDM6300 RDM6300是一个针对125KHz ID卡的读卡模块, 用于读取EM4100兼容ID卡信息, 由一片C8051F330和一片LM358D双运放组成 注: EM4100, 4200卡是 ...

  4. Go语言的100个错误使用场景(48-54)|错误管理

    目录 前言 7. 错误管理 7.1 panicking(#48) 7.2 不清楚何时应该包裹一个 error(#49) 7.3 检查错误类型不够精确(#50) 7.4 检查错误值不够精确(#51) 7 ...

  5. 高效发现和解决insert字段长度不够的报错

    早上发现执行的PostgreSQL 存储过程报错,错误如下: 300-value too long for type character varying(100),一看就是表字段的长度太小,从提示看是 ...

  6. CentOS 8安装RabbitMQ

    第一步:安装yum仓库 导入签名KEY: ## primary RabbitMQ signing key ## 这一步如果因为网络问题下载不成功,可以先将签名文件下载下来,本地导入 rpm --imp ...

  7. djang中orm使用iterator()

    当查询结果有很多对象时,QuerySet的缓存行为会导致使用大量内存.如果你需要对查询结果进行好几次循环,这种缓存是有意义的,但是对于 queryset 只循环一次的情况,缓存就没什么意义了.在这种情 ...

  8. Go语言实现记账本

    使用面向过程思想实现 package main import ( "fmt" ) func main(){ key := "" //设置初始金额 sum := ...

  9. Java链接Mysql数据库整理,尽管很简单,但还是分享出来,希望对那些初级朋友有所帮助!!!

    Java MySQL 连接 Java MySQL 连接 本章节我们为大家介绍 Java 如何使用 使用 JDBC 连接 MySQL 数据库. Java 连接 MySQL 需要驱动包,最新版下载地址为: ...

  10. 【Azure 应用服务】本地Git部署Java项目到App Server,访问无效的原因

    问题描述 在App Server的部署中心配置好本地Git 仓库 并推送 git push azure master 分支代码到服务器时,并未发生错误 ,但是服务异常,无法访问到正确的项目文件,始终打 ...