codevs 2216 行星序列 线段树+延迟标记(BZOJ 1798)
2216 行星序列
“神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了“小小宇航员夏令营”,在这里小可可不仅学到了丰富的宇航知识,还参与解决了一些模拟飞行中发现的问题,今天指导老师交给他一个任务,在这次模拟飞行的路线上有N个行星,暂且称它们为一个行星序列,并将他们从1至n标号,在宇宙未知力量的作用下这N个行星的质量是不断变化的,所以他们对飞船产生的引力也会不断变化,小可可的任务就是在飞行途中计算这个行星序列中某段行星的质量和,以便能及时修正飞船的飞行线路,最终到达目的地,行星序列质量变化有两种形式:
1,行星序列中某一段行星的质量全部乘以一个值
2,行星序列中某一段行星的质量全部加上一个值
由于行星的质量和很大,所以求出某段行星的质量和后只要输出这个值模P的结果即可,小可可被这个任务难住了,聪明的你能够帮他完成这个任务吗?
第一行两个整数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
注:同一行相邻的两数之间用一个空格隔开,每行开头和末尾没有多余空格
对每个操作3,按照它在输入中出现的顺序,依次一行输出一个整数表示所求行星质量和
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
2
35
8
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)的更多相关文章
- HDU 3468:A Simple Problem with Integers(线段树+延迟标记)
A Simple Problem with Integers Case Time Limit: 2000MS Description You have N integers, A1, A2, ... ...
- codevs 1690 开关灯 线段树+延迟标记
1690 开关灯 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这 ...
- 【codevs2216】行星序列 线段树 区间两异同修改+区间求和*****
[codevs2216]行星序列 2014年2月22日3501 题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了“小小 ...
- Tree(树链剖分+线段树延迟标记)
Tree http://poj.org/problem?id=3237 Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 12 ...
- HDU4893--Wow! Such Sequence! (线段树 延迟标记)
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- COGS.1272.[AHOI2009]行星序列(线段树 区间加、乘、求和)
题目链接 //注意取模! #include<cstdio> #include<cctype> using namespace std; const int N=1e5+5; i ...
- 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 ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- bzoj 1095 [ZJOI2007]Hide 捉迷藏(括号序列+线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1095 [题意] 给定一棵树,树上颜色或白或黑而且可以更改,多个询问求最远黑点之间的距离 ...
随机推荐
- netty之LengthFieldBasedFrameDecoder解码器
官方api:http://netty.io/4.1/api/io/netty/handler/codec/LengthFieldBasedFrameDecoder.html package com.e ...
- docker-compose命令和yml文件配置
docker-compose -f compose-server.yml up -d version: '3' services: eureka-server: image: mydocker/eur ...
- Xshell配置ssh免密码登录-密钥公钥(Public key)
1 简介 ssh登录提供两种认证方式:口令(密码)认证方式和密钥认证方式.其中口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法. 使用密钥登录分为3步: 1 ...
- jps命令用法
jps是jdk提供的一个查看当前java进程的小工具, 可以看做是JavaVirtual Machine Process Status Tool的缩写.非常简单实用. 命令格式:jps [option ...
- Mybatis三剑客之mybatis-generator配置
mybatis插件在这里: 然后把generatorConfig.xml文件放在resources下: <?xml version="1.0" encoding=" ...
- centos 配置redis
一.配置redis 简介:Redis是使用c语言开发的一个高性能键值数据库.Redis可以通过一些键值类型来存储数据. 下载:官网地址:http://redis.io/ 下载地址:http://dow ...
- 大话存储1——存储系统的发展,计算机I/O
1 存储发展 存储在这里的含义为信息记录,是伴随人类活动出现的技术. 1. 竹简和纸张 竹简是中国古代使用的记录文字的工具,后来被纸张所取代,如图1.1所示. 2. 选数管 选数管是20世纪中期出现的 ...
- 【spring mvc】扒一扒tomcat
1.TOMCAT的目录 主要说一下webapps目录,WEB应用的目录结构:假设在$CATALINA_HOME/webapps下有helloapp的web应用 /helloapp:Web应用的根目录, ...
- 001-spring cache 简介
一.概述 参看地址: 自3.1版以来,Spring Framework提供了对现有Spring应用程序透明地添加缓存的支持.与事务支持类似,缓存抽象允许一致地使用各种缓存解决方案,而对代码的影响最小. ...
- 前端错误提示whitelabel error page
1:错误提示whitelabel error page:需要定义一个error.html ,否则提示如图