P1438 无聊的数列 (线段树)
题目链接
Solution
直接维护一个差分的线段树就好了.
其中线段树的节点代表 \(r\) 比 \(l\) 多多少.
Code
#include<bits/stdc++.h>
#define ll long long
#define mid (l+r)/2
using namespace std;
const int maxn=100008;
ll sgm[maxn*4],lazy[maxn*4];
ll n,w[maxn],m;
void push_down(int node,int l,int r)
{
sgm[node*2]+=lazy[node]*(mid-l+1);
sgm[node*2+1]+=lazy[node]*(r-mid);
lazy[node*2]+=lazy[node];
lazy[node*2+1]+=lazy[node];
lazy[node]=0;
}
void build(int node,int l,int r)
{
if(l==r){sgm[node]=w[l]-w[l-1];return;}
build(node*2,l,mid);
build(node*2+1,mid+1,r);
sgm[node]=sgm[node*2]+sgm[node*2+1];
}
void change(int node,int l,int r,int L,int R,ll v)
{
if(l>R||r<L)return;
if(l>=L&&r<=R)
{lazy[node]+=v; sgm[node]+=(r-l+1)*v;return;}
push_down(node,l,r);
change(node*2,l,mid,L,R,v);
change(node*2+1,mid+1,r,L,R,v);
sgm[node]=sgm[node*2]+sgm[node*2+1];
}
ll query(int node,int l,int r,int L,int R)
{
if(l>R||r<L)return 0;
if(l>=L&&r<=R)
return sgm[node];
push_down(node,l,r);
return query(node*2,l,mid,L,R)+query(node*2+1,mid+1,r,L,R);
}
ll read()
{
char ch=getchar(); ll f=1,w=0;
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
return f*w;
}
int main()
{
n=read(); m=read();
for(int i=1;i<=n;i++)
w[i]=read();
build(1,1,n);
while(m--)
{
ll opt=read();
ll x,y,v,d;
if(opt==2)
x=read(),
cout<<query(1,1,n,1,x)<<endl;
else
{
x=read(); y=read();
v=read(); d=read();
change(1,1,n,x,x,v);
change(1,1,n,x+1,y,d);
change(1,1,n,y+1,y+1,-(v+(y-x)*d));
}
}
return 0;
}
P1438 无聊的数列 (线段树)的更多相关文章
- P1438 无聊的数列 (差分+线段树)
题目 P1438 无聊的数列 解析: 先考虑修改,用差分的基本思想,左端点加上首项\(k\),修改区间\((l,r]\)内每个数的差分数组都加上公差\(d\),最后的\(r+1\)再减去\(k+(r- ...
- [luogu P1438] 无聊的数列
[luogu P1438] 无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个 ...
- Luogu P1438无聊的数列
洛谷 P1438无聊的数列 题目链接 点这里! 题目描述 维护一个数列\(a_i\),支持两种操作: 给出一个长度等于 \(r-l+1\)的等差数列,首项为\(k\) 公差为\(d\) 并将它对应加到 ...
- P1438 无聊的数列
P1438 无聊的数列 链接 分析: 等差数列可加,首项相加,公差相加. 代码: #include<cstdio> #include<algorithm> #include&l ...
- 洛谷P1438 无聊的数列 [zkw线段树]
题目传送门 无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]} ...
- LUOGU P1438 无聊的数列 (差分+线段树)
传送门 解题思路 区间加等差数列+单点询问,用差分+线段树解决,线段树里维护的就是差分数组,区间加等差数列相当于在差分序列中l位置处+首项的值,r+1位置处-末项的值,中间加公差的值,然后单点询问就相 ...
- 洛谷P1438 无聊的数列 (线段树+差分)
变了个花样,在l~r区间加上一个等差数列,等差数列的显著特点就是公差d,我们容易想到用线段树维护差分数组,在l位置加上k,在l+1~r位置加上d,最后在r+1位置减去k+(l-r)*d,这样就是在差分 ...
- 洛谷 P1438 无聊的数列
题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]},支持两种操作: 1.1 ...
- [洛谷P1438] 无聊的数列
题目类型:差分,线段树 传送门:>Here< 题意:给出一个数列,每次给一个区间对应的加上一个等差数列,并询问某一个元素目前的值. 解题思路 所谓差分,我个人的理解就是用\(O(1)\)的 ...
随机推荐
- 徒手教你使用zookeeper编写服务发现
zookeeper是一个强一致[不严格]的分布式数据库,由多个节点共同组成一个分布式集群,挂掉任意一个节点,数据库仍然可以正常工作,客户端无感知故障切换.客户端向任意一个节点写入数据,其它节点可以立即 ...
- [bzoj]1930 pacman吃豆豆
Description 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪,只能向右走或者向上走,他 ...
- 【上下界网络流 费用流】bzoj2055: 80人环游世界
EK费用流居然写错了…… Description 想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么 一个80人的团 ...
- ASP( VBScript ) 解析 JSON
<script language="jscript" runat="server"> Array.prototype.get = function( ...
- oop中 限制文件类型和大小
<?php /** * Created by IntelliJ IDEA. * User: jiabinwang * Date: 7/5/18 * Time: 8:46 PM */ namesp ...
- Primer C++第五版 读书笔记(一)
Primer C++第五版 读书笔记(一) (如有侵权请通知本人,将第一时间删文) 1.1-2.2 章节 关于C++变量初始化: 初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义 ...
- build_mem_type_table
该函数设置mem_types结构体数组,结构体定义如下: struct mem_type { unsigned int prot_pte; //二级页表属性 unsigned int prot ...
- how to setting a i2c driver
How to instantiate I2C devices============================== Unlike PCI or USB devices, I2C devices ...
- P3369 【模板】普通平衡树 Treap
P3369 [模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询 ...
- HDU 3667 费用流 拆边 Transportation
题意: 有N个城市,M条有向道路,要从1号城市运送K个货物到N号城市. 每条有向道路<u, v>运送费用和运送量的平方成正比,系数为ai 而且每条路最多运送Ci个货物,求最小费用. 分析: ...