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. Dij二级最短路

    hdu1245 Saving James Bond Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  2. ubuntu16.04下安装opencv-nonfree

    在写计算机视觉与导航技术的课程作业,是关于sift和surf特征的提取及匹配.因为opencv中都有直接的函数可以调用. 关于SIFT和SURF的特征在opencv的nonfree模块中,从字面意思就 ...

  3. Spring boot官方文档学习(一)

    个人说明:本文内容都是从为知笔记上复制过来的,样式难免走样,以后再修改吧.另外,本文可以看作官方文档的选择性的翻译(大部分),以及个人使用经验及问题. 其他说明:如果对Spring Boot没有概念, ...

  4. 获取access_token示例代码

    文档中心--百度AI-百度AI开放平台 http://ai.baidu.com/docs#/NLP-API/top #include <iostream> #include <cur ...

  5. gitlab-runner ---CI

    gitlab-runner: https://segmentfault.com/a/1190000007180257 https://mp.weixin.qq.com/s?__biz=MjM5MTA1 ...

  6. Nginx文件下载服务器

    1. 配置文件 server { listen 80; #端口 server_name localhost; #服务名 charset utf-8; #避免中文乱码 root /data/packag ...

  7. django-mvc

    而对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序.服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理.应用程序则负责具体的逻辑处 ...

  8. win安装mysql

    在这讲解的是有关于通过zip解压安装MySQL的方法.有看了网上的其它的教程,讲的有些不够完善,也自己写一篇简述一下.个人还是建议看官方的参考文档非常之详细:https://dev.mysql.com ...

  9. SDWebimage清空缓存

    清空缓存 - (void)clearTmpPics{ [[SDImageCache sharedImageCache] clearDisk]; [[SDImageCache sharedImageCa ...

  10. 从WW中剥离一个三维场景框架

    从WW中剥离一个三维场景框架,初步实现的一个.可以绘制一个三角形,但是不能够控制摄像机,没有增加鼠标事件.没有投影,世界变幻之类的东西.以后会不断学习逐步增加进来. 下载地址 下载V1.0.0.2