传送门

线段树基本操作

区间加等差数列,维护区间和。

对于每个区间维护等差数列首项和公差,易证这两个东西都是可合并的,然后使用小学奥数的知识就可以切掉这题。

代码:

#include<bits/stdc++.h>
#define lc (p<<1)
#define rc (p<<1|1)
#define mid (T[p].l+T[p].r>>1)
#define N 300005
#define mod 1000000007
#define ll long long
using namespace std;
inline ll read(){
    ll ans=0;
    char ch=getchar();
    while(!isdigit(ch))ch=getchar();
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans;
}
inline ll write(ll x){
    if(x>9)write(x/10);
    putchar((x%10)^48);
}
int n,m,LL,RR;
ll a[N];
struct Node{int l,r;ll sum,add,fir;}T[N<<2];
inline void pushup(int p){
    T[p].sum=T[lc].sum+T[rc].sum;
    if(T[p].sum>=mod)T[p].sum-=mod;
}
inline void pushadd(int p,ll fir,ll v){
    T[p].add+=v,T[p].fir+=fir;
    if(T[p].add>=mod)T[p].add-=mod;
    if(T[p].fir>=mod)T[p].fir-=mod;
    (T[p].sum+=(T[p].r-T[p].l+1)*(2*fir+(T[p].r-T[p].l)*v)/2)%=mod;
}
inline void pushdown(int p){
    if(!T[p].add)return;
    pushadd(lc,T[p].fir,T[p].add);
    pushadd(rc,T[p].fir+T[p].add*(mid-T[p].l+1),T[p].add);
    T[p].add=T[p].fir=0;
}
inline void build(int p,int l,int r){
    T[p].l=l,T[p].r=r,T[p].add=T[p].fir=T[p].sum=0;
    if(l==r)return;
    build(lc,l,mid),build(rc,mid+1,r);
}
inline void update(int p,int ql,int qr,ll v){
    if(ql>T[p].r||qr<T[p].l)return;
    if(ql<=T[p].l&&T[p].r<=qr)return pushadd(p,v*(T[p].l-LL),v);
    pushdown(p);
    if(qr<=mid)update(lc,ql,qr,v);
    else if(ql>mid)update(rc,ql,qr,v);
    else update(lc,ql,mid,v),update(rc,mid+1,qr,v);
    pushup(p);
}
inline ll 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;
    pushdown(p);
    if(qr<=mid)return query(lc,ql,qr);
    if(ql>mid)return query(rc,ql,qr);
    ll ret=query(lc,ql,mid)+query(rc,mid+1,qr);
    if(ret>=mod)ret-=mod;
    return ret;
}
int main(){
    freopen("segment.in","r",stdin);
    freopen("segment.out","w",stdout);
    n=read(),m=read();
    build(1,1,n);
    while(m--){
        int op=read(),l=LL=read(),r=RR=read();
        if(op==1){ll v=read();update(1,l,r,v);}
        else printf("%lld\n",query(1,l,r));
    }
    return 0;
}

2018.07.30 cogs2632. [HZOI 2016] 数列操作d(线段树)的更多相关文章

  1. 2018.08.04 cogs2633. [HZOI 2016]数列操作e(线段树)

    传送门 支持区间加w(i−ql+1)2" role="presentation" style="position: relative;">w(i ...

  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. 2018.07.27 bzoj3064: Tyvj 1518 CPU监控(线段树)

    传送门 线段树好题. 维护区间加,区间覆盖,区间最大,区间历史最大. 这个东西在国家集训队2016论文集之<区间最值操作与历史最值问题--杭州学军中学 吉如一>中讲的已经很详细了. 简单来 ...

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

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

  6. 2018.07.27 bzoj4695: 最假女选手(线段树)

    传送门 线段树好题 支持区间加,区间取min" role="presentation" style="position: relative;"> ...

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

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

  8. BZOJ_1858_[Scoi2010]序列操作_线段树

    BZOJ_1858_[Scoi2010]序列操作_线段树 Description lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询 ...

  9. 2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树)

    2018宁夏邀请赛 L Continuous Intervals(单调栈+线段树) 传送门:https://nanti.jisuanke.com/t/41296 题意: 给一个数列A 问在数列A中有多 ...

随机推荐

  1. NavitForMySql 破解工具使用

    Navicat 11.0注册机使用教程: 1.右键-管理员权限运行注册机2.选择对应的产品3.点击“补丁”按钮,选择文件4.点击“生成”按钮,生成序列号,并保存下授权文件5.复制序列号,打开软件,在弹 ...

  2. as3 根据鼠标移动方向

    gz 为一个影片 import flash.display.Sprite; stage.addEventListener(MouseEvent.MOUSE_MOVE, onStageMouseMove ...

  3. python中join()函数、list()函数补充的用法

    ---恢复内容开始--- Python join() 方法用于将序列中的元素(必须是str) 以指定的字符 连接生成一个新的字符串. list=[','a','b','c'] print(''.joi ...

  4. Pycharm安装autopep8工具

    参考文当:https://www.cnblogs.com/heenhui2016/p/6802122.html

  5. springboot测试时 SpringApplicationConfiguration注解不能用

    测试时,@SpringApplicationConfiguration(classes = Application.class) 报错,注解不能导入. 在学习spring boot时,按照文档学习时测 ...

  6. EditorGUILayout,GUILayout

    bool active=EditorGUILayout.Toggle("active",_bodyObj.active);//bool类型 b2BodyType type=(b2B ...

  7. (1)shiro简介和第一个demo

    之前一直在用shiro开发,不过只是会使用,并没有深入了解,最近有时间学习了一下,把最近学习所得分享一下. shiro简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授 ...

  8. Python线程优先级队列(Queue)

    Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列 LifoQueue,和优先级队列PriorityQueue.这些队列都实 ...

  9. SQL 2008维护计划不执行的问题

    平台环境; 先是装了WINDOWS 2008,没有升级到AD,再安装了sql2008后再升级了AD. 现在SQL建了几个数据库备份计划,但都提示下面的信息: 日期  2010-4-15 9:36:00 ...

  10. ubuntu中vim的设置

    问题:刚安装的VIM中,backspace不能删除字符,且上下左右箭头没反应. 解决方法: sudo vi  /etc/vim/vimrc.tiny 修改 set compatible为set noc ...