喵哈哈村的种花魔法(线段树的区间更新)

描述

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

而且谷歌廖最神奇的就是,他会施展一种种花魔法,会使得一定区间的花儿,长高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个整数,即输出每朵花儿在施展魔法之后的高度。

样例输入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

这题是线段树区间更新问题

以下贴出常规写法,以及大佬的写法。
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #define ll long long
 5 #define lson l, m, rt<<1
 6 #define rson m+1, r, rt<<1|1
 7 const int maxn = 1e6+10;
 8 using namespace std;
 9 ll flo[maxn<<2];
10 void PushUP(int rt){
11     flo[rt] = flo[rt<<1] + flo[rt<<1|1];
12 }
13 void build(int l, int r, int rt){
14     if(l == r){
15         scanf("%lld",&flo[rt]);
16         return;
17     }
18     int m = (l + r) >> 1;
19     build(lson);
20     build(rson);
21 }
22 void update(int L, int R, ll add, int l, int r, int rt){
23     if(L <= l && r <= R){
24         flo[rt] += add;
25         return;
26     }
27     int m = (l + r) >> 1;
28     if(m >= L) update(L, R, add, lson);
29     if(m < R) update(L, R, add, rson);
30     //PushUP(rt);
31 }
32 void query(int l, int r, int rt, ll k){
33     if(l == r){
34         printf("%lld ",flo[rt]+k);
35         return;
36     }
37     int m = (l + r) >> 1;
38     if(m >= l) query(lson,k+flo[rt]);
39     if(m < r) query(rson,k+flo[rt]);
40 }
41 int main()
42 {
43     int n, m;
44     while(cin>>n>>m){
45         memset(flo, 0, sizeof(flo));
46         build(1, n, 1);
47         ll a, b, c;
48         while(m--){
49             scanf("%d%d%d",&a,&b,&c);
50             update(a, b, c, 1, n, 1);
51         }
52         query(1, n, 1, 0);
53         printf("\n");
54     }
55     return 0;
56 }

大佬的代码好牛逼,简单易懂。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 const int maxn = 1e5+10;
 5 ll a[maxn], b[maxn];
 6 int main(){
 7     int n, m;
 8     while(cin>>n>>m){
 9         memset(b, 0, sizeof(b));
10         for(int i = 1; i <= n; i++){
11             scanf("%lld",&a[i]);
12         }
13         for(int i = 1; i <= m; i++){
14             ll l, r, val;
15             scanf("%d%d%lld",&l,&r,&val);
16             b[l] += val;
17             b[r+1] -= val;
18         }
19         ll sum = 0;
20         for(int i = 1; i <= n; i++){
21             sum += b[i];
22             a[i] += sum;
23         }
24         for(int i = 1; i <= n; i++){
25             printf("%lld ",a[i]);
26         }
27         printf("\n");
28     }
29     return 0;
30 }
时间: 2025-01-06 05:41:20

喵哈哈村的种花魔法(线段树的区间更新)的相关文章

HDU 1556 Color the ball(线段树:区间更新)

http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和线段树都可以,拿这道题来入门一下线段树的区间更新. 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 const int maxn = 1000

HDU 4902 线段树(区间更新)

Nice boat Time Limit: 30000/15000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 353    Accepted Submission(s): 169 Problem Description There is an old country and the king fell in love with a devil. The devil alw

CodeForces 52C Circular RMQ(区间循环线段树,区间更新,区间求和)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://codeforces.com/problemset/problem/52/C You are given circular array a0,?a1,?...,?an?-?1. There are two types of operations with it: inc(lf,?rg,?v) - this operation increases each element on the segm

HDU 4027 Can you answer these queries?(线段树,区间更新,区间查询)

题目 线段树 简单题意: 区间(单点?)更新,区间求和 更新是区间内的数开根号并向下取整 这道题不用延迟操作 //注意: //1:查询时的区间端点可能前面的比后面的大: //2:优化:因为每次更新都是开平方,同一个数更新有限次数就一直是1了,所以可以这样优化 #include <stdio.h> #include<math.h> #define N 100010 #define LL __int64 #define lson l,m,rt<<1 #define rson

杭电1698--Just a Hook(线段树, 区间更新)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1698 线段树, 区间更新, 用到了Lazy思想.利用已更新区间来减少未更新区间用时.(自己的理解, 应该是对的) #include <cstdio>#include <cstring>#include <iostream>using namespace std;int Node[100100<<2], n, m, lazy[100100<<2];void

FZU Problem 2171 防守阵地 II (线段树,区间更新)

 Problem 2171 防守阵地 II Accept: 143    Submit: 565Time Limit: 3000 mSec    Memory Limit : 32768 KB  Problem Description 部队中总共有N个士兵,每个士兵有各自的能力指数Xi,在一次演练中,指挥部确定了M个需要防守的地点,指挥部将选择M个士兵依次进入指定地点进行防守任务,获得的参考指数即为M个士兵的能力之和.随着时间的推移,指挥部将下达Q个指令来替换M个进行防守的士兵们,每个参加完防守

poj 2777 线段树的区间更新

Count Color Time Limit: 1000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description Chosen Problem Solving and Program design as an optional course, you are required to solve al

hdu 1556:Color the ball(线段树,区间更新,经典题)

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7941    Accepted Submission(s): 4070 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电

hdu 1698:Just a Hook(线段树,区间更新)

Just a Hook Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 15129    Accepted Submission(s): 7506 Problem Description In the game of DotA, Pudge's meat hook is actually the most horrible thing f