【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 ...
随机推荐
- Delphi 安装ICS
下载完成后解压到你的指写目录! 1.在library里加入ICS->Delphi->Vc32目录. 2.从File->Open中打开ICS->Delphi->Vc32-& ...
- Python 爬虫方法总结
实现爬虫的套路 准备URL 准备start_url url地址规律不明显,总数不确定 通过代码提取下一页的url 通过xpath提取 寻找url地址,部分参数在当前的响应中(比如当前页码数和总页码数在 ...
- MYSQL 1 DAY
目录 MySQL 1.sql.DB.DBMS分别是什么,他们之间的关系? 2.什么是表? 3.学习MySQL主要还是学习通用的SQL语句,那么SQL语句包括增删改查,SQL语句怎么分类呢? 4.导入数 ...
- Map与WeakMap
Map与WeakMap Map对象用来保存键值对,并且能够记住键的原始插入顺序,任何对象或者原始值都可以作为键或者是值. WeakMap对象同样用来保存键值对,对于键是弱引用的而且必须为一个对象,而值 ...
- C. Sum of Substrings题解
C. Sum of Substrings 题目大概意思,给你一个01串,求和最小,其中和是该串所有相邻字符所组成的十进制数的和. 如:0110, sum = 01 + 11 + 10 = 22. 通过 ...
- 具备有效期的localStorage存储
具备有效期的localStorage存储 类方式 // 具备有效期的localStorage存储-类方式. class LocalStorageWrapper { // 存储数据到localStora ...
- 列表相关函数,深浅拷贝,字典相关函数,集合相关操作及文件操作---day08
1.列表的相关函数 append() 功能:向列表的末尾添加新的元素 格式:列表.append(值) 返回值:None 注意:新添加的值在列表的末尾,该函数直接操作原有列表 insert() 功能:在 ...
- RabbitMQ和RPC
消息队列 消息队列中间件 (Message Queue Middleware,简称 MQ) 是指利用高效可靠的消息传递机制进行与平台无关的数据交流,它可以在分布式环境下扩展进程间的数据通信,并基于数据 ...
- 【LeetCode二叉树#02】二叉树层序遍历(广度优先搜索),十合一专题
二叉树层序遍历(广度优先搜索) 102 二叉树的层序遍历 力扣题目链接(opens new window) 给你一个二叉树,请你返回其按 层序遍历 得到的节点值. (即逐层地,从左到右访问所有节点). ...
- ABP模块签入GitLab后自动打包并推送到ProGet
# 1.添加一个名为下划线的解决方案文件夹 # 2.把解决方案根目录下的几个必要的文件添加到上述文件夹下 # 3.修改NuGet.Config,添加私有NuGet服务器的网址,并配置用户名和密码: A ...