• 喵哈哈村的种花魔法


    喵哈哈村的种花魔法

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

     

     
  • 相关阅读:
    因子和阶乘
    周期串
    字符串~键盘错位
    6174问题
    HDU_1015——撬锁,5循环
    HDU_1372——骑士移动,二维空间BFS
    HDU_1372——骑士移动,BFS非模版
    HDU_2001——计算两点之间的距离
    HDU_2212
    HDU_1999——不可摸数
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/7527109.html
Copyright © 2020-2023  润新知