首页 > 其他分享 >无聊的数列

无聊的数列

时间:2023-10-11 14:59:22浏览次数:38  
标签:数列 rr 无聊 ll cin int define

P1438 无聊的数列

我们考虑原数列 \(a\) 的差分序列 \(b\)。

  1. \(b_l\leftarrow b_l+k,b_{r+1}\leftarrow b_{r+1}-k\),将区间 \([l,r]\) 内的数增加 \(k\)。

  2. \(l<i\le r,b_i\leftarrow b_i+d,b_{r+1}\leftarrow b_{r+1}+(l-r)d\),将区间 \([l+1,r]\) 内的数增加按照等差数列增长。

  3. 查询 \(\sum_{i=1}^p b_i\)。

用线段树,支持区间加,前缀求和。

特判 \(r+1>n\)。

#include<cstdio>
#include<iostream>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while
#define ls p<<1
#define rs p<<1|1

const int N=100010,M=4*N;
int n,m,l[M],r[M],a[N];
typedef long long ll;
ll v[M],f[M];
void up(int p){
    v[p]=v[ls]+v[rs];
}
void down(int p){
    ll &vv=f[p];
    if(vv){
        v[ls]+=(r[ls]-l[ls]+1)*vv;
        f[ls]+=vv;
        v[rs]+=(r[rs]-l[rs]+1)*vv;
        f[rs]+=vv;
        vv=0;
    }
}
void build(int p,int ll,int rr){
    l[p]=ll,r[p]=rr;
    if(ll==rr){
        v[p]=a[ll]-a[ll-1];
        return;
    }
    int mid=ll+rr>>1;
    build(ls,ll,mid),build(rs,mid+1,rr);
    up(p);
}
void update(int p,int ll,int rr,int va){
    if(ll<=l[p]&&r[p]<=rr){
        v[p]+=(r[p]-l[p]+1ll)*va;
        f[p]+=va;
        return;
    }
    int mid=l[p]+r[p]>>1;
    down(p);
    if(ll<=mid)update(ls,ll,rr,va);
    if(rr>mid)update(rs,ll,rr,va);
    up(p);
}
ll query(int p,int L,int R){
    if(L<=l[p]&&r[p]<=R)return v[p];
    int mid=l[p]+r[p]>>1;
    down(p);
    ll res=0;
    if(L<=mid)res=query(ls,L,R);
    if(R>mid)res+=query(rs,L,R);
    return res;
}
int main(){
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    #endif
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    E(i, n)cin>>a[i];
    build(1,1,n);
    E(i, m){
        int op,l,r,k,d;
        cin>>op;
        if(op==1){
            cin>>l>>r>>k>>d;
            update(1,l,l,k);
            if(l<n)update(1,l+1,r,d);
            if(r<n)update(1,r+1,r+1,(l-r)*d-k);
        }
        else{
            cin>>d;
            cout<<query(1,1,d)<<'\n';
        }
    }
    return 0;
}

标签:数列,rr,无聊,ll,cin,int,define
From: https://www.cnblogs.com/wscqwq/p/17757057.html

相关文章

  • P1667 数列
    原题可能更好的阅读体验区间操作的维护看起来很麻烦,考虑转为点操作的维护。题目中的\(\sum_{i=l}^ra_i\)启发我们用前缀和。那么我们考虑每次操作会对前缀和数组\(s\)造成怎样的变化。设操作区间为\([l,r]\),按照题意,会把\(a_{l-1}\)和\(a_{r+1}\)加上\(S\),\(a_l\)和......
  • 斐波那列数列的讲解过程
    python案例解释的有点不好,多多包含deff1(n):ifn<=2:return1;else:returnf1(n-1)+f1(n-2)#print(f1(6))"""示例1解释一下他是如何等8的,递归不是直接返回值再去传递给自身函数,比如n=4的时候,那么f1(4-1)+f1(4-2)=f1(3)+f1(2)不是......
  • 算法:打印斐波那契数列的前30项(JS)
    打印斐波那契数列的前30项提示:斐波那契数列的前两项是1,其他项是之前两项之和1functionfibonacciIterative(n){2if(n<=0){//如果输入的n小于等于0,表示输入错误,返回错误提示3return"输入错误,请输入正整数";4}5leta=1;//初始化......
  • 装机不再无聊了:Win11首次开机添加“冲浪”小游戏
    为了让大家装机过程不再无聊,微软居然在Win11的开机中加入了一个小游戏。据TheVerge报道,微软SurfaceLaptopStudio2首次开机配置时,如果有需要用户等待的流程,就弹出一个游戏窗口,点击就能直接玩小游戏。这个小游戏很多人并不陌生,早在2020年,微软便向基于Chromium内核的Edge浏览......
  • P3901 数列找不同 【莫队】
    P3901数列找不同莫队:一种离线处理的优化暴力解法,时间复杂度在n*n^(1/2),会被卡常数,但是极为简单推荐视频:莫队算法点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;inta[N];intpos[N];structnode{ intl,r,k;}t[N];strings......
  • 关于斐波那契数列 - 2 (平方的和)
    令斐波那契数列的第\(i\)项定义为\(b_i\)。再令\(f_n=\underset{i=1}{\overset{n}{\sum}}b^2_i\)结论:\(f_n=b_n\timesb_{n+1}\)首先,不难发现,该结论对于\(n=1\)和\(n=2\)一定是成立的\[f_1=1=1\times1\]\[f_2=1+1=2=1\times2\]......
  • 关于斐波那契数列 - 1
    令斐波那契数列第\(i\)个为\(F_i\)\(F_0=0,F_1=1,F_2=1\…\…\)结论:\(F_n^2=F_{n-1}F_{n+1}-(-1)^n\)不难发现,这一结论对于\(n=1\)显然是成立的接下来,运用数学归纳法若该结论对于\(n=k-1\)成立则\(F_{k-1}^2=F_{k-2}F_{k}-(-1)^{k......
  • 「高等数学」1.2 数列的极限
    数列极限的定义数列概念:如果按照某一法则,对每个\(n\in\mathbf{N_{+}}\),对应着一个确定的实数\(x_n\),这些实数按照下标\(n\)从小到大排列得到的一个序列\[x_1,x_2,x_3,\dots,x_n,\dots\]就叫做数列,简记为数列\(\left\{x_n\right\}\).数列中的每一个数......
  • 以下是一个复杂的 C 语言代码示例,展示了如何使用递归函数来计算斐波那契数列: ```c #i
    以下是一个复杂的C语言代码示例,展示了如何使用递归函数来计算斐波那契数列:#include<stdio.h>//递归函数计算斐波那契数列intfibonacci(intn){if(n<=1){returnn;}returnfibonacci(n-1)+fibonacci(n-2);}intmain(){intnum;......
  • 数列
    起因坐车两小时准备来道简单的数列题,然后发现不会做()时隔两个月再回来看看((然后和数列求导放缩的一起写了待我写完政治(虚弱题目设数列{\(a_n\)}的前n项和\(S_n=pn^2+qn\).若\(a_1^2\)+\(a_3^2\)\(\leq\)10,求\(a_3\)+\(a_4\)+\(a_5\)的最大值,并求此时\(p\)、\(q\)的值.解法......