【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 ...
随机推荐
- [整理]Web应用安全学习
最近在复习TCP/IP相关知识,同时也想对网络安全相关的知识进行系统的补漏. 阅读了一些常见的关于XSS.CSRF等的一些网上文章: http://www.cnblogs.com/luminji/ca ...
- 微信公众号"赞赏"功能来了 觉得不错就给作者打个赏吧
微信很早以前就开始测试“赞赏”功能了,只是官方还没出公告,近日腾讯科技就发了一篇题为 试试给微信公众号“赞赏” 的文章,算是一个回应吧.微信打赏功能势在遏制公众账号抄袭,鼓励用户创造优质内容,内容付费 ...
- 360双击ctrl搜索可能会与firefox快捷键冲突
最近使用火狐浏览器时有好几次要在网页上的对话框输入文字时出现问题,按下字母键直接跳出了firefox菜单选项,用鼠标重新定位到输入位置再打还是不行,照样会弹出菜单提示,如下图,这可能是有什么快捷键冲突 ...
- dedecms后台批量替换文章中的关键词
DEDECMS怎么样能快捷或者批量修改网站所有文章的超链接和锚文本,超链和所有关键词锚文本的链接需要修改? dedecms后台批量替换文章中的关键词
- ubuntu硬盘安装卡在探测文件系统
在硬盘安装ubuntu的时候,会出现这样的问题:安装程序一直卡在正在探测文件系统就不动了.解决的方法很简单.在安装之前要在终端输入sudo空格umount空格 -l空格 /isodevice 不能少一 ...
- poj 3026 bfs+prim Borg Maze
Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9718 Accepted: 3263 Description The B ...
- poj2485 Highways
Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public h ...
- poj1328贪心 雷达,陆地,岛屿问题
Radar Installation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 60381 Accepted: 13 ...
- 解决android:theme="@android:style/Theme.NoDisplay" 加入这句话后程序不能运行
原因: 原来用的是ActionBarActivity,继承自 ActionBarActivity的类必须指定固定的集中Theme风格,而这些 Theme 风格是需要导入V7中的 appcompat L ...
- Android 云服务器的搭建和友盟APP自动更新功能的实现
setContentView(R.layout.activity_splash); //Bmob SDK初始化--只需要这一段代码即可完成初始化 //请到Bmob官网(http://www.bmob. ...