传送门

支持区间加w(i−ql+1)2" role="presentation" style="position: relative;">w(i−ql+1)2w(i−ql+1)2,将这个式子直接展开变成区间加wi2+w(ql−1)2+2w(1−ql)i" role="presentation" style="position: relative;">wi2+w(ql−1)2+2w(1−ql)iwi2+w(ql−1)2+2w(1−ql)i,再选i做主元,会变成wi2+(2w−2w∗ql)i+w(ql−1)2" role="presentation" style="position: relative;">wi2+(2w−2w∗ql)i+w(ql−1)2wi2+(2w−2w∗ql)i+w(ql−1)2,发现就是区间加了一个二次函数,分别对二次函数每一项维护一个区间和就行了。

代码:

#include<bits/stdc++.h>
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
#define N 100005
#define ull unsigned long long
using namespace std;
inline ull read(){
    ull ans=0,w=1;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
int n,m;
ull ans=0,cal[N][2];
struct Node{int l,r;ull sum[3],add[3];}T[N<<2];
inline void build(int p,int l,int r){
    T[p].l=l,T[p].r=r;
    if(l==r)return;
    build(lc,l,mid),build(rc,mid+1,r);
}
inline void pushup(int p){
    T[p].sum[0]=T[lc].sum[0]+T[rc].sum[0];
    T[p].sum[1]=T[lc].sum[1]+T[rc].sum[1];
    T[p].sum[2]=T[lc].sum[2]+T[rc].sum[2];
}
inline void pushnow(int p,ull w1,ull w2,ull w3){
    T[p].sum[0]+=(T[p].r-T[p].l+1)*w1;
    T[p].sum[1]+=(cal[T[p].r][0]-cal[T[p].l-1][0])*w2;
    T[p].sum[2]+=(cal[T[p].r][1]-cal[T[p].l-1][1])*w3;
    T[p].add[0]+=w1,T[p].add[1]+=w2,T[p].add[2]+=w3;
}
inline void pushdown(int p){
    pushnow(lc,T[p].add[0],T[p].add[1],T[p].add[2]);
    pushnow(rc,T[p].add[0],T[p].add[1],T[p].add[2]);
    T[p].add[0]=T[p].add[1]=T[p].add[2]=0;
}
inline void update(int p,int ql,int qr,ull pos,ull v){
    if(ql>T[p].r||qr<T[p].l)return;
    if(ql<=T[p].l&&T[p].r<=qr)return pushnow(p,(ull)(pos-1)*(pos-1)*v,(ull)2*(1-pos)*v,(ull)v);
    pushdown(p);
    if(qr<=mid)update(lc,ql,qr,pos,v);
    else if(ql>mid)update(rc,ql,qr,pos,v);
    else update(lc,ql,mid,pos,v),update(rc,mid+1,qr,pos,v);
    pushup(p);
}
inline ull query(int p,int ql,int qr){
    if(ql>T[p].r||qr<T[p].l)return 0;
    if(ql<=T[p].l&&T[p].r<=qr)return T[p].sum[0]+T[p].sum[1]+T[p].sum[2];
    pushdown(p);
    if(qr<=mid)return query(lc,ql,qr);
    if(ql>mid)return query(rc,ql,qr);
    return query(lc,ql,mid)+query(rc,mid+1,qr);
}
int main(){
    freopen("rneaty.in","r",stdin);
    freopen("rneaty.out","w",stdout);
    n=read(),m=read();
    for(ull i=1;i<=n;++i)cal[i][0]=cal[i-1][0]+i,cal[i][1]=cal[i-1][1]+i*i;
    build(1,1,n);
    while(m--){
        int op=read(),L=read(),R=read();
        if(op==1){ull v=read();update(1,L,R,(ull)L,v);}
        else ans^=query(1,L,R);
    }
    printf("%llu",ans);
    return 0;
}

2018.08.04 cogs2633. [HZOI 2016]数列操作e(线段树)的更多相关文章

  1. 2018.07.30 cogs2632. [HZOI 2016] 数列操作d(线段树)

    传送门 线段树基本操作 区间加等差数列,维护区间和. 对于每个区间维护等差数列首项和公差,易证这两个东西都是可合并的,然后使用小学奥数的知识就可以切掉这题. 代码: #include<bits/ ...

  2. cogs 2632. [HZOI 2016] 数列操作d

    2632. [HZOI 2016] 数列操作d ★★★   输入文件:segment.in   输出文件:segment.out   简单对比时间限制:3 s   内存限制:512 MB [题目描述] ...

  3. 2018.07.31cogs2964. 数列操作η(线段树)

    传送门 线段树基本操作. 给出一个排列b,有一个初始值都为0的数组a,维护区间加1,区间统计区间∑(ai/bi)" role="presentation" style=& ...

  4. [cogs2638]数列操作ψ(双标记线段树)

    题目大意:给定一个数列a,你需要支持的操作:区间and,区间or,询问区间最大值 解题关键: 1.双标记线段树,注意优先级(超时) 当涉及多重标记时,定义出标记的优先级,修改操作时用优先级高(先下放) ...

  5. COGS 2633. [HZOI 2016] 数列操作e

    [题目描述] 一个长度为n的序列,一开始序列数的权值都是0,有m次操作 支持两种操作, 1 L R x,给区间[L,R]内,第一个数加x,第二个数加2^2⋅x,第三个数加3^2⋅x...第R-L+1个 ...

  6. 2018.08.04 spoj TTM to the moon(主席树)

    spoj传送门 vjudge传送门 主席树板子题. 支持历史版本的区间和,区间和,区间修改和时光倒流. 其中新奇一点的也只有区间修改了,这个东西直接标记永久化就行了. 如果想下传标记的话也行,需要在p ...

  7. 2018.08.01 BZOJ4552: [Tjoi2016&Heoi2016]排序(二分+线段树)

    传送门 线段树简单题. 二分答案+线段树排序. 实际上就是二分答案mid" role="presentation" style="position: relat ...

  8. 新手C#string类常用函数的学习2018.08.04

    ToLower()用于将字符串变为小写,注意字符串的不可变特性,需要重新赋值给另一个字符串变量. s = s.ToLower();//字符串具有不可变性,转换后需要重新赋值,不可仅有s.ToLower ...

  9. 新手C#int.Parse、int.TryParse的学习2018.08.04

    int.Parse()用于将字符串转换为32为int类型,但是在遇到非数字或者类似1.545这种小数的时候会报错,后来采用了int.TryParse,这个在转换后会判断是否可以正常转换,若不能,会返回 ...

随机推荐

  1. background-image,background-repeat, background-position 实现点赞图片(一个图片的多次使用)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. mime设置

    ie9对mime有特殊要求,必须要有type才可以. 如果出现css的mime类型不支持.则没有加 type="css/text" 查看本机的mime支持: regedit > ...

  3. ServiceLoader实现原理

    在java中根据一个子类获取其父类或接口信息非常方便,但是根据一个接口获取该接口的所有实现类却没那么容易. 有一种比较笨的办法就是扫描classpath所有的class与jar包中的class,然后用 ...

  4. Android中app卡顿原因分析示例

    在知乎回答了一个“为什么微博的app在iPhone比Android上流畅”的问题.后面部分是一个典型的动画卡顿的性能分析过程,因此帖在这里.有编程问题可以在这里交流.知乎链接. =========== ...

  5. plot绘图

    plot绘图 坐标系图(折线图) 折线图用于显示随时间或有序类别的变化趋势 plt.plot(x,y,format_string,**kwargs) y:Y轴数据,列表或数组,必选 x:X轴数据,列表 ...

  6. mybatis3 @SelectProvider

    mybatis3中增加了使用注解来配置Mapper的新特性,本篇文章主要介绍其中几个@Provider的使用方式,他们是:@SelectProvider.@UpdateProvider.@Insert ...

  7. 运行Maven项目时出现invalid LOC header (bad signature)

    为Maven小白,今天这问题困扰了我好久,经过多次在网上查询,终于找到了原因.明明一个小问题却耗费很多时间,着实不应该,所以必须记录一下. 报错信息如下:   对话框: 控制台: <span s ...

  8. 精确除法:from __future__ import division

    在python中做除法运算,使用1/2运行结果为0,为取结果的整数部分 如果用1.0/2或1/2.0运行结果为0.5,按照浮点数的位数取结果 但是实际应用中我们需要取除法的精确结果,我们就可以在运行前 ...

  9. oracle,PL/SQL新建表

    创建用户 -- Create the user create user U_HQ_JAVA default tablespace USERS temporary tablespace TEMP pro ...

  10. RWIGS and LORBIT (1)

    RWIGS and LORBIT  是两个与局域态密度或投影态密度相关的参数:RWIGS指的是Wigner–Seitz radius,LORBIT前面的LO指的就是Local.         这两个 ...