[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. 软工实践-Alpha 冲刺 (7/10)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 已经解决登录注册等基本功能的界面. 完成非功能的主界面制作 ...

  2. BETA阶段第一天

    1.提供当天站立式会议照片一张 2.每个人的工作 今天完成工作 林一心 服务器调试 张杭镖 数据库调整 赵意 前端设计 江鹭涛 前端设计 3.发布项目燃尽图 4.每日每人总结 林一心:服务器端的配置不 ...

  3. Websphere Application Server 环境配置与应用部署最佳实践

    在发布一个运行于 WebSphere Application Server 的 J2EE 应用之前,对服务器进行配置和部署应用是必不可少的一个过程,这个过程是非常复杂的.WAS 为用户提供了可视化的管 ...

  4. TCP系列51—拥塞控制—14、TLP、ER与拥塞控制

    一.概述 这里的重点是介绍TLP.ER与拥塞控制并不是介绍TLP和ER本身,因此TLP和ER的详细内容请翻前文. 在TLP与拥塞控制的交互中有几个点需要注意 1.TLP触发的重传后,TCP仍然处于Op ...

  5. java——线性表接口实现

    线性表是存储顺序牌类的数据时最常用的数据结构. 实现线性表有两种方式.第一种是使用数组存储线性表的元素.数组是动态创建的.超过数组的容量时,创建一个 新的更大的数组,并且将当前数组中的元素复制到新建的 ...

  6. JavaScript数组去重的四种方法

    今天,洗澡的想一个有趣的问题,使用js给数组去重,我想了四种方法,虽然今天的任务没有完成,5555: 不多说,po代码: //方法一:简单循环去重    Array.prototype.unique1 ...

  7. LoadRunner函数大全之中文解释

    LoadRunner函数大全之中文解释

  8. 为何php curl post模式发送数据速度变慢了?我来说说原因

    事例: 今天要向一台服务器上传文件,原版是curl的get模式,现在改用了post模式,按照原本的思想,代码如下 <?php $post['c'] = 'config'; $post['t'] ...

  9. 使用vue-cli3新建一个项目,并写好基本配置

    1. 使用vue-cli3新建项目: https://cli.vuejs.org/zh/guide/creating-a-project.html 注意,我这里用gitbash不好选择选项,我就用了基 ...

  10. 深入解析ThreadLocal类

    先了解一下ThreadLocal类提供的几个方法: public T get() { } public void set(T value) { } public void remove() { } p ...