【codevs2216】行星序列 线段树 区间两异同修改+区间求和*****
【codevs2216】行星序列
题目描述 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
样例输出 Sample Output
2
数据范围及提示 Data Size & Hint
100%的数据中,M,N<=100000
40%的数据中,M,N<=10000
题解
这两种修改可能会造成冲突`!!!!!!
long long
代码
#include <cstdio>
#include <cmath>
#include <cstring>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <set>
#include <vector>
#include <queue>
#include <typeinfo>
#include <map>
#include <stack>
typedef long long ll;
#define inf 0x7fffffff
using namespace std;
inline ll read()
{
ll x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=x*+ch-'';
ch=getchar();
}
return x*f;
} //************************************************************************************** struct ss
{
int l,r;
ll sum;
ll lazyc,lazyj;
} tr[*];
int n;
int p;
ll a[];
void build(int k,int s,int t)
{
tr[k].l=s;
tr[k].r=t;
tr[k].lazyc=;
if(s==t)
{
tr[k].sum=a[s]%p;
return;
}
int mid=(s+t)>>;
build(k<<,s,mid);
build(k<<|,mid+,t);
tr[k].sum=(tr[k<<].sum+tr[k<<|].sum)%p;
}
void pushdown(int k)
{
if(tr[k].l==tr[k].r)return;
int t=tr[k].r-tr[k].l+;
ll m=tr[k].lazyc;
ll a=tr[k].lazyj;
tr[k<<].sum=(tr[k<<].sum*m+(t-(t>>))*a)%p;
tr[k<<|].sum=(tr[k<<|].sum*m+(t>>)*a)%p;
tr[k<<].lazyj=(tr[k<<].lazyj*m+a)%p;
tr[k<<|].lazyj=(tr[k<<|].lazyj*m+a)%p;
tr[k<<].lazyc=(tr[k<<].lazyc*m)%p;
tr[k<<|].lazyc=tr[k<<|].lazyc*m%p;
tr[k].lazyj=;
tr[k].lazyc=;
}
void update1(int k,int s,int t,ll c)
{
pushdown(k);
if(s==tr[k].l&&t==tr[k].r)
{
tr[k].sum=(tr[k].sum*c)%p;
tr[k].lazyc=(tr[k].lazyc*c)%p;
return;
}
int mid=(tr[k].l+tr[k].r)>>;
if(t<=mid)
{
update1(k<<,s,t,c);
}
else if(s>mid)update1(k<<|,s,t,c);
else
{
update1(k<<,s,mid,c);
update1(k<<|,mid+,t,c);
}
tr[k].sum=(tr[k<<].sum+tr[k<<|].sum)%p;
}
void update2(int k,int s,int t,ll c)
{
pushdown(k);
if(s==tr[k].l&&t==tr[k].r)
{
tr[k].sum=(tr[k].sum+c*(t-s+))%p;
tr[k].lazyj=(tr[k].lazyj+c)%p;
return;
}
int mid=(tr[k].l+tr[k].r)>>;
if(t<=mid)
{
update2(k<<,s,t,c);
}
else if(s>mid)update2(k<<|,s,t,c);
else
{
update2(k<<,s,mid,c);
update2(k<<|,mid+,t,c);
}
tr[k].sum=(tr[k<<].sum+tr[k<<|].sum)%p;
}
long long ask(int k,int s,int t)
{
pushdown(k);
ll ans;
if(s==tr[k].l&&t==tr[k].r)
{
return tr[k].sum;
}
int mid=(tr[k].l+tr[k].r)>>;
if(t<=mid)ans=ask(k<<,s,t);
else if(s>mid) ans=ask(k<<|,s,t);
else
{
ans=(ask(k<<,s,mid)+ask(k<<|,mid+,t))%p;
}
tr[k].sum=(tr[k<<].sum+tr[k<<|].sum)%p;
return ans;
}
int main()
{ scanf("%d%d",&n,&p);
for(int i=; i<=n; i++)
{
scanf("%lld",&a[i]);
}
build(,,n);
int m;
scanf("%d",&m);
for(int i=; i<=m; i++)
{
int t;
int x,y,z;
scanf("%d",&t);
if(t==)
{
scanf("%d%d%d",&x,&y,&z);
update1(,x,y,z);
for(int j=; j<n; j++)
{
printf("%d ",tr[j+].sum);
}
/* printf("%d\n",tr[7].sum);
printf("5->6lazyc:%d\n",tr[6].lazyc);
printf("5->6lazyj:%d\n",tr[6].lazyj);
printf("5->7lazyj:%d\n",tr[3].lazyj);*/
}
else if(t==)
{
scanf("%d%d%d",&x,&y,&z);
update2(,x,y,z);
for(int j=; j<n; j++)
{
printf("%d ",tr[j+].sum);
}
/* printf("%d\n",tr[7].sum);
printf("5->6lazyc:%d\n",tr[6].lazyc);
printf("5->6lazyj:%d\n",tr[6].lazyj);
printf("5->7lazyj:%d\n",tr[3].lazyj);*/
}
else
{
scanf("%d%d",&x,&y);
printf("%lld\n",ask(,x,y)%p);
for(int j=; j<n; j++)
{
printf("%d ",tr[j+].sum);
}
/*printf("%d\n",tr[7].sum);
printf("5->6lazyc:%d\n",tr[6].lazyc);
printf("5->6lazyj:%d\n",tr[6].lazyj);
printf("5->7lazyj:%d\n",tr[3].lazyj);*/
/* for(int i=1;i<n;i++)
{
printf("%d ",tr[i+7].sum);
}
printf("%d\n",tr[7].sum);
if(i)
{
printf("5->7:%d\n",tr[3].sum);
printf("5->7lazyc:%d\n",tr[3].lazyc);
printf("5->7lazyj:%d\n",tr[3].lazyj);
}*/
}
}
return ;
}
【codevs2216】行星序列 线段树 区间两异同修改+区间求和*****的更多相关文章
- codevs 2216 行星序列 线段树+延迟标记(BZOJ 1798)
2216 行星序列 时间限制: 2 s 空间限制: 256000 KB 题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始, ...
- COGS.1272.[AHOI2009]行星序列(线段树 区间加、乘、求和)
题目链接 //注意取模! #include<cstdio> #include<cctype> using namespace std; const int N=1e5+5; i ...
- codevs2216 行星序列
题目描述 Description "神州"载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了"小小宇航员夏令营",在这里小 ...
- 【BZOJ】1095: [ZJOI2007]Hide 捉迷藏 括号序列+线段树
[题目]BZOJ 1095 [题意]给定n个黑白点的树,初始全为黑点,Q次操作翻转一个点的颜色,或询问最远的两个黑点的距离,\(n \leq 10^5,Q \leq 5*10^5\). [算法]括号序 ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- CodeForces Round #179 (295A) - Greg and Array 一个线段树做两次用
线段树的区间更新与区间求和...一颗这样的线段树用两次... 先扫描1~k...用线段树统计出每个操作执行的次数... 那么每个操作就变成了 op. l , op.r , op.c= times* ...
- HDU 1754 I Hate It(线段树之单点更新,区间最值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- bzoj 1095 [ZJOI2007]Hide 捉迷藏(括号序列+线段树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1095 [题意] 给定一棵树,树上颜色或白或黑而且可以更改,多个询问求最远黑点之间的距离 ...
- HDU1166(线段树 +更新单点,求区间总和)、HDU1754(线段树 + 更新单点,求区间最大值)
线段树简单应用 先附上几张图便与理解,大佬文章传送门1.传送门2 HDU1166:题目描述 线段树 +更新单点,求区间总和 代码如下(递归版) #include<iostream> #in ...
随机推荐
- 把Linux安装到移动硬盘上
把Linux安装到移动硬盘上 转载于:http://mrkh.me/install-linux-on-a-portable-hard-drive.html 这一篇文章讲一下,怎么把linux安装到移动 ...
- break语句
//输入年月,不正确重新输入 for (; ; ) { Console.WriteLine("输入年份:"); int year = int.Parse(Console.ReadL ...
- Linux瑞士军刀:密码管理Keeweb
导读 如今,我们依赖于越来越多的线上服务.我们每注册一个线上服务,就要设置一个密码:如此,我们就不得不记住数以百计的密码.这样对于每个人来说,都很容易忘记密码.我将在本文中介绍 Keeweb,它是一款 ...
- 转:github使用教程(重装系统后遇到问题该文章帮我解决了)
github简单使用教程 时间:2012 年 5 月 29 日 6 条评论 分类:学习笔记 , 网络 , 软件 目录 1.注册账户以及创建仓库 2.安装客户端msysgit 3.配置Git 4.提交. ...
- win8.1禁用和去除SkyDrive任务栏图标方法
Win+R打开运行,输入gpedit.msc确定,打开本地组策略编辑器. 依次定位到:计算机配置-管理模板-Windows组件-OneDrive,双击阻止使用 OneDrive 执行文件储存.
- arch linux 新版安装(转)
原文地址:http://blog.sina.com.cn/s/blog_69e5d8400101bqlj.html 正式安装: 以下,是安装的具体步骤,我将做尽可能详细的解说: 一.基本系统的安装 进 ...
- 使用ifconfig命令给网卡配置ip别名
给网卡eth0配置一个ip别名 sudo ifconfig eth0:0 10.108.125.6/22 up 若想保存该配置,以便每次开机都可以使用该ip别名,则应 sudo vim /etc/ne ...
- 【Python】python代码如何调试?
Python 程序如何高效地调试? 现在我在debug python程序就只是简单在有可能错误的地方print出来看一下,不知道python有没像c++的一些IDE一样有单步调试这类的工具?或者说各位 ...
- 【云计算】docker build如何支持参数化构建?
docker 1.9.0版本之后,已经支持docker build参数化构建. docker 版本更新记录: github讨论: 参开资料: https://github.com/docker/doc ...
- 对 Linux 新手非常有用的 20 个命令
参考:http://www.oschina.net/translate/useful-linux-commands-for-newbies 英文原文:http://www.tecmint.com/us ...