洛谷P1438 无聊的数列 [zkw线段树]
题目传送门
无聊的数列
题目背景
无聊的YYB总喜欢搞出一些正常人无法搞出的东西。有一天,无聊的YYB想出了一道无聊的题:无聊的数列。。。(K峰:这题不是傻X题吗)
题目描述
维护一个数列{a[i]},支持两种操作:
1、1 L R K D:给出一个长度等于R-L+1的等差数列,首项为K,公差为D,并将它对应加到a[L]~a[R]的每一个数上。即:令a[L]=a[L]+K,a[L+1]=a[L+1]+K+D,
a[L+2]=a[L+2]+K+2D……a[R]=a[R]+K+(R-L)D。
2、2 P:询问序列的第P个数的值a[P]。
输入输出格式
输入格式:
第一行两个整数数n,m,表示数列长度和操作个数。
第二行n个整数,第i个数表示a[i](i=1,2,3…,n)。
接下来的m行,表示m个操作,有两种形式:
1 L R K D
2 P 字母意义见描述(L≤R)。
输出格式:
对于每个询问,输出答案,每个答案占一行。
输入输出样例
5 2
1 2 3 4 5
1 2 4 1 2
2 3
6
说明
数据规模:
0≤n,m≤100000
|a[i]|,|K|,|D|≤200
Hint:
有没有巧妙的做法?
分析:
刚学完$zkw$线段树找道题来练练手。
关于这题,如果直接上一般的区间修改+单点查询的话很难做,但是如果我们换个思路,运用差分的思想就会变得很容易了。
我们把线段树维护的内容变成原数列的差分数列,也就是说$seg[i]=a[i]-a[i-1]$,那么单点查询的操作就变成了区间查询。但是修改操作呢?
不难想到,因为是等差数列,所以差分数组的修改值实际上就是等差数列的公差。所以修改区间$[l,r]$时,先单点修改$l$,修改值为等差数列首项,再单点修改$r+1$,修改值为$-(K+(r-l)*D)$(自己想想为什么),最后再修改区间$[l+1,r]$,修改值为公差。就这样了。
写的$zkw$线段树感觉还是常数有点大,总共跑了$335ms$,别人跑的快的只用$150ms$,不过至少比普通线段树快多了。
Code:
//It is made by HolseLee on 5th Sep 2018
//Luogu.org P1438
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std; typedef long long ll;
const int N=1e5+;
int n,m,maxn;
ll a[N],seg[N<<],sign[N<<]; template<typename re>
inline void read(re &x)
{
x=; char ch=getchar(); bool flag=false;
while( ch<'' || ch>'' ) {
if( ch=='-' ) flag=true;
ch=getchar();
}
while( ch>='' && ch<='' ) {
x=(x<<)+(x<<)+ch-'';
ch=getchar();
}
flag ? x*=(-) : ;
} inline void modify(int pos,ll x)
{
for(pos+=maxn; pos; pos>>=) seg[pos]+=x;
} inline void update(int l,int r,ll x)
{
ll lum=,rum=,num=;
for(l=l+maxn-,r=r+maxn+; l^r^; l>>=,r>>=,num<<=) {
seg[l]+=x*lum;
seg[r]+=x*rum;
if( ~l& ) sign[l^]+=x, seg[l^]+=x*num, lum+=num;
if( r& ) sign[r^]+=x, seg[r^]+=x*num, rum+=num;
}
for(; l; l>>=,r>>=) {
seg[l]+=x*lum;
seg[r]+=x*rum;
}
} inline ll quary(int l,int r)
{
ll ret=,lum=,rum=,num=;
for(l=l+maxn-,r=r+maxn+; l^r^; l>>=,r>>=,num<<=) {
if( sign[l] ) ret+=sign[l]*lum;
if( sign[r] ) ret+=sign[r]*rum;
if( ~l& ) ret+=seg[l^], lum+=num;
if( r& ) ret+=seg[r^], rum+=num;
}
for(; l; l>>=,r>>=)
ret+=sign[l]*lum, ret+=sign[r]*rum;
return ret;
} int main()
{
read(n); read(m); maxn=;
for(; maxn<=n+; maxn<<=);
for(int i=; i<=n; ++i) {
read(a[i]); seg[maxn+i]=a[i]-a[i-];
}
for(int i=maxn-; i>=; --i) seg[i]=seg[i<<]+seg[i<<|];
int opt,l,r; ll x,y;
for(int i=; i<=m; ++i) {
read(opt);
if( opt== ) {
read(l), read(r), read(x), read(y);
modify(l,x); modify(r+,-(x+(ll)(r-l)*y));
update(l+,r,y);
} else {
read(x);
printf("%lld\n",quary(,x));
}
}
return ;
}
洛谷P1438 无聊的数列 [zkw线段树]的更多相关文章
- 洛谷P1438 无聊的数列 (线段树+差分)
变了个花样,在l~r区间加上一个等差数列,等差数列的显著特点就是公差d,我们容易想到用线段树维护差分数组,在l位置加上k,在l+1~r位置加上d,最后在r+1位置减去k+(l-r)*d,这样就是在差分 ...
- P1438 无聊的数列 (差分+线段树)
题目 P1438 无聊的数列 解析: 先考虑修改,用差分的基本思想,左端点加上首项\(k\),修改区间\((l,r]\)内每个数的差分数组都加上公差\(d\),最后的\(r+1\)再减去\(k+(r- ...
- 洛谷P2505||bzoj2750 [HAOI2012]道路 && zkw线段树
https://www.luogu.org/problemnew/show/P2505 https://www.lydsy.com/JudgeOnline/problem.php?id=2750 神奇 ...
- 洛谷 P1438 无聊的数列
题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]},支持两种操作: 1.1 ...
- [洛谷P1438] 无聊的数列
题目类型:差分,线段树 传送门:>Here< 题意:给出一个数列,每次给一个区间对应的加上一个等差数列,并询问某一个元素目前的值. 解题思路 所谓差分,我个人的理解就是用\(O(1)\)的 ...
- 洛谷 P1438 无聊的数列 题解
原题链接 首先,我们考虑用差分解决问题. 用 \(x_i\) 表示原数列,\(a_i = x_i - x_{i-1}\) 那么,先普及一下差分: 如果我们只需要维护区间加值,单点求值的话,你会发现两个 ...
- LUOGU P1438 无聊的数列 (差分+线段树)
传送门 解题思路 区间加等差数列+单点询问,用差分+线段树解决,线段树里维护的就是差分数组,区间加等差数列相当于在差分序列中l位置处+首项的值,r+1位置处-末项的值,中间加公差的值,然后单点询问就相 ...
- 洛谷P3434 [POI2006]KRA-The Disks(线段树)
洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...
- 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)
LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...
随机推荐
- java格式化字符串,在指定位置插入指定字符串,兼容中英文以及特殊字符,例如:换行,用于解决生成pdf换行问题等问题
本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处. http://www.cnblogs.com/king-xg/p/6370890.html 如果觉得对您有 ...
- OpenCV---色彩空间(一)
颜色空间:用三种或者更多特征来指定颜色的方法,被称为颜色空间或者颜色模型 1.RGB(OpenCV中为BGR): 一幅图像由三个独立的图像平面或者通道构成:红.蓝.绿(以及可选项:透明度alpha通道 ...
- Spring 多数据源 @Transactional 注解事务管理
在 Spring,MyBatis 下两个数据源,通过 @Transactional 注解 配置简单的事务管理 spring-mybatis.xml <!--******************* ...
- WebAPI IE8、IE9 跨域问题
关于WebAPI跨域的问题,网上已经很多了,以下方案可以解决很多跨域问题,但是都不支持IE8.IE9浏览器,JSONP也只能支持Get请求 通过dll配置 Install-Package Micros ...
- codeblocks 设置代码自动补全
熟悉使用一些开发类IDE的朋友对代码自动补全一定印象深刻,如Visual studio,eclipse等,我们在程序中定义的那一个个超长的变量函数名只需打出几个字母就可自动补全,但是在codebloc ...
- SSM框架使用-wrong
mybatis手册 1. mybatis 绑定错误 如果出现: org.apache.ibatis.binding.BindingException: Invalid bound statement ...
- PAT 1009. Triple Inversions (35) 数状数组
Given a list of N integers A1, A2, A3,...AN, there's a famous problem to count the number of inversi ...
- 如何发布一个自定义Node.js模块到NPM(详细步骤,附Git使用方法)
咱们闲话不多说,直接开始! 由于我从没有使用过MAC,所以我不保证本文中介绍的操作与MAC一致. 文章开始我先假定各位已经在window全局安装了Node.js,下面开始进行详细步骤介绍: 本文本着, ...
- winform MDI子窗口闪动问题(本人测试100%有效解决闪屏问题)
将下面的代码随便放到主窗体的任何一个地方 protected override CreateParams CreateParams //解决MDI闪屏 { get { CreateParams cp ...
- 【BZOJ】4872: [Shoi2017]分手是祝愿 期望DP
[题意]给定n盏灯的01状态,操作第 i 盏灯会将所有编号为 i 的约数的灯取反.每次随机操作一盏灯直至当前状态能够在k步内全灭为止(然后直接灭),求期望步数.n,k<=10^5. [算法]期望 ...