博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LUOGU P1438 无聊的数列 (差分+线段树)
阅读量:4329 次
发布时间:2019-06-06

本文共 1263 字,大约阅读时间需要 4 分钟。

 

解题思路

区间加等差数列+单点询问,用差分+线段树解决,线段树里维护的就是差分数组,区间加等差数列相当于在差分序列中l位置处+首项的值,r+1位置处-末项的值,中间加公差的值,然后单点询问就相当于在差分数列中求前缀和。

 

 

#include
#include
#include
#include
using namespace std;const int MAXN = 100005;typedef long long LL;inline int rd(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();} while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?x:-x;}int n,m,a[MAXN],c[MAXN];LL sum[MAXN<<2],lazy[MAXN<<2];void pushdown(int x,int ln,int rn){ lazy[x<<1]+=lazy[x];lazy[x<<1|1]+=lazy[x]; sum[x<<1]+=ln*lazy[x];sum[x<<1|1]+=rn*lazy[x]; lazy[x]=0;}void build(int x,int l,int r){ if(l==r){sum[x]=c[l];return;} int mid=(l+r)>>1; build(x<<1,l,mid);build(x<<1|1,mid+1,r); sum[x]=sum[x<<1]+sum[x<<1|1];}void update(int x,int l,int r,int L,int R,int w){ if(L<=l && r<=R) {sum[x]+=(r-l+1)*w;lazy[x]+=w;return;} int mid=(l+r)>>1;if(lazy[x]) pushdown(x,mid-l+1,r-mid); if(L<=mid) update(x<<1,l,mid,L,R,w); if(mid
>1;LL ret=0;if(lazy[x]) pushdown(x,mid-l+1,r-mid); if(L<=mid) ret+=query(x<<1,l,mid,L,R); if(mid
View Code

 

转载于:https://www.cnblogs.com/sdfzsyq/p/9723890.html

你可能感兴趣的文章
ultraedit激活
查看>>
总结(6)--- python基础知识点小结(细全)
查看>>
亿级曝光品牌视频的幕后设定
查看>>
ARPA
查看>>
JSP开发模式
查看>>
我的Android进阶之旅------&gt;Android嵌入图像InsetDrawable的使用方法
查看>>
Detours信息泄漏漏洞
查看>>
win32使用拖放文件
查看>>
Android 动态显示和隐藏软键盘
查看>>
raid5什么意思?怎样做raid5?raid5 几块硬盘?
查看>>
【转】how can i build fast
查看>>
null?对象?异常?到底应该如何返回错误信息
查看>>
django登录验证码操作
查看>>
(简单)华为Nova青春 WAS-AL00的USB调试模式在哪里开启的流程
查看>>
图论知识,博客
查看>>
[原创]一篇无关技术的小日记(仅作暂存)
查看>>
20145303刘俊谦 Exp7 网络欺诈技术防范
查看>>
原生和jQuery的ajax用法
查看>>
iOS开发播放文本
查看>>
20145202马超《java》实验5
查看>>