喵哈哈村的种花魔法

喵哈哈村的种花魔法

发布时间: 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 }

 

 
原文地址:https://www.cnblogs.com/zllwxm123/p/7527109.html