震惊,双倍经验,依旧是线段树的乘法修改

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
struct sege_tree
{
int l;
int r;
long long lazymul;
long long lazyadd;
long long v;
}tree[*maxn];
int a[maxn];
long long p,ans;
int n,m,opt,l,r;
long long t;
void build(int now,int l,int r)
{
tree[now].l=l;
tree[now].r=r;
tree[now].lazymul=;
tree[now].lazyadd=;
if(l==r)
{
tree[now].v=a[l];
return;
}
else
{
int mid=(l+r)>>;
build(now*,l,mid);
build(now*+,mid+,r);
tree[now].v=tree[now*].v+tree[now*+].v;
}
tree[now].v%=p;
return;
}
void pushdown(int now,int l,int r)//标记下传
{
int mid=(l+r)>>;
tree[now*].v=(tree[now*].v*tree[now].lazymul+tree[now].lazyadd*(mid-l+))%p;
tree[now*+].v=(tree[now*+].v*tree[now].lazymul+tree[now].lazyadd*(r-mid))%p;
tree[now*].lazymul=(tree[now*].lazymul*tree[now].lazymul)%p;
tree[now*+].lazymul=(tree[now*+].lazymul*tree[now].lazymul)%p;
tree[now*].lazyadd=(tree[now*].lazyadd*tree[now].lazymul+tree[now].lazyadd)%p;
tree[now*+].lazyadd=(tree[now*+].lazyadd*tree[now].lazymul+tree[now].lazyadd)%p;
tree[now].lazymul=;
tree[now].lazyadd=;
return;
}
void update1(int now,int stdl,int stdr,int l,int r,long long k)
{
if(l>stdr||r<stdl)
{
return;
}
if(l<=stdl&&r>=stdr)
{
tree[now].v=(tree[now].v*k)%p;
tree[now].lazymul=(tree[now].lazymul*k)%p;
tree[now].lazyadd=(tree[now].lazyadd*k)%p;
return;
}
pushdown(now,stdl,stdr);
int mid=(stdl+stdr)>>;
update1(now*,stdl,mid,l,r,k);
update1(now*+,mid+,stdr,l,r,k);
tree[now].v=(tree[now*].v+tree[now*+].v)%p;
return;
}
void update2(int now,int stdl,int stdr,int l,int r,long long k)
{
if(l>stdr||r<stdl)
{
return;
}
if(l<=stdl&&r>=stdr)
{
tree[now].lazyadd=(tree[now].lazyadd+k)%p;
tree[now].v=(tree[now].v+k*(stdr-stdl+))%p;
return;
}
pushdown(now,stdl,stdr);
int mid=(stdl+stdr)>>;
update2(now*,stdl,mid,l,r,k);
update2(now*+,mid+,stdr,l,r,k);
tree[now].v=(tree[now*].v+tree[now*+].v)%p;
}
long long query(int now,int stdl,int stdr,int l,int r)
{
if(stdl>r||stdr<l)
{
return ;
}
if(stdl>=l&&stdr<=r)
{
return tree[now].v;
}
pushdown(now,stdl,stdr);
int mid=(stdl+stdr)>>;
return (query(now*,stdl,mid,l,r)+query(now*+,mid+,stdr,l,r))%p;
}
int main()
{
cin>>n>>p;
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
}
build(,,n);
cin>>m;
while(m--)
{
scanf("%d",&opt);
if(opt==)
{
cin>>l>>r>>t;
update1(,,n,l,r,t);
}
else if(opt==)
{
cin>>l>>r>>t;
update2(,,n,l,r,t);
}
else
{
cin>>l>>r;
cout<<query(,,n,l,r)<<endl;
}
}
return ;
}

P2023 [AHOI2009]维护序列的更多相关文章

  1. 洛谷 P2023 [AHOI2009]维护序列

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...

  2. 洛谷 P2023 [AHOI2009]维护序列 题解

    P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...

  3. 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)

    洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...

  4. 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解

    题目传送: P3373 [模板]线段树 2  P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...

  5. P2023 [AHOI2009]维护序列 题解(线段树)

    题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...

  6. [洛谷P2023] [AHOI2009]维护序列

    洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...

  7. 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)

    洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...

  8. [P2023][AHOI2009]维护序列(线段树)

    题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2)把数列中的一 ...

  9. 【luogu P2023 [AHOI2009]维护序列】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2023 把P3373改一改直接粘过来就A #include <iostream> #include ...

随机推荐

  1. Chrome浏览器下自动填充的输入框背景

    记录下从张鑫旭老师的微博中看到关于input输入框的属性 1.autocomplete="off" autocomplete 属性规定输入字段是否应该启用自动完成功能 自动完成允许 ...

  2. 在Xunit中使用FsCheck

    目录 编写基于Property-based的单元测试 使用FsCheck编写Property-based测试 在Xunit中使用FsCheck 使用FsCheck编写Model-based测试-待续 ...

  3. idea avtiviti 插件中文乱码

    idea 安转activiti插件后,编辑流程图发现保存后中文乱码,并且idea的字符集(Settings—>Editor—>File Encodings)已经设置为UTF-8,流程图中中 ...

  4. Java基础系列-二进制操作

    原创文章,转载请标注出处:<Java基础系列-二进制操作> 概述 Java源码中涉及到大量的二进制操作,非常的复杂,但非常的快速. Java二进制表示法 首先了解下二进制,二进制是相对十进 ...

  5. GoLang simple-project-demo-02

    GoLang 有很多种数据类型:字符型,整型,浮点型,布尔型.下面是基础例子: package main import "fmt" func main() { fmt.Printl ...

  6. SVN安装和使用(简单版)

    为什么使用SVN? 通常软件的开发需要团队协作开发,每个人负责一个方面,都做完后需要把每个人的代码整合在一起,而每个人的代码方面不同或版本不同就会拖延开发进度对开发项目造成麻烦,如果一个人需要另一个人 ...

  7. Android为TV端助力 Linux命令查看包名类名

    先运行apk 再输入logcat | grep START 查看当前启动apk的包名和类名 adb shell "pm list packages -f | grep com.yulong. ...

  8. Android SingleTask使用注意点

    在ActivityA中,startActivityForResult到ActivityB,其中ActivityB设置为SingleTask. 那么在实际出现的现象为: ActivityA的onActi ...

  9. Hadoop 3.1.2(HA)+Zookeeper3.4.13+Hbase1.4.9(HA)+Hive2.3.4+Spark2.4.0(HA)高可用集群搭建

    目录 目录 1.前言 1.1.什么是 Hadoop? 1.1.1.什么是 YARN? 1.2.什么是 Zookeeper? 1.3.什么是 Hbase? 1.4.什么是 Hive 1.5.什么是 Sp ...

  10. 测者的测试技术手册:Junit单元测试遇见的一个枚举类型的坑(枚举类型详解)

    Enum的简介 枚举类型很早就在计算机语言中存在了,主要被用来将一组相似的值包含进一种类型中,这种类型的名称被定义成独一无二的类型描述符,这就是枚举类型. 在java语言中,枚举类型是一个完整功能的类 ...