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. Android DatepickerDialog(日期选择器)的使用

    效果图如下: 日期和时间选择对话框,首先是要获得当前时间,这里用 java类中的Calendar来获得日期和时间(也可以用Date,但是不提倡,Date部分方法已经注释为过时), Calendar是一 ...

  2. 几种常用的SQL优化工具及方法

    转自:http://blog.itpub.net/35489/viewspace-764856/ 1. sql 详细执行计划,主要检查驱动路径,索引是否合适:同一个pl/sql窗口连续执行即可:exp ...

  3. 170718、springboot编程之发送邮件

    Spring提供了非常好用的JavaMailSender接口实现邮件发送.在Spring Boot的Starter模块中也为此提供了自动化配置.下面通过实例看看如何在Spring Boot中使用Jav ...

  4. poj1463 Strategic game【树形DP】

    Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 9582   Accepted: 4516 De ...

  5. python threading.thread

    Thread 是threading模块中最重要的类之一,可以使用它来创建线程.有两种方式来创建线程:一种是通过继承Thread类,重写它的run方法:另一种是创建一个threading.Thread对 ...

  6. 【ArcGIS for SivlerLight api(3)】基础图层增删改查

    1.基础底图通常使用TiledLayer或者ArcGISDynamicLayer. 本质上都是在本地加载栅格图片.后台生成策略不同而已.从Vs2010的控件栏上拖过来的Map控件默认添加的底图是Esr ...

  7. proxy ubuntu proxy--http://jingyan.baidu.com/article/8cdccae9913470315513cd70.html

    apt-get 设置代理 proxy 方法 方法一 :这是一种临时的手段,如果你仅仅是暂时需要通过http代理使用apt-get,你可以使用这种方法. 在使用 apt-get  之前,在终端中输入以下 ...

  8. Currency Exchange---poj1860 ( spfa, 回路,最长路)

    题目链接:http://poj.org/problem?id=1860 题解: 两种情况YES,一种是存在正权回路: 一种是求最长路后,实现了增值,也是YES: 用spfa来判断是否存在正权回路,其实 ...

  9. rpyc

    import json import socket from thread import * from ansible_api import * from rpyc import Service fr ...

  10. MVC项目,bootstrap升级后index.d.ts编译出错

    安装最新的Typescript组件 下载链接 https://www.microsoft.com/en-us/download/details.aspx?id=48593