2018icpc徐州网络赛-H Ryuji doesn't want to study(线段树)
题意:
有n个数的一个数组a,有两个操作:
1 l r:查询区间[l,r]内$a[l]*(r-l+1)+a[l+1]*(r-l)+a[l+2]*(r-l-1)+\cdots+a[r-1]*2+a[r]$
2 l r:将a[l]修改为r
n<=1e5, a[i]<=1e9
思路:
预处理出前缀和s[i], 则操作1变为查询$s[l]+s[l+1]+..+s[r]-(r-l+1)*s[l-1]$
为防止爆ll(其实也不会爆的)可以在查询操作力就提前减去s[l-1]
坑点来了。。操作2即区间s(l,n)加上r-a[l],由于我们线段树里的一些标记操作,实际上a[i]和s[i]数组并没有变!
所以我们每次需要用s或a数组的时候都要query。。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map>
#include<functional> #define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1
#define lowbit(x) ((x)&(-x)) using namespace std; typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL; const db eps = 1e-;
const int mod = 1e9+;
const int maxn = 1e6+;
const int maxm = 2e6+;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0);
ll sum[maxn<<];
ll s[maxn];
ll a[maxn];
int ii;
void build(int l, int r, int root){
int mid = l + ((r - l) >> );//位运算TMD优先级!
if(l == r){
sum[root] = s[l];
return;
}
build(lson);
build(rson);
sum[root] = sum[lc]+sum[rc];
} ll addv[maxn << ];
//将root的信息传到左右节点上
void pushup(int root){
sum[root] = sum[lc] + sum[rc];
return;
}
void pushdown(int l, int r, int root){
if(addv[root]){
addv[lc] += addv[root];
addv[rc] += addv[root];
int mid = l + ((r-l)>>);
sum[lc] += addv[root]*(mid-l+);
sum[rc] += addv[root]*(r-mid);
addv[root] = ;
}
return;
}
void update(int ql, int qr, ll add, int l, int r, int root){
if(ql <= l && qr >= r){
addv[root] += add;
sum[root] += add*(r-l+);
return;
}
pushdown(l, r, root);
int mid = l + ((r-l)>>);
if(ql <= mid) update(ql, qr, add, lson);
if(qr > mid) update(ql, qr, add, rson);
pushup(root);
return;
}
ll query(int ql, int qr, int l, int r, int root){
if(ql==)return ;
if(ql <= l && qr >= r) return sum[root];//(sum[root]-(ll)((ll)r-l+1)*s[ii-1]);
pushdown(l, r, root);
int mid = l + ((r-l)>>);
ll ans = ;
if(ql <= mid) ans += query(ql, qr, lson);
if(qr > mid) ans += query(ql, qr, rson);
return ans;
}
int main() {
int n, q;
scanf("%d %d", &n, &q);
for(int i =; i <= n ; i++){
scanf("%lld", &a[i]);
}s[] = ;
mem(s, );
for(int i = ; i <= n; i++){
s[i] = a[i]+s[i-];
}
mem(addv, );
mem(sum, );
build(, n, );
while(q--){
int c,l,r;
scanf("%d %d %d", &c, &l, &r);
if(c==){
ii = l;
printf("%lld\n", query(l, r, , n, ) -(r-l+)*query(l-,l-,,n,));
}
else if(c==){
ll tmp = (ll)r-(query(l, l, , n, ) -query(l-, l-, , n, ));
update(l, n, tmp, , n, );
}A
}
return ;
}
/*
5 10
1000000000 1000000000 1000000000 1000000000 1000000000
1 2 4
2 1 0
1 2 4
*/
2018icpc徐州网络赛-H Ryuji doesn't want to study(线段树)的更多相关文章
- 2018徐州网络赛H. Ryuji doesn't want to study
题目链接: https://nanti.jisuanke.com/t/31458 题解: 建立两个树状数组,第一个是,a[1]*n+a[2]*(n-1)....+a[n]*1;第二个是正常的a[1], ...
- ACM-ICPC 2018 徐州赛区网络预赛H Ryuji doesn't want to study(树状数组)题解
题意:给你数组a,有两个操作 1 l r,计算l到r的答案:a[l]×L+a[l+1]×(L−1)+⋯+a[r−1]×2+a[r] (L is the length of [ l, r ] that ...
- ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study(树状数组)
Output For each question, output one line with one integer represent the answer. 样例输入 5 3 1 2 3 4 5 ...
- 计蒜客 31460 - Ryuji doesn't want to study - [线段树][2018ICPC徐州网络预赛H题]
题目链接:https://nanti.jisuanke.com/t/31460 Ryuji is not a good student, and he doesn't want to study. B ...
- ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study (线段树)
Ryuji is not a good student, and he doesn't want to study. But there are n books he should learn, ea ...
- 南昌网络赛 I. Max answer (单调栈 + 线段树)
https://nanti.jisuanke.com/t/38228 题意给你一个序列,对于每个连续子区间,有一个价值,等与这个区间和×区间最小值,求所有子区间的最大价值是多少. 分析:我们先用单调栈 ...
- ACM-ICPC 2018徐州网络赛-H题 Ryuji doesn't want to study
死于update的一个long long写成int了 真的不想写过程了 ******** 树状数组,一个平的一个斜着的,怎么斜都行 题库链接:https://nanti.jisuanke.com/t/ ...
- ACM-ICPC 2018 徐州赛区网络预赛 H. Ryuji doesn't want to study
262144K Ryuji is not a good student, and he doesn't want to study. But there are n books he should ...
- ACM-ICPC 2018 徐州赛区网络预赛 H Ryuji doesn't want to study (树状数组差分)
https://nanti.jisuanke.com/t/31460 题意 两个操作.1:查询区间[l,r]的和,设长度为L=r-l+1, sum=a[l]*L+a[l+1]*(L-1)+...+a[ ...
随机推荐
- docker-管理数据
管理Docker中的数据 默认情况下,在容器内创建的所有文件都存储在可写容器层中.这意味着: 当该容器不再运行时,数据不会持久存在,如果另一个进程需要,则可能很难从容器中获取数据. 容器的可写层紧密耦 ...
- git 汇总
- CentOS7设置静态IP以及windows下ping不通虚拟机、虚拟机ping不通外网解决方案
问题:CentOS7安装完成后默认使用的是动态IP,当你每次重新启动CentOS7后,它的IP地址都不一样.一般我们都是使用远程连接工具连接CentOS7进行操作,如果每次IP都不一样,系统启动后,每 ...
- Go 每日一库之 flag
缘起 我一直在想,有什么方式可以让人比较轻易地保持每日学习,持续输出的状态.写博客是一种方式,但不是每天都有想写的,值得写的东西. 有时候一个技术比较复杂,写博客的时候经常会写着写着发现自己的理解有偏 ...
- 从零开始入门 K8s | GPU 管理和 Device Plugin 工作机制
作者 | 车漾 阿里巴巴高级技术专家 本文整理自<CNCF x Alibaba 云原生技术公开课>第 20 讲. 关注"阿里巴巴云原生"公众号,回复关键词" ...
- “云”端的语雀:用 JavaScript 全栈打造商业级应用
作者| 不四(死马)蚂蚁金服 语雀产品技术负责人 语雀是什么? 语雀是一个专业的云端知识库,面向个人和团队,提供与众不同的知识管理,打造轻松流畅的工作协同,它提供各种格式的在线文档(富文本.表格.设 ...
- 前端Tips#4 - 用 process.hrtime 获取纳秒级的计时精度
本文同步自 JSCON简时空 - 前端Tips 专栏#4,点击阅读 视频讲解 视频地址 文字讲解 如果去测试代码运行的时长,你会选择哪个时间函数? 一般第一时间想到的函数是 Date.now 或 Da ...
- 通过ArcGIS将数据存储到SQL Server2012中
一.软件安装: ARCGIS 10.3安装 SQLserver2012安装 ARCGIS 10.3 安装(注意ARCGIS10.3并不用安装配置ARCSDE). https://wenku.baidu ...
- C++中的四个智能指针
只能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象.智能指针定义在memory头文件中. 1. auto_ptr(C++11已经舍弃) 由new expression获得的对象,在au ...
- [bzoj4872] [洛谷P3750] [六省联考2017] 分手是祝愿
Description Zeit und Raum trennen dich und mich. 时空将你我分开. \(B\) 君在玩一个游戏,这个游戏由 \(n\) 个灯和 \(n\) 个开关组成, ...