喵哈哈村的种花魔法
发布时间: 2017年2月26日 16:13 最后更新: 2017年2月26日 16:14 时间限制: 1000ms 内存限制: 128M
喵哈哈村有一个谷歌廖,谷歌廖特别喜欢种花。
而且谷歌廖最神奇的就是,他会施展一种种花魔法,会使得一定区间的花儿,长高k 厘米。
在谷歌廖施展若干次魔法之后,好奇的沈宝宝想知道,每朵花儿的高度是多少。
第一行两个整数n,m,分别表示花儿的数量,和谷歌廖施展种花魔法的次数。
第二行n个整数a[i],表示花儿一开始的高度为a[i]厘米。
接下来m行,每行三个整数l,r,k。表示谷歌廖使得区间[l,r]的花儿长高了k厘米。
1<=n,m<=100000
1<=a[i],k<=100000
1<=l<=r<=100000
输出n个整数,即输出每朵花儿在施展魔法之后的高度。
复制
3 1
1 2 3
1 2 5
6 7 3
复制
3 2
1 2 3
1 3 2
1 2 5
8 9 5
这道题,应该算是个线段树区间更新的模板题,但是只有最后一次遍历,所以用
前缀和貌似更简单,也更容易理解。
1 #include <iostream>
2 #include <string.h>
3 #include <stdio.h>
4 #include <algorithm>
5 #define N 100005
6 #define ll long long int
7 using namespace std;
8 int n,m;
9 int a[N],b[N];
10 int main(){
11 cin>>n>>m;
12 for(int i=1;i<=n;i++){
13 cin>>a[i];
14 }
15 while(m--){
16 int x,y,z;
17 cin>>x>>y>>z;
18 b[x]+=z;
19 b[y+1]-=z;
20 }
21 ll ans=0;
22 for(int i=1;i<=n;i++){
23 ans+=b[i];
24 a[i]+=ans;
25 }
26 for(int i=1;i<=n;i++){
27 cout<<a[i]<<" ";
28 }
29 cout<<endl;
30 return 0;
31 }
线段树:
1 #include <iostream>
2 #include <stdio.h>
3 #include <string.h>
4 #include <algorithm>
5 #define N 400009
6 #define ll long long int
7 #define mem(a) memset(a,0,sizeof(a))
8 using namespace std;
9 int n,m;
10 ll tree[N];
11
12 void build(int left,int right,int node){
13 if(left==right){
14 scanf("%lld",&tree[node]);
15 return ;
16 }
17 int mid=(left+right)>>1;
18 build(left,mid,node<<1);
19 build(mid+1,right,node<<1|1);
20 }
21
22 void update(int left,int right,int x,int y,int node,ll key){
23 if(x<=left&&right<=y){
24 tree[node]+=key;
25 return ;
26 }
27 int mid=(left+right)>>1;
28 if(x<=mid)
29 update(left,mid,x,y,node<<1,key);
30 if(mid<y)
31 update(mid+1,right,x,y,node<<1|1,key);
32 }
33
34 void query(int left,int right,int node,ll add){
35 if(left==right){
36 if(left==1){
37 printf("%lld",tree[node]+add);
38 return ;
39 }
40 printf(" %lld",tree[node]+add);
41 return ;
42 }
43 int mid=(left+right)>>1;
44 query(left,mid,node<<1,tree[node]+add);
45 query(mid+1,right,node<<1|1,tree[node]+add);
46 }
47
48 int main(){
49 int x,y;
50 ll z;
51 while(scanf("%d%d",&n,&m)!=EOF){
52 mem(tree);
53 build(1,n,1);
54 while(m--){
55 scanf("%d%d%lld",&x,&y,&z);
56 update(1,n,x,y,1,z);
57 }
58 query(1,n,1,0);
59 printf("
");
60 }
61 return 0;
62 }