SCUT - 85 - 香料 = 线段树
时间:2019-10-16
本文章向大家介绍SCUT - 85 - 香料 = 线段树,主要包括SCUT - 85 - 香料 = 线段树使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一个区间修改线段树的模板题,不过挺有意思的,每个格子有一个单位价格,要把一段区间的总价格算出来,每次update一个区间的重量。
发现总价格实际上是满足结合律的。直接上线段树。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define lt ls, l, m
#define rt rs, m + 1, r
#define ls (o<<1)
#define rs (o<<1|1)
const ll mod = 1008610010;
const int MAXM = 100000 + 5;
ll a[MAXM];
ll st[MAXM * 4], p[MAXM * 4], lazy[MAXM * 4];
inline void PushUp(int o) {
st[o] = (st[ls] + st[rs]) % mod;
}
inline void PushDown(int o, int l, int r) {
if(lazy[o]) {
lazy[ls] = (lazy[ls] + lazy[o]) % mod;
lazy[rs] = (lazy[rs] + lazy[o]) % mod;
int m = l + r >> 1;
st[ls] = (st[ls] + lazy[o] * p[ls] % mod) % mod;
st[rs] = (st[rs] + lazy[o] * p[rs] % mod) % mod;
lazy[o] = 0;
}
}
void Build(int o, int l, int r) {
if(l == r) {
p[o] = a[l];
st[o] = 0;
} else {
int m = l + r >> 1;
Build(lt);
Build(rt);
p[o] = (p[ls] + p[rs]) % mod;
}
lazy[o] = 0;
}
void Update(int o, int l, int r, int ql, int qr, ll v) {
if(ql <= l && r <= qr) {
lazy[o] = (lazy[o] + v) % mod;
st[o] = (st[o] + v * p[o] % mod) % mod;
return;
} else {
PushDown(o, l, r);
int m = l + r >> 1;
if(ql <= m)
Update(lt, ql, qr, v);
if(qr >= m + 1)
Update(rt, ql, qr, v);
PushUp(o);
}
}
ll Query(int o, int l, int r, int ql, int qr) {
if(ql <= l && r <= qr) {
return st[o];
} else {
PushDown(o, l, r);
int m = l + r >> 1;
ll res = 0;
if(ql <= m)
res = res + Query(lt, ql, qr);
if(qr >= m + 1)
res = res + Query(rt, ql, qr);
return res % mod;
}
}
int main() {
#ifdef Yinku
freopen("Yinku.in", "r", stdin);
#endif // Yinku
int n, m;
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
Build(1, 1, n);
scanf("%d", &m);
int op, x, y, k;
while(m--) {
scanf("%d%d%d", &op, &x, &y);
if(op == 1) {
scanf("%d", &k);
Update(1, 1, n, x, y, k);
} else {
printf("%lld\n", Query(1, 1, n, x, y) % mod);
}
}
return 0;
}
原文地址:https://www.cnblogs.com/Inko/p/11688683.html
- Ryu和OpenStack集成
- react+redux+webpack教程2
- C/C++ Development using Visual Studio Code, CMake and LLDB
- TensorFlow-10-基于 LSTM 建立一个语言模型
- jquery及原生javascript对jsonp解决跨域问题实例详解
- css负边距之详解
- Python进阶教程(三)
- Python进阶教程(二)
- Python进阶教程(一)
- TensorFlow-11-策略网络
- 对比requirejs更好的理解seajs
- 深入浅出Logistic Regression之二分类
- 如何自动生成文本摘要
- Kaggle 神器 xgboost
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 自定义Processor组件
- Android开发第三讲,布局管理器
- Android 开发第四讲 TextView的基本使用
- Android 开发第五讲 学习Button了解Button属性
- Android开发第六讲EditText 编辑框
- Android 开发第七讲 RadioButton (单选按钮)
- linux内核写时复制机制源代码解读
- akka-grpc - 应用案例
- Python从入门到大师教程 | 二、搭建Jupyter Notebook环境
- 收益3583万?我是如何快速统计「李子柒」YouTube频道视频累计播放量并计算收益的
- mysql优化篇:where中的like和=的性能分析
- 557. 反转字符串中的单词 III
- 剑指 Offer 03. 数组中重复的数字
- 841. 钥匙和房间
- 一篇文章了解python常见内置异常报错