2018.10.22 cogs2471. [EZOI 2016]源氏的数学课(线段树)
传送门
线段树入门操作。
直接把题目给的 ( r − i + 1 ) ∗ a [ i ] (r-i+1)*a[i] (r−i+1)∗a[i]拆开变成 ( r + 1 ) ∗ 1 ∗ a [ i ] − i ∗ a [ i ] (r+1)*1*a[i]-i*a[i] (r+1)∗1∗a[i]−i∗a[i]因此只需要维护 ∑ i = l r a [ i ] \sum _{i=l} ^r a[i] ∑i=lra[i]和 ∑ i = l r i ∗ a [ i ] \sum _{i=l} ^r i*a[i] ∑i=lri∗a[i]就行了。
代码:
#include<bits/stdc++.h>
#define N 100005
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
#define ll long long
using namespace std;
inline ll read(){ll ans=0,w=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();return ans*w;
}
int n,m;
ll sum[N],a[N];
struct Node{int l,r;ll sum1,sum2;}T[N<<1];
inline void pushup(int p){T[p].sum1=T[lc].sum1+T[rc].sum1,T[p].sum2=T[lc].sum2+T[rc].sum2;}
inline void build(int p,int l,int r){T[p].l=l,T[p].r=r;if(l==r){T[p].sum1=a[l],T[p].sum2=T[p].l*a[l];return;}build(lc,l,mid),build(rc,mid+1,r),pushup(p);
}
inline void update(int p,int k,ll v){if(T[p].l==T[p].r){T[p].sum1+=v;T[p].sum2+=T[p].l*v;return;}if(k<=mid)update(lc,k,v);else update(rc,k,v); pushup(p);
}
inline pair<ll,ll>query(int p,int ql,int qr){if(ql<=T[p].l&&T[p].r<=qr)return make_pair(T[p].sum1,T[p].sum2);if(qr<=mid)return query(lc,ql,qr);if(ql>mid)return query(rc,ql,qr);pair<ll,ll>ret1=query(lc,ql,mid),ret2=query(rc,mid+1,qr);return make_pair(ret1.first+ret2.first,ret1.second+ret2.second);
}
int main(){freopen("overwatch.in","r",stdin);freopen("overwatch.out","w",stdout);n=read(),m=read();for(int i=1;i<=n;++i)sum[i]=sum[i-1]+i,a[i]=read();build(1,1,n);while(m--){int op=read(),x=read();if(op==1)update(1,x,read());else{int y=read();pair<ll,ll>ret=query(1,x,y);ll ans=ret.first*(y+1)-ret.second;printf("%lld\n",ans);}}return 0;
}
2018.10.22 cogs2471. [EZOI 2016]源氏的数学课(线段树)相关推荐
- 2471. [EZOI 2016]源氏的数学课
2471. [EZOI 2016]源氏的数学课 [题目描述] 给定一个数列,有如下两种操作: 1:将其中的一个数加上s(s为整数) 2:给定区间[l,r],求al* (r-l+1) + al-1*(r ...
- [EZOI 2016]源氏的数学课
题目链接:传送门 求 带单点修改 把式子拆开 求 ∑ i = l r a i ∗ r − ∑ i = l r a i ∗ i + ∑ i = l r a i \sum_{i=l}^{r} a_{i}* ...
- 2018.08.04 cogs2633. [HZOI 2016]数列操作e(线段树)
传送门 支持区间加w(i−ql+1)2w(i−ql+1)2,将这个式子直接展开变成区间加wi2+w(ql−1)2+2w(1−ql)iwi2+w(ql−1)2+2w(1−ql)i,再选i做主元,会变成w ...
- Bzoj 4408: [Fjoi 2016]神秘数 可持久化线段树,神题
4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 177 Solved: 128 [Submit][Stat ...
- COCI 2015/2016 PROKLETNIK(单调栈+线段树)
COCI 2015/2016 PROKLETNIK 题目大意 给定序列A1..NA_{1..N}A1..N,分别求出QQQ组询问区间[L,R][L,R][L,R]中最长的连续子序列Al..rA_{l ...
- 2018南京网络赛 G. Lpl and Energy-saving Lamps (线段树非递归实现)
线段树非递归实现.点修改下的区间查询. 注意预处理的时候要把一到十万的都进行处理一遍,因为输入的月份不一定在月份的个数之内. #include <iostream> #include &l ...
- 【一周头条盘点】中国软件网(2018.10.22~2018.10.26)
每一个企业级应用的人都置顶了中国软件网 中国软件网为你带来最新鲜的行业干货 一周热点 微软发布"创纪录"的Q1财报:营收291亿美元 净利同比增34% 10月25日,微软发布了20 ...
- 【NOIP2018模拟赛2018.10.22】pets
与cards同天考的题,反正很恶心人.. 首先分组,我将一队放进a,二队放进b,然后队伍中n^2建边,若 i 打得过 j 就连一条有向边,将 j 的入度+1,然后topo序判环. 可以看出如果有环就说 ...
- 2018.10.22 20:10
没人关心你具体到底吃了哪些东西,怎么吃的,虾是怎么剥皮的.骨头是怎么啃得,只需要讲清楚"吃饱"这个目的就好. 不要一味的埋头耕地,也好时常抬头看看田埂. 一直埋头耕地,你就是一个搬 ...
最新文章
- C++乘法的int越界问题
- 模式设计概述:代理者模式
- 财务需要学python-财务人要学Python吗?
- 九阴真经 第十五层--node.js 第2天
- 算法笔记_096:蓝桥杯练习 算法提高 求最大值(Java)
- 前端程序员也需要知道进程和线程
- nltk——文本分类
- 效果器的使用技巧-与调音台的无缝连接
- android 属性动画源码分析
- python实现CRAPS赌博游戏。
- win10更改C盘下的用户文件夹名
- 百度爬虫robots.txt文件规范
- Script Identification of Multi-Script Documents: A Survey
- 基于libevent的http客户端,并可以请求https
- Windows安装Gitea
- Tomcat 在IE中下载rar文件直接以乱码方式打开解决方案
- 基于服务器搭建部署的疫情动态地图
- Python使用FTP上传文件
- 单片机学习和应用百问大全
- axure低保真原型_如何在Google表格中创建低保真原型
热门文章
- 苹果正在三星电视上安装iTunes;科技部鼓励民营企业参与国家科技 雷锋早报...
- Input dataset is not organized (height = 1) Input dataset is not organized (height = 1)......
- 为什么互联网大厂企业都宁愿花20K+招应届生,都不愿意涨薪5K来留住老员工?
- 用html和css制作静态小米网页(二)
- 超过2t硬盘分区_磁盘超过2T无法用fdisk分区的问题
- realsense系列相机ros内外参标定2022.11.20
- 心情随笔20180718
- HDU 6186 CS Course(线段树区间操作)
- WordPress插件-Display Posts
- python中数字应该用什么表示,python中可以表示的最小数字是多少?