[Luogu 2023] AHOI2009 维护序列

<题目链接>


恕我冒昧这和线段树模板二有个琴梨区别?

#include <cstdio>
int n,m;
long long p;
class SegmentTree
{
private:
struct Node
{
int left,right;
long long v,mul,add;
Node *c[2];
Node(int l,int r):left(l),right(r),mul(1LL),add(0LL)
{
if(l==r)
{
scanf("%lld",&v);
return;
}
int mid=l+r>>1;
c[0]=new Node(l,mid);
c[1]=new Node(mid+1,r);
PushUp();
}
~Node(void)
{
if(c[0]!=nullptr)
delete c[0];
if(c[1]!=nullptr)
delete c[1];
}
long long Size(void)
{
return (long long)(right-left+1);
}
long long Value(bool p)
{
return c[p]!=nullptr ? c[p]->v : 0;
}
void Modify(long long _mul,long long _add)
{
v=(v*_mul+Size()*_add)%p;
mul=mul*_mul%p;
add=(add*_mul+_add)%p;
}
void MulModify(long long k)
{
v=v*k%p;
mul=mul*k%p;
add=add*k%p;
}
void AddModify(long long k)
{
v=(v+Size()*k)%p;
add=(add+k)%p;
}
void PushUp(void)
{
v=(Value(0)+Value(1))%p;
}
void PushDown(void)
{
if(c[0]!=nullptr)
c[0]->Modify(mul,add);
if(c[1]!=nullptr)
c[1]->Modify(mul,add);
mul=1,add=0;
}
void Mul(int l,int r,long long k)
{
if(l==left && r==right)
{
MulModify(k);
return;
}
PushDown();
int mid=left+right>>1;
if(r<=mid)
c[0]->Mul(l,r,k);
else if(l>mid)
c[1]->Mul(l,r,k);
else
{
c[0]->Mul(l,mid,k);
c[1]->Mul(mid+1,r,k);
}
PushUp();
}
void Add(int l,int r,long long k)
{
if(l==left && r==right)
{
AddModify(k);
return;
}
PushDown();
int mid=left+right>>1;
if(r<=mid)
c[0]->Add(l,r,k);
else if(l>mid)
c[1]->Add(l,r,k);
else
{
c[0]->Add(l,mid,k);
c[1]->Add(mid+1,r,k);
}
PushUp();
}
long long Sum(int l,int r)
{
if(l==left && r==right)
return v;
PushDown();
int mid=left+right>>1;
if(r<=mid)
return c[0]->Sum(l,r);
else if(l>mid)
return c[1]->Sum(l,r);
else
return (c[0]->Sum(l,mid)+c[1]->Sum(mid+1,r))%p;
}
}*root;
public:
SegmentTree(int n):root(new Node(1,n)){}
~SegmentTree(void)
{
delete root;
}
void Mul(int l,int r)
{
long long k;
scanf("%lld",&k);
root->Mul(l,r,k);
}
void Add(int l,int r)
{
long long k;
scanf("%lld",&k);
root->Add(l,r,k);
}
void Sum(int l,int r)
{
printf("%lld\n",root->Sum(l,r));
}
};
int main(int argc,char** argv)
{
scanf("%d %lld",&n,&p);
SegmentTree *T=new SegmentTree(n);
scanf("%d",&m);
for(int i=1,opt,x,y;i<=m;++i)
{
scanf("%d %d %d",&opt,&x,&y);
switch(opt)
{
case 1:
T->Mul(x,y);
break;
case 2:
T->Add(x,y);
break;
case 3:
T->Sum(x,y);
break;
}
}
delete T;
return 0;
}

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

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

    洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...

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

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

  3. BZOJ_1798_[AHOI2009]维护序列_线段树

    BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 第一次c++团队合作作业期间第一篇随笔

    分析了自己分到的任务,我的理解是这样的:首先要生成程序主框架,在主框架中进行地图的描绘.我应该是先进行地图的拼接,把建筑物和地面都拼接好.然后再在地图上显示出英雄和小兵.同时还要在主框架中分析了自己分 ...

  2. Python学习 - 入门篇2(更新中)

    前言 学习渠道:慕课网:Python进阶 记录原因:我只是想边上课边做笔记而已,呵呵哒 食用提示:教程环境基于Python 2.x,有些内容在Python 3.x中已经改变 函数式编程 定义:一种抽象 ...

  3. alpha冲刺(事后诸葛亮)

    [设想和目标] Q1:我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? "小葵日记"是为了解决18-30岁年轻用户在记录生活时希望得到一美体验友好 ...

  4. phpdisk 盲注 &前台任意用户登录

    代码审核 文件 plugins\phpdisk_client\passport.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 $str ...

  5. Tomcat指定JDK路径

    一.应用实例 一般情况下一台服务器只跑一个业务,那么就直接配置一套环境,设置好Java环境变量即可.某些时候一台服务器上会安装多个业务,而且各个业务需要的JDK版本各不相同,或者为了使业务独立开来,需 ...

  6. linux的一些机制Signal, Fork,

    signal(SIGCHLD, SignalHandler); 注册软中断,对应的api close(socket); ret=fork(): 父进程,返回子进程的pid. 子进程返回0, 出错返回& ...

  7. 使用salt-cloud创建虚拟机

    salt-cloud也是基于openstack来做的,它可以支持多种云的使用.比如:Aliyun.Azure.DigitalOcean.EC2.Google Compute Engine.HP Clo ...

  8. 第100天:CSS3中animation动画详解

    CSS3属性中有关于制作动画的三个属性:Transform,Transition,Animation: 一.Animation定义动画 CSS3的Animation是由“keyframes”这个属性来 ...

  9. 【bzoj4372】烁烁的游戏 动态点分治+线段树

    题目描述 给一颗n个节点的树,边权均为1,初始点权均为0,m次操作:Q x:询问x的点权.M x d w:将树上与节点x距离不超过d的节点的点权均加上w. 输入 第一行两个正整数:n,m接下来的n-1 ...

  10. shell脚本学习—正则表达式

    正则表达式概念.特点 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”, 这个“规则字符串”用来表达对字符串的一种过滤辑. 给定一个 ...