【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;
}
}
【Atcoder F - Cumulative Cumulative Cumulative Sum】线段树的更多相关文章
- 【题解】 AtCoder ARC 076 F - Exhausted? (霍尔定理+线段树)
题面 题目大意: 给你\(m\)张椅子,排成一行,告诉你\(n\)个人,每个人可以坐的座位为\([1,l]\bigcup[r,m]\),为了让所有人坐下,问至少还要加多少张椅子. Solution: ...
- AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)
题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i ...
- Codeforces Round #463 F. Escape Through Leaf (李超线段树合并)
听说正解是啥 set启发式合并+维护凸包+二分 根本不会啊 , 只会 李超线段树合并 啦 ... 题意 给你一颗有 \(n\) 个点的树 , 每个节点有两个权值 \(a_i, b_i\) . 从 \( ...
- 【BZOJ3638】Cf172 k-Maximum Subsequence Sum 线段树区间合并(模拟费用流)
[BZOJ3638]Cf172 k-Maximum Subsequence Sum Description 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交 ...
- CF280D k-Maximum Subsequence Sum(线段树)
在做这题时我一开始把\(tag\)写入了结构体 #include <iostream> #include <cstdio> #include <cstring> # ...
- Codeforces Round #271 (Div. 2) F. Ant colony (RMQ or 线段树)
题目链接:http://codeforces.com/contest/474/problem/F 题意简而言之就是问你区间l到r之间有多少个数能整除区间内除了这个数的其他的数,然后区间长度减去数的个数 ...
- BZOJ 3155: Preprefix sum( 线段树 )
刷刷水题... 前缀和的前缀和...显然树状数组可以写...然而我不会, 只能写线段树了 把改变成加, 然后线段树维护前缀和, 某点p加, 会影响前缀和pre(x)(p≤x≤n), 对[p, n]这段 ...
- Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)
题目地址:http://codeforces.com/contest/474/problem/F 由题意可知,最后能够留下来的一定是区间最小gcd. 那就转化成了该区间内与区间最小gcd数相等的个数. ...
- ZOJ 4009 And Another Data Structure Problem(ZOJ Monthly, March 2018 Problem F,发现循环节 + 线段树 + 永久标记)
题目链接 ZOJ Monthly, March 2018 Problem F 题意很明确 这个模数很奇妙,在$[0, mod)$的所有数满足任意一个数立方$48$次对$mod$取模之后会回到本身. ...
- 校赛F 比比谁更快(线段树)
http://acm.cug.edu.cn/JudgeOnline/problem.php?cid=1153&pid=5 题意:给你一个字符串,各两个操作: ch=0,[l,r]降序 ch=1 ...
随机推荐
- .NET 云原生架构师训练营(模块二 基础巩固 配置)--学习笔记
2.2.3 核心模块--配置 IConfiguration Options ASP.NET Core 中的配置:https://docs.microsoft.com/zh-cn/aspnet/core ...
- [Elasticsearch] Elasticsearch 启动访问报错问题
Elasticsearch 启动访问报错问题 产生的问题与解决方案 环境:Windows 10 ES 版本:8.12.0 现象: 双击 elasticsearch.bat 文件启动后,访问 http: ...
- Laravel入坑指南(4)——数据库(Mysql)
来来来,新的一节出炉了.这一节大家一起了解,Laravel如何对Mysql进行CURD. 我们回顾一下,PHP操作Mysql无非就是通过五个要素:host(地址).username(用户名).pass ...
- docker 常用命令 快捷命令
一.查询节点 docker ps -a 二.docker重启停止 systemctl restart docker systemctl stop docker docker restart * 三.一 ...
- std::shared_ptr 线程安全方面的思考
一直惦记着 std::shared_ptr 线程安全的问题,看了些文章后,又怕过段时间忘记了,遂记录下来 std::shared_ptr 的线程安全问题主要有以下两种: 引用计数的加减操作是否线程安全 ...
- 【Android逆向】制作Youpk脱壳机,完成对NCSearch的脱壳操作
1. 拉去youpk 代码或镜像,自行编译构建 youpk 代码地址 https://github.com/youlor/unpacker 2. 执行 adb reboot bootloader 3. ...
- 硬件开发笔记(六): 硬件开发基本流程,制作一个USB转RS232的模块(五):创建USB封装库并关联原理图元器件
前言 有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的.为了更好的表述封装设计过程,本文描述了一个创建USB封装,创建DIP焊盘 ...
- 第一百零九篇:基本数据类型(String类型)
好家伙, 本篇内容为<JS高级程序设计>第三章学习笔记 1.String类型 字符串类型是最常用的几个基本类型之一 字符串可以使用双引号,单引号以及反引号(键盘左Tab上面那个)标示 ...
- Java纯手打web服务器(三)
概要:考虑到上一篇中的request和response对象的安全性,不允许servlt程序员在service方法中把servletRequest和servletResponse对象进行强转reques ...
- Java 对象数组题目 + 改进(封装方法)
1 /** 2 * 3 * @Description 4 * @author Bytezero·zhenglei! Email:420498246@qq.com 5 * @version 6 * @d ...