【codevs2216】行星序列

2014年2月22日3501

题目描述 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

题解

这两种修改可能会造成冲突`!!!!!!

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】行星序列 线段树 区间两异同修改+区间求和*****的更多相关文章

  1. codevs 2216 行星序列 线段树+延迟标记(BZOJ 1798)

    2216 行星序列  时间限制: 2 s  空间限制: 256000 KB     题目描述 Description “神州“载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始, ...

  2. COGS.1272.[AHOI2009]行星序列(线段树 区间加、乘、求和)

    题目链接 //注意取模! #include<cstdio> #include<cctype> using namespace std; const int N=1e5+5; i ...

  3. codevs2216 行星序列

    题目描述 Description "神州"载人飞船的发射成功让小可可非常激动,他立志长大后要成为一名宇航员假期一始,他就报名参加了"小小宇航员夏令营",在这里小 ...

  4. 【BZOJ】1095: [ZJOI2007]Hide 捉迷藏 括号序列+线段树

    [题目]BZOJ 1095 [题意]给定n个黑白点的树,初始全为黑点,Q次操作翻转一个点的颜色,或询问最远的两个黑点的距离,\(n \leq 10^5,Q \leq 5*10^5\). [算法]括号序 ...

  5. Snacks HDU 5692 dfs序列+线段树

    Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...

  6. CodeForces Round #179 (295A) - Greg and Array 一个线段树做两次用

    线段树的区间更新与区间求和...一颗这样的线段树用两次... 先扫描1~k...用线段树统计出每个操作执行的次数... 那么每个操作就变成了 op. l  , op.r , op.c= times* ...

  7. HDU 1754 I Hate It(线段树之单点更新,区间最值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. bzoj 1095 [ZJOI2007]Hide 捉迷藏(括号序列+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1095 [题意] 给定一棵树,树上颜色或白或黑而且可以更改,多个询问求最远黑点之间的距离 ...

  9. HDU1166(线段树 +更新单点,求区间总和)、HDU1754(线段树 + 更新单点,求区间最大值)

    线段树简单应用 先附上几张图便与理解,大佬文章传送门1.传送门2 HDU1166:题目描述 线段树 +更新单点,求区间总和 代码如下(递归版) #include<iostream> #in ...

随机推荐

  1. 百度或者Google---SEO优化(转载)

    google 和百度的技术差别: 1.百度还认不清哪个是原创的 2.google蜘蛛不够百度快 4.google排名结果随时变化 流量.权重.权威.内容.用户体验.用户关注度等等细节的排名,已表 达了 ...

  2. jquery 使用方法<转载>

    jquery 使用方法 jQuery是目前使用最广泛的javascript函数库.据统计,全世界排名前100万的网站,有46%使用jQuery,远远超过其他库.微软公司 甚至把jQuery作为他们的官 ...

  3. sparkR操作HDFS上面的CSV文件

    ./bin/sparkR --packages com.databricks:spark-csv_2.10:1.3.0 --master yarn hdfs://master:9000/tmp/dem ...

  4. linux c程序中获取shell脚本输出的实现方法

    linux c程序中获取shell脚本输出的实现方法 1. 前言Unix界有一句名言:“一行shell脚本胜过万行C程序”,虽然这句话有些夸张,但不可否认的是,借助脚本确实能够极大的简化一些编程工作. ...

  5. wordPress Development

    site:http://codex.wordpress.org/Theme_Development 2014-03-24 This article is about developing WordPr ...

  6. [转]优化wp_head()

    经过对head的优化,我的博客访问速度也快了好多,在此过程中也了解到wp_head()模板函数的作用,可以再次优化,特此记录. 步骤:加入到function.phpremove_action(‘wp_ ...

  7. sql 联合查询并更新

    update sales set sales.adminId = t.adminIdfrom (select a.adminId,a.realName from sales ,admin_admini ...

  8. bootstrap tab切换如何让鼠标移动自动切换内容

    bootstrap集成了很多功能,比如nav-tabs组件,可以将相似的内容集中在一个区块中展示.bootstrap tab切换默认是要点击才会切换的,如何实现鼠标移动就自动切换呢?如下图所示,光标移 ...

  9. Android Toast 封装,避免Toast消息覆盖,替换系统Toast最好用的封装

    Android Toast 封装,避免Toast消息覆盖,无阻塞,等强大功能   ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  10. xcode注释

    新开的项目需要先开发iOS版本,所以又把好久没写的iOS捡起来了,之前都是手动注释,最近是越来越懒了,所以在网上找了一个自动注释的插件,啊哈,其实有时候还真的挺怀念用Eclipse的时候,不过不用羡慕 ...