COGS.1272.[AHOI2009]行星序列(线段树 区间加、乘、求和)

时间:2022-09-10 19:30:44

题目链接

//注意取模!
#include<cstdio>
#include<cctype>
using namespace std;
const int N=1e5+5; int n,mod,Sum[N<<2],aTag[N<<2],mTag[N<<2]; inline int read()
{
int now=0,f=1;register char c=getchar();
for(;!isdigit(c);c=getchar())
if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=getchar());
return now*f;
} inline void PushUp(int rt)
{
Sum[rt]=(Sum[rt<<1]+Sum[rt<<1|1])%mod;
}
inline void PushDown(int m,int rt)
{
if(mTag[rt]!=1)
{
mTag[rt<<1]=1ll*mTag[rt<<1]*mTag[rt]%mod;
mTag[rt<<1|1]=1ll*mTag[rt<<1|1]*mTag[rt]%mod;
aTag[rt<<1]=1ll*aTag[rt<<1]*mTag[rt]%mod;
aTag[rt<<1|1]=1ll*aTag[rt<<1|1]*mTag[rt]%mod;
Sum[rt<<1]=1ll*Sum[rt<<1]*mTag[rt]%mod;
Sum[rt<<1|1]=1ll*Sum[rt<<1|1]*mTag[rt]%mod;
mTag[rt]=1;
}
if(aTag[rt])
{
aTag[rt<<1]+=aTag[rt], aTag[rt<<1]%=mod;
aTag[rt<<1|1]+=aTag[rt], aTag[rt<<1|1]%=mod;
Sum[rt<<1]=(1ll*Sum[rt<<1]+1ll*(m-(m>>1))*aTag[rt]%mod)%mod;
Sum[rt<<1|1]=(1ll*Sum[rt<<1|1]+1ll*(m>>1)*aTag[rt]%mod)%mod;
aTag[rt]=0;
}
}
void Build(int l,int r,int rt)
{
mTag[rt]=1;
if(l==r)
{
Sum[rt]=read()%mod;
return;
}
int m=l+r>>1;
Build(l,m,rt<<1),Build(m+1,r,rt<<1|1);
PushUp(rt);
}
void Modify_Add(int l,int r,int rt,int L,int R,int v)
{
if(L<=l && r<=R)
{
aTag[rt]+=v;
if(aTag[rt]>=mod) aTag[rt]-=mod;
Sum[rt]=(1ll*Sum[rt]+1ll*v*(r-l+1))%mod;
return;
}
PushDown(r-l+1,rt);
int m=l+r>>1;
if(L<=m) Modify_Add(l,m,rt<<1,L,R,v);
if(m<R) Modify_Add(m+1,r,rt<<1|1,L,R,v);
PushUp(rt);
}
void Modify_Mult(int l,int r,int rt,int L,int R,int v)
{
if(L<=l && r<=R)
{
aTag[rt]=1ll*aTag[rt]*v%mod;
mTag[rt]=1ll*mTag[rt]*v%mod;
Sum[rt]=1ll*Sum[rt]*v%mod;
return;
}
PushDown(r-l+1,rt);
int m=l+r>>1;
if(L<=m) Modify_Mult(l,m,rt<<1,L,R,v);
if(m<R) Modify_Mult(m+1,r,rt<<1|1,L,R,v);
PushUp(rt);
}
int Query_Sum(int l,int r,int rt,int L,int R)
{
if(L<=l && r<=R) return Sum[rt];
PushDown(r-l+1,rt);
int m=l+r>>1;long long res=0;
if(L<=m) res+=Query_Sum(l,m,rt<<1,L,R), res%=mod;
if(m<R) res+=Query_Sum(m+1,r,rt<<1|1,L,R), res%=mod;
return res;
} int main()
{
freopen("seqb.in","r",stdin);
freopen("seqb.out","w",stdout); n=read(),mod=read();
Build(1,n,1);
int m=read(),opt,l,r,v;
while(m--)
{
opt=read(),l=read(),r=read();
if(opt==1)
v=read(), Modify_Mult(1,n,1,l,r,v);
else if(opt==2)
v=read(), Modify_Add(1,n,1,l,r,v);
else
printf("%d\n",Query_Sum(1,n,1,l,r));
} fclose(stdin);fclose(stdout);
return 0;
}

COGS.1272.[AHOI2009]行星序列(线段树 区间加、乘、求和)的更多相关文章

  1. 【codevs2216】行星序列 线段树 区间两异同修改&plus;区间求和&ast;&ast;&ast;&ast;&ast;

    [codevs2216]行星序列 2014年2月22日3501 题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了“小小 ...

  2. 【CF52C】Circular RMQ(线段树区间加减,区间最值)

    给定一个循环数组a0, a1, a2, …, an-1,现在对他们有两个操作: Inc(le, ri, v):表示区间[le, ri]范围的数值增加v Rmq(le, ri):表示询问区间[le, r ...

  3. BZOJ1798&lbrack;Ahoi2009&rsqb;维护序列——线段树

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

  4. Wannafly 挑战赛22 D 整数序列 线段树 区间更新,区间查询

    题目链接:https://www.nowcoder.com/acm/contest/160/D 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K ...

  5. codevs 2216 行星序列 线段树&plus;延迟标记(BZOJ 1798)

    2216 行星序列  时间限制: 2 s  空间限制: 256000 KB     题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始, ...

  6. &lbrack;P2023&rsqb;&lbrack;AHOI2009&rsqb;维护序列&lpar;线段树&rpar;

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

  7. &lbrack;AHOI2009&rsqb;维护序列 &lpar;线段树&rpar;

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

  8. vijos 1659 河蟹王国 线段树区间加、区间查询最大值

    河蟹王国 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 https://vijos.org/p/1659 Description 河蟹王国有一位河蟹国王,他 ...

  9. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

随机推荐

  1. hiho &num;1305 区间求差

    #1305 : 区间求差 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个区间集合 A 和 B,其中集合 A 包含 N 个区间[ A1, A2 ], [ A3,  ...

  2. kali 更新源

    个人收集的kali 更新源: 修改更新源: vim /etc/apt/sources.list 更新源列表包: #apt-get update 更新系统软件: #apt-get upgrade #官方 ...

  3. parseInt和valueOf

    .parseInt和valueOf.split static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行分析. static Integer valueOf( ...

  4. JS - A&ast;寻路

    算法核心 A*估值算法 寻路估值算法有非常多:常用的有广度优先算法,深度优先算法,哈夫曼树等等,游戏中用的比较多的如:A*估值 算法描述 对起点与终点进行横纵坐标的运算 代码实现 start: 起点坐 ...

  5. PHP类自动加载技术

    在我们平时用框架比如laravel时,只要在app目录下的任意路基文件中,如下使用就可以实例化一个对象. $u = new App\Model\User() 我们知道,原生PHP要想实例化一个其他文件 ...

  6. LeetCode(101):对称二叉树

    Easy! 题目描述: 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2, ...

  7. 使用Webuploader大文件分片传输

    背景:50G大文件的HTTP上传至服务器. 好了,根据这个命题,可以开始研究我们怎么做才能把这么大的文件上传成功. 分片上传是肯定的,断点续传也是要有的,进度可视化那就更好了,基于这些,我选择了Web ...

  8. c&sol;c&plus;&plus; 变量作用域

    在程序的不同位置,可能会声明各种不同类型(这里指静态或非静态)的变量.然而,声明的位置不同.类型不同导致每个变量在程序中可以被使用的范围不同.我们把变量在程序中可以使用的有效范围称为变量的作用域. 任 ...

  9. 利用javapns对IOS进行推送

    start package com.jynine.javapns; import java.io.FileNotFoundException; import java.io.IOException; ...

  10. Write a makefile to compile &ast;&period;c and link to executable target

    https://wenku.baidu.com/view/b1ec946027d3240c8447ef9a.html GNU+make中文手册V3.8 <=========From Docs== ...