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)
上一篇 2022年2月5日 下午1:00
下一篇 2022年2月5日 下午2:00


相关推荐

  • datagrid激活码【中文破解版】「建议收藏」

    (datagrid激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月26日
    46
  • osip状态机分析「建议收藏」

    osip状态机分析「建议收藏」OSIP的核心是系统状态机,在不同情况下,系统处于不同的状态,在某一状态下当系统发生某一个动作后(如接受或者发送了消息),状态机做相应的跳转。的状态机在不同的状态下,对某一动作的响应也是不一样的。由于SIP的复杂性,为了降低代码实现难度,也为了能够保证代码的模块化,Osip把整个SIP的实现分成了四个状态机,分别是:      (1)ICT(带invit事件的out处理)

    2022年6月15日
    27
  • Java中DAO层、Service层和Controller层的区别

    Java中DAO层、Service层和Controller层的区别DAO 层 DAO 层叫数据访问层 全称为 dataaccessob 属于一种比较底层 比较基础的操作 具体到对于某个表的增删改查 也就是说某个 DAO 一定是和数据库的某一张表一一对应的 其中封装了增删改查基本操作 建议 DAO 只做原子操作 增删改查 Service 层 Service 层叫服务层 被称为服务 粗略的理解就是对一个或多个 DAO 进行的再次封装 封装成一个服务 所以这里也就不

    2026年3月19日
    2
  • 【基于VUE的实时聊天(私聊)】

    【基于VUE的实时聊天(私聊)】对于一个大厅实时聊天我们都看惯不惯了 花了一天的时间结合 nodejs websocket 和 vue 做了一个实时私聊的插件 当然代码方面有待改善 nbsp 现在简要讲解一下我的思路一 规范传输我的项目经验不多 但我觉得每个项目都要现设立一些规则 如果随心所欲的可能会导致自己跳到自己的坑 我们先设定项目的 json 传输规定 获取 uid type welcome my id

    2026年3月26日
    2
  • type="button" ,"submit" 的区别(转)

    type="button" ,"submit" 的区别(转)

    2021年9月13日
    63
  • 【引用】回发或回调参数无效。在配置中使用 <pages enableEventValidation=”true”/>(转载)…「建议收藏」

    【引用】回发或回调参数无效。在配置中使用 <pages enableEventValidation=”true”/>(转载)…「建议收藏」回发或回调参数无效。在配置中使用<pagesenableEventValidation=”true”/>或在页面中使用<%@PageEnableEventValidation=”true”%>启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用ClientScriptM…

    2022年7月24日
    9

发表回复

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

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