[Luogu 2023] AHOI2009 维护序列
[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 维护序列的更多相关文章
- 洛谷 2023 [AHOI2009]维护序列
洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...
- 【luogu P2023 [AHOI2009]维护序列】 题解
题目链接:https://www.luogu.org/problemnew/show/P2023 把P3373改一改直接粘过来就A #include <iostream> #include ...
- BZOJ_1798_[AHOI2009]维护序列_线段树
BZOJ_1798_[AHOI2009]维护序列_线段树 题意:老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: ( ...
- [洛谷P2023] [AHOI2009]维护序列
洛谷题目链接:[AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列 ...
- 洛谷 P2023 [AHOI2009]维护序列
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中 ...
- 洛谷 P2023 [AHOI2009]维护序列 题解
P2023 [AHOI2009]维护序列 题目描述 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,-,aN .有如下三种操作形式: (1)把数列中 ...
- 洛谷P2023 [AHOI2009]维护序列(线段树区间更新,区间查询)
洛谷P2023 [AHOI2009]维护序列 区间修改 当我们要修改一个区间时,要保证 \(ax+b\) 的形式,即先乘后加的形式.当将区间乘以一个数 \(k\) 时,原来的区间和为 \(ax+b\) ...
- 洛谷P3373 【模板】线段树 2 && P2023 [AHOI2009]维护序列——题解
题目传送: P3373 [模板]线段树 2 P2023 [AHOI2009]维护序列 该题较传统线段树模板相比多了一个区间乘的操作.一提到线段树的区间维护问题,就自然想到了“懒标记”:为了降低时间复 ...
- P2023 [AHOI2009]维护序列 题解(线段树)
题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...
随机推荐
- OOP 1.5 类和对象的基本概念与用法1
1.定义 面向对象的基本特点:抽象.封装.继承.多态 面向对象程序设计方法:将某类客观事物的共同特点归纳出来,形成一个数据结构 抽象:将事物所能进行的行为归纳出来,形成一个个函数,这些函数可以用来操作 ...
- lintcode-512-解码方法
512-解码方法 有一个消息包含A-Z通过以下规则编码 'A' -> 1 'B' -> 2 ... 'Z' -> 26 现在给你一个加密过后的消息,问有几种解码的方式 样例 给你的消 ...
- 解决zabbix使用中文是出现乱码的问题
解决zabbix使用中文是出现乱码的问题 ①:上传windows的simhei.ttf字体到zabbix服务器的/usr/share/zabbix/fonts/目录下 ②:编辑/usr/sh ...
- Spring 学习 5- task 定时任务
Spring-Task 1.这是网上的: 后面是我自己的配置 Spring3.0以后自主开发的定时任务工具,spring task,可以将它比作一个轻量级的Quartz,而且使用起来很简单,除spri ...
- Vue.js 判断对象属性是否存,不存在添加
Vue.set是可以对对象添加属性的,这里item对象添加一个checked属性 //if(typeof item.checked=='undefined'){if(!this.item.checke ...
- JavaScript常用方法(工具类的封装)
日期格式化 function formatDateTime(timeStamp) { var date = new Date(); date.setTime(timeStamp); var y = d ...
- HDU4473_Exam
很考验智商的一个题目,赛后看完别人的题解后秒懂了. 首先定义一个函数f(x)表示a,b的有序组合情况数使得a*b为x的一个约数. 现在给定你一个n,要你求出f(1)+f(2)+……+f(n): 题目智 ...
- C++ Win系统下的调试
有的时候我们找不出错误在哪里,这时候我们需要调试一遍看看到底是哪里出了问题:我们需要分布查看程序运行情况. 这时候我们用到了调试这样一个神奇的东西. 一.基于Dev cpp环境下的调试 Dev cpp ...
- Doves and bombs UVA - 10765(统计割顶所连接的连通块的数量)
题意:给定一个n个点的连通的无向图,一个点的“鸽子值”定义为将它从图中删去后连通块的个数. 求对应的点 和 每个点的“鸽子值” 用一个数组在判断割顶的那个地方 累加标记一下所连接的连通块的数量即可 初 ...
- [AT2369] [agc013_c] Ants on a Circle
题目链接 AtCoder:https://agc013.contest.atcoder.jp/tasks/agc013_c 洛谷:https://www.luogu.org/problemnew/sh ...