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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HibernateTemplate的使用[通俗易懂]

    HibernateTemplate的使用[通俗易懂]HibernateTemplate提供了非常多的常用方法来完成基本的操作,比如增加、删除、修改及查询等操作,Spring2.0更增加对命名SQL查询的支持,也增加对分页的支持。大部分情况下,使用Hibernate的常规用法,就可完成大多数DAO对象的CRUD操作。  下面是HibernateTemplate的常用方法。  delete(Objecten

    2022年6月29日
    28
  • 网络基础:网络IP 、子网掩码 、路由器 、DNS知识分享

    网络基础:网络IP 、子网掩码 、路由器 、DNS知识分享

    2020年11月14日
    208
  • 2018年SCI论文–整合GEO数据挖掘完整复现 七 :DAVID在线工具进行KEGG富集分析

    文章目录论文地址DAVID官网获得KEGG富集分析结果气泡图cytoscape软件绘制代谢通路网络图networkdatatabledata论文地址DAVID官网KEGG富集分析和GO富集分析方法一致,具体步骤见我上篇文章DAVID在线工具进行GO富集分析,这里主要展示可视化结果获得KEGG富集分析结果1.输入文件为所有差异表达基因列表2.选择GO富集分析结果时,我们点击“Path…

    2022年4月6日
    185
  • 怎么修改WiFi频段_wifi5g与2.4g怎么切换

    怎么修改WiFi频段_wifi5g与2.4g怎么切换在网络应用中对带宽要求较高的在线视频、高清点播等业务,如果使用5GHz频段进行传输,无线连接稳定性和传输速速率将更有保障,在这里以TP-LINK双频无线路由器作为演示,教你如何设置使用5GHz频段无线路由器。下面以TL-WDR4310为例介绍双频无线路由器在5GHz频段下的设置步骤。步骤一:在浏览器的地址栏上输入“192.168.1.1”打开路由器管理界面,输入用户名和密码(默认均为“admin”…

    2022年10月20日
    0
  • amp什么意思啊_登录 Login

    amp什么意思啊_登录 Login关于注册页面和登录页面的业务流程form表单中确定action提交地址method确定提交的方法》写出相对应的Servlet,假如接受的数据不多,那么用Stringusername=

    2022年8月6日
    3
  • opencv 特征值_直方图阈值图像分割

    opencv 特征值_直方图阈值图像分割1、简单阈值设置像素值高于阈值时,给这个像素赋予一个新值(可能是白色),否则我们给它赋予另外一种颜色(也许是黑色)。这个函数就是cv2.threshhold()。这个函数的第一个参数就是原图像,原

    2022年8月1日
    7

发表回复

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

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