2216 行星序列

 时间限制: 2 s
 空间限制: 256000 KB
 
 
题目描述 Description

“神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了“小小宇航员夏令营”,在这里小可可不仅学到了丰富的宇航知识,还参与解决了一些模拟飞行中发现的问题,今天指导老师交给他一个任务,在这次模拟飞行的路线上有N个行星,暂且称它们为一个行星序列,并将他们从1至n标号,在宇宙未知力量的作用下这N个行星的质量是不断变化的,所以他们对飞船产生的引力也会不断变化,小可可的任务就是在飞行途中计算这个行星序列中某段行星的质量和,以便能及时修正飞船的飞行线路,最终到达目的地,行星序列质量变化有两种形式:

1,行星序列中某一段行星的质量全部乘以一个值

2,行星序列中某一段行星的质量全部加上一个值

由于行星的质量和很大,所以求出某段行星的质量和后只要输出这个值模P的结果即可,小可可被这个任务难住了,聪明的你能够帮他完成这个任务吗?

输入描述 Input Description

第一行两个整数N和P(1<=p<=1000000000);

第二行含有N个非负整数,从左到右依次为a1,a2,…………,an(0<=ai<=100000000,1<=i<=n),其中ai表示第i个行星的质量:

第三行有一个整数m,表示模拟行星质量变化以及求质量和等操作的总次数。从第四行开始每行描述一个操作,输入的操作有以下三种形式:

操作1:1 t g c 表示把所有满足t<=i<=g的行星质量ai改为ai*c

操作2:2 t g c 表示把所有满足t<=i<=g的行星质量ai改为ai+c

操作3:3 t g 表示输出所有满足t<=i<=g的ai的和模p的值

其中:1<=t<=g<=N,0<=c<=10000000

注:同一行相邻的两数之间用一个空格隔开,每行开头和末尾没有多余空格

输出描述 Output Description

对每个操作3,按照它在输入中出现的顺序,依次一行输出一个整数表示所求行星质量和

样例输入 Sample Input
7 43
1 2 3 4 5 6 7
5
1 2 5 5
3 2 4
2 3 7 9
3 1 3
3 4 7
样例输出 Sample Output
2
35
8
数据范围及提示 Data Size & Hint

100%的数据中,M,N<=100000

40%的数据中,M,N<=10000

思路:看了别人的题解(x + add) * mul = x * mul + add * mul;

#include<bits/stdc++.h>
using namespace std;
#define ll long long
//#define mod 1000000007
#define pi (4*atan(1.0))
const int N=4e3+,M=1e6+,inf=1e9+;
ll sum[M];
ll flagj[M];
ll flagc[M];
ll mul(ll x,ll y,ll mod)
{
x%=mod;
y%=mod;
return (x*y)%mod;
}
void pushdown(ll pos,ll len,ll mod)
{
ll lson=pos*;
ll rson=pos*+;
flagj[lson]=(flagj[lson]*flagc[pos]+flagj[pos])%mod;
flagj[rson]=(flagj[rson]*flagc[pos]+flagj[pos])%mod;
flagc[lson]=(flagc[pos]*flagc[lson])%mod;
flagc[rson]=(flagc[pos]*flagc[rson])%mod;
sum[lson]=mul(len-(len>>),flagj[pos],mod)+sum[lson]*flagc[pos];
sum[lson]%=mod;
sum[rson]=mul((len>>),flagj[pos],mod)+sum[rson]*flagc[pos];
sum[rson]%=mod;
flagj[pos]=;
flagc[pos]=;
}
void buildtree(ll l,ll r,ll pos,ll mod)
{
flagc[pos]=;
flagj[pos]=;
if(l==r)
{
scanf("%lld",&sum[pos]);
sum[pos]%=mod;
return;
}
ll mid=(l+r)>>;
buildtree(l,mid,pos*,mod);
buildtree(mid+,r,pos*+,mod);
sum[pos]=sum[pos*]+sum[pos*+];
sum[pos]%=mod;
}
ll query(ll L,ll R,ll l,ll r,ll pos,ll mod)
{
if(L<=l&&r<=R)
return sum[pos]%mod;
pushdown(pos,(r-l+),mod);
ll mid=(l+r)>>;
ll ans=;
if(L<=mid)ans+=query(L,R,l,mid,pos*,mod);
if(mid<R)ans+=query(L,R,mid+,r,pos*+,mod);
return ans%=mod;
}
void update(ll L,ll R,ll change,ll l,ll r,ll pos,ll flag,ll mod)
{
if(L<=l&&r<=R)
{
if(flag==1ll)
{
flagj[pos]*=change;
flagj[pos]%=mod;
flagc[pos]*=change;
flagc[pos]%=mod;
sum[pos]=mul(sum[pos],change,mod);
}
else
{
flagj[pos]+=change;
flagj[pos]%=mod;
sum[pos]+=mul(r-l+,change,mod);
sum[pos]%=mod;
}
return;
}
pushdown(pos,r-l+,mod);
ll mid=(l+r)/;
if(L<=mid)update(L,R,change,l,mid,pos*,flag,mod);
if(R>mid)update(L,R,change,mid+,r,pos*+,flag,mod);
sum[pos]=sum[pos*]+sum[pos*+];
sum[pos]%=mod;
}
int main()
{
ll x,y,z,i,t;
while(~scanf("%lld%lld",&x,&y))
{
buildtree(,x,,y);
ll q;
scanf("%lld",&q);
for(i=;i<q;i++)
{
ll flag,l,r;
scanf("%lld%lld%lld",&flag,&l,&r);
if(flag==3ll)
{
printf("%lld\n",query(l,r,,x,,y));
}
else
{
ll c;
scanf("%lld",&c);
update(l,r,c,,x,,flag,y);
}
}
}
return ;
}

codevs 2216 行星序列 线段树+延迟标记(BZOJ 1798)的更多相关文章

  1. HDU 3468:A Simple Problem with Integers(线段树+延迟标记)

    A Simple Problem with Integers Case Time Limit: 2000MS Description You have N integers, A1, A2, ... ...

  2. codevs 1690 开关灯 线段树+延迟标记

    1690 开关灯  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这 ...

  3. 【codevs2216】行星序列 线段树 区间两异同修改+区间求和*****

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

  4. Tree(树链剖分+线段树延迟标记)

    Tree http://poj.org/problem?id=3237 Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12 ...

  5. HDU4893--Wow! Such Sequence! (线段树 延迟标记)

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

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

    题目链接 //注意取模! #include<cstdio> #include<cctype> using namespace std; const int N=1e5+5; i ...

  7. Jiu Yuan Wants to Eat(树链剖分+线段树延迟标记)

    Jiu Yuan Wants to Eat https://nanti.jisuanke.com/t/31714 You ye Jiu yuan is the daughter of the Grea ...

  8. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  9. bzoj 1095 [ZJOI2007]Hide 捉迷藏(括号序列+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1095 [题意] 给定一棵树,树上颜色或白或黑而且可以更改,多个询问求最远黑点之间的距离 ...

随机推荐

  1. 线段树(成段更新,区间求和lazy操作 )

    hdu1556 Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  2. numpy基础入门

    1.Numpy是什么 很简单,Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy.matplotlib一起使用.其实,list已经提供了类似于矩阵的表示形式,不过nu ...

  3. AE导出mov

    最近安装了AE发现没法导出MOV格式的: 感觉应该是没有安装支持MOV的播放器之类的原因造成的:果断去下载一个quicktime 安装好之后重启发现真的有 mov 格式了

  4. MP3 ID3信息编辑器(附源码)

    练习WPF时写的编辑MP3 ID3信息的小工具,方便对歌曲的统一管理,同时增加了调用豆瓣音乐API获取专辑信息的功能:1.主界面: 2.没有ID3 信息的MP3歌曲: 3.点击自动获取,从豆瓣音乐获取 ...

  5. Linux eventfd分析

    2017-07-20 eventfd在linux中是一个较新的进程通信方式,和信号量等不同的是event不仅可以用于进程间的通信,还可以用户内核发信号给用户层的进程.eventfd在virtIO后端驱 ...

  6. CTE的妙用

    转自:https://blog.csdn.net/kk185800961/article/details/42535223 之前在2本书看到过with as 子句的一个简单例子,网上没找到相关资料. ...

  7. java-mybaits-00103-入门程序原生的【查、增、删、改】

    一.需求 实现以下功能: 根据用户id查询一个用户信息 根据用户名称模糊查询用户信息列表 添加用户 更新用户 删除用户 二.具体步骤 1.增加pom引用 2.增加log4j.properties # ...

  8. Randcher 2.0部署K8s集群(一)

    环境准备 1.系统版本 CentOS7.5 + docker ee 2.配置阿里云yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirro ...

  9. Spark SQL与Hive on Spark的比较

    简要介绍了SparkSQL与Hive on Spark的区别与联系 一.关于Spark 简介 在Hadoop的整个生态系统中,Spark和MapReduce在同一个层级,即主要解决分布式计算框架的问题 ...

  10. python中的TCP及UDP

    python中是通过套接字即socket来实现UDP及TCP通信的.有两种套接字面向连接的及无连接的,也就是TCP套接字及UDP套接字. TCP通信模型 创建TCP服务器 伪代码: ss = sock ...