zoukankan      html  css  js  c++  java
  • 喵哈哈村的魔法考试 Round #2 (Div.2) B.喵哈哈村的种花魔法 线段树 区间更新 单点查询

    喵哈哈村的种花魔法

    发布时间: 2017年2月26日 16:13 最后更新: 2017年2月26日 16:14 时间限制: 1000ms 内存限制: 128M

    题目链接:

    http://qscoj.cn/problem/16/

    描述

    喵哈哈村有一个谷歌廖,谷歌廖特别喜欢种花。

    而且谷歌廖最神奇的就是,他会施展一种种花魔法,会使得一定区间的花儿,长高厘米。

    在谷歌廖施展若干次魔法之后,好奇的沈宝宝想知道,每朵花儿的高度是多少。

    *输入
    第一行两个整数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个整数,即输出每朵花儿在施展魔法之后的高度。

    样例输入1 复制
    3 1
    1 2 3
    1 2 5
    样例输出1
    6 7 3
    样例输入2 复制
    3 2
    1 2 3
    1 3 2
    1 2 5
    样例输出2
    8 9 5

    题意:

    题解:

    段树的区间更新,然后单点查询
    qsc: 机智一点的话,就是单点更新,然后区间查询的题目,用一个前缀和去维护就好了。【好TM机智】

    代码:

    机智做法:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define MS(a) memset(a,0,sizeof(a))
     5 #define MP make_pair
     6 #define PB push_back
     7 const int INF = 0x3f3f3f3f;
     8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
     9 inline ll read(){
    10     ll x=0,f=1;char ch=getchar();
    11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 //////////////////////////////////////////////////////////////////////////
    16 const int maxn = 1e5+10;
    17 
    18 ll a[maxn],b[maxn],sum;
    19 
    20 int main(){
    21     int n = read(), m = read();
    22     for(int i=1; i<=n; i++)
    23         a[i] = read();
    24     for(int i=1; i<=m; i++){
    25         int l,r; ll v; scanf("%d%d%lld",&l,&r,&v);
    26         b[l] += v;
    27         b[r+1] -= v;
    28     }
    29 
    30     for(int i=1; i<=n; i++){
    31         sum += b[i];
    32         a[i] += sum;
    33         cout << a[i] << " ";
    34     }
    35     cout << endl;
    36 
    37     return 0;
    38 }

    线段树:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 #define MS(a) memset(a,0,sizeof(a))
     5 #define MP make_pair
     6 #define PB push_back
     7 const int INF = 0x3f3f3f3f;
     8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
     9 inline ll read(){
    10     ll x=0,f=1;char ch=getchar();
    11     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    12     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    13     return x*f;
    14 }
    15 //////////////////////////////////////////////////////////////////////////
    16 const int maxn = 1e5+10;
    17 
    18 struct node{
    19     int l,r; ll sum;
    20 }tree[maxn<<2];
    21 
    22 ll a[maxn],ans[maxn];
    23 
    24 void build(int rt,int l,int r){
    25     tree[rt].l = l, tree[rt].r = r;
    26     tree[rt].sum = 0;
    27     if(l == r){
    28         tree[rt].sum = a[l];
    29         return ;
    30     }
    31     int mid = (l+r)/2;
    32     build(rt<<1,l,mid);
    33     build(rt<<1|1,mid+1,r);
    34 }
    35 
    36 void update(int rt,int l,int r,ll val){
    37     int L = tree[rt].l, R = tree[rt].r;
    38     if(l<=L && R<=r){
    39         tree[rt].sum += val;
    40         return ;
    41     }
    42     int mid = (L+R)/2;
    43     if(l <= mid) update(rt<<1,l,r,val);
    44     if(r > mid) update(rt<<1|1,l,r,val);
    45 }
    46 
    47 
    48 void query(int rt,int l, int r,ll num){
    49     if(l==r){
    50         printf("%lld ",tree[rt].sum+num);
    51         return ;
    52     }
    53     int mid = (l+r)/2;
    54     query(rt<<1,l,mid,num+tree[rt].sum);
    55     query(rt<<1|1,mid+1,r,num+tree[rt].sum);
    56 }
    57 
    58 int main(){
    59     int n = read(), m = read();
    60     for(int i=1; i<=n; i++)
    61         a[i] = read();
    62     build(1,1,n);
    63     for(int i=0; i<m; i++){
    64         int l,r; ll k; scanf("%d%d%lld",&l,&r,&k);
    65         update(1,l,r,k);
    66     }
    67     query(1,1,n,0);
    68     cout << endl;
    69 
    70     return 0;
    71 }
  • 相关阅读:
    HDU 5744
    HDU 5815
    POJ 1269
    HDU 5742
    HDU 4609
    fzu 1150 Farmer Bill's Problem
    fzu 1002 HangOver
    fzu 1001 Duplicate Pair
    fzu 1150 Farmer Bill's Problem
    fzu 1182 Argus 优先队列
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827651.html
Copyright © 2011-2022 走看看