BZOJ 1798 [Ahoi2009]Seq 维护序列seq 线段树

BZOJ 1798 [Ahoi2009]Seq 维护序列seq 线段树

大家好,又见面了,我是全栈君。

题意:链接

方法:线段树

解析:

俩标记sb题

更新乘的时候更新加

完了

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define N 100010
using namespace std;
typedef long long ll;
ll mul[N<<2],sum[N<<2],add[N<<2];
ll n,mod;
int q;
void pushup(int rt)
{
    sum[rt]=(sum[rt<<1]+sum[rt<<1|1])%mod;
}
void pushdown(int rt,ll m)
{
    if(mul[rt]!=1||add[rt]!=0)
    {
        mul[rt<<1]=(mul[rt<<1]*mul[rt])%mod;
        mul[rt<<1|1]=(mul[rt<<1|1]*mul[rt])%mod;
        add[rt<<1]=(mul[rt]*add[rt<<1]+add[rt])%mod;
        add[rt<<1|1]=(mul[rt]*add[rt<<1|1]+add[rt])%mod;
        sum[rt<<1]=(sum[rt<<1]*mul[rt]+(m-(m>>1))*add[rt])%mod;
        sum[rt<<1|1]=(sum[rt<<1|1]*mul[rt]+(m>>1)*add[rt])%mod;
        mul[rt]=1,add[rt]=0;
    }
}
void build(int l,int r,int rt)
{
    mul[rt]=1,sum[rt]=0;
    if(l==r)
    {
        scanf("%I64d",&sum[rt]);
        return;
    }
    int mid=(l+r)>>1;
    build(lson),build(rson);
    pushup(rt);
}
void update_mul(int L,int R,int l,int r,int rt,ll c)
{
    if(L<=l&&r<=R)
    {
        mul[rt]=(mul[rt]*c)%mod;
        add[rt]=(add[rt]*c)%mod;
        sum[rt]=(sum[rt]*c)%mod;
        return;
    }
    pushdown(rt,r-l+1);
    int mid=(l+r)>>1;
    if(L<=mid)update_mul(L,R,lson,c);
    if(R>mid) update_mul(L,R,rson,c);
    pushup(rt);
}
void update_add(int L,int R,int l,int r,int rt,ll c)
{
    if(L<=l&&r<=R)
    {
        add[rt]=(add[rt]+c)%mod;
        sum[rt]=(sum[rt]+(r-l+1)*c)%mod;
        return;
    }
    pushdown(rt,r-l+1);
    int mid=(l+r)>>1;
    if(L<=mid)update_add(L,R,lson,c);
    if(R>mid)update_add(L,R,rson,c);
    pushup(rt);
}
ll query(int L,int R,int l,int r,int rt)
{
    ll ret=0;
    if(L<=l&&r<=R)
    {
        return sum[rt];
    }
    pushdown(rt,r-l+1);
    int mid=(l+r)>>1;
    if(L<=mid)ret=(ret+query(L,R,lson))%mod;
    if(R>mid)ret=(ret+query(L,R,rson))%mod;
    pushup(rt);
    return ret;
}
int main()
{
    scanf("%lld%lld",&n,&mod);
    build(1,n,1);
    scanf("%d",&q);
    while(q--)
    {
        int opt;scanf("%d",&opt);
        int x,y;scanf("%d%d",&x,&y);
        ll z;
        switch(opt)
        {
            case 1:scanf("%lld",&z);update_mul(x,y,1,n,1,z);break;
            case 2:scanf("%lld",&z);update_add(x,y,1,n,1,z);break;
            case 3:printf("%lld\n",query(x,y,1,n,1));break;
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115363.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • QTreeView实现圆角样式

    QTreeView实现圆角样式QTreeView实现圆角样式在QTreeView等继承于QAbstractItemView表格中,定制表格样式通常都是通过设置项目代理(ItemDelegate)来实现。在这种实现方法中,每个项目(Item)基本上是孤立的,无法有效判断己身周遭环境。如果以此种方法来实现圆角样式,行首或许还能通过方法intQModelindex::column()来判断是否属于第一列来断定,然而行尾难道还要通过QAbstractItemModelQModelindex::*model()获取模型(Model)之后再

    2022年6月6日
  • 文章序号规范[通俗易懂]

    文章序号规范[通俗易懂]文章的层次顺序应依次是:第一层“一、”<黑体>(作为小标题时句尾无标点);第二层“(一)”<楷体>(作为小标题时句尾标点可有可无);第三层“1.”<仿宋&g

    2022年8月4日
  • C#TextBox密码框

    C#TextBox密码框WebForm中的TextBox控件作为密码框(如图1)时,需要把TextMode属性设置为Password(如图2),而且要在Page_Load中使用Attributes赋值。protectedvoidPage_Load(objectsender,EventArgse){ReaderPassword.Attributes[“value”]=ReaderPassword.Text;}学习自:https://blog.c

    2022年7月25日
  • Microsoft® Windows® 恶意软件删除工具

    Microsoft® Windows® 恶意软件删除工具 偶然间发现XP自带的恶意软件删除工具: MicrosoftWindowsMaliciousSoftwareRemovalTool 位置:C:/WINDOWS/system32/MRT.exe 或直接在“开始–运行”中输入mrt.exe运行。 可以到www.microsoft.com更新最新版本的程序。                       

    2022年6月24日
  • pycharm替换的快捷键_想要快速编写代码,你得熟悉这些快捷键!

    pycharm替换的快捷键_想要快速编写代码,你得熟悉这些快捷键!PyCharm常用快捷键导语工欲善其事必先利其器,想要快速编写代码,就必须要先熟悉快捷键,Python开发利器Pycharm常用快捷键如下,相信有了这些快捷键,你编写代码会事半功倍。1编辑Shift+F1外部文档Shift+Enter另起一行Alt+Enter快速修正Alt+Insert自动生成代码Ctrl+O重新方法Ctrl+Alt+T选中Ct…

    2022年8月26日
  • 永磁同步电机矢量控制(四)——simulink仿真搭建

    永磁同步电机矢量控制(四)——simulink仿真搭建由于是初学,对于simulink很多地方不熟悉,在此记下整个仿真搭建的选择元件的细节。1电机模型的选择及参数设置永磁同步电机的英文缩写为PMSM,全称PermanentMagnetSynchronousMachine。在library内搜索Permanent即可找到它。Numberofphase电机相数Back…

    2022年6月4日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号