码迷,mamicode.com
首页 > 其他好文 > 详细

POJ3468-A Simple Problem with Integers(区间更新 + SegmentTree || SplayTree || BinaryIndexTree)

时间:2017-03-26 11:08:34      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:eal   str   char   log   style   cee   技术分享   memset   show   

 

Description

You have N integers, A1A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.

Input

The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of AaAa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of AaAa+1, ... , Ab.

Output

You need to answer all Q commands in order. One answer in a line.

Sample Input

10 5

1 2 3 4 5 6 7 8 9 10

Q 4 4

Q 1 10

Q 2 4

C 3 6 3

Q 2 4

Sample Output

4

55

9

15

Hint

The sums may exceed the range of 32-bit integers.

Means:

给你一段数列,有区间查询跟区间更新操作

Solve:

Segment Tree || Binary Index Tree || Splay Tree

PS:线段树更新中有一段tree[ls] += (LL)lazy[id] * (mid - l + 1);这是由于更新的是区间,区间每个点都要加上value,所以要乘以区间点数

Code(SegmentTree):

技术分享
 1 #include <cstdio>
 2 #include <cstring>
 3 #define FOP         freopen("in.in" , "r" , stdin)
 4 #define FCL         freopen("out.out" , "w" , stdout)
 5 #define LL          long long
 6 #define MAXN        100000+10
 7 #define CLR(x)      memset(x , 0 , sizeof(x))
 8 #define LSON        id << 1 , l , mid
 9 #define RSON        id << 1 | 1 , mid + 1 , r
10 #define ROOT        1 , 1 , n
11 #define PUSHUP(x)   tree[id] = tree[id << 1] + tree[id << 1 | 1]
12 LL tree[MAXN << 2] = {0};
13 LL data[MAXN] = {0};
14 LL lazy[MAXN << 2] = {0};
15 int n , q;
16 inline void PushDown(int id , int l , int r)
17 {
18     if(lazy[id])
19     {
20         int ls = id << 1 , rs = id << 1 | 1 , mid = (l + r) >> 1;
21         lazy[ls] += lazy[id];
22         lazy[rs] += lazy[id];
23         tree[ls] += (LL)lazy[id] * (mid - l + 1);
24         tree[rs] += (LL)lazy[id] * (r - mid);
25         lazy[id] = 0;
26     }
27 }
28 void Build(int id , int l , int r)
29 {
30     if(l == r)
31     {
32         scanf("%lld" , tree + id);
33         lazy[id] = 0;
34         return ;
35     }
36     int mid = (l + r) >> 1;
37     Build(id << 1 , l , mid);
38     Build(id << 1 | 1 , mid + 1 , r);
39     PUSHUP(id);
40 }
41 LL Query(int id , int l , int r , int x , int y)
42 {
43     if(x <= l && y >= r)
44     {
45         return tree[id];
46     }
47     PushDown(id , l , r);
48     int mid = (l + r) >> 1;
49     LL res = 0;
50     if(x <= mid)    res += Query(LSON , x , y);
51     if(y > mid)    res += Query(RSON , x , y);
52     PUSHUP(id);
53     return res;
54 }
55 void Update(int id , int l , int r , int x , int y , int z)
56 {
57     if(x <= l && y >= r)
58     {
59         lazy[id] += z;
60         tree[id] += (LL)(r - l + 1) * z;
61         return;
62     }
63     PushDown(id , l , r);
64     int mid = (l + r) >> 1;
65     if(x <= mid)    Update(LSON , x , y , z);
66     if(y > mid)    Update(RSON , x , y , z);
67     PUSHUP(id);
68 }
69 int main()
70 {
71     scanf("%d%d" , &n , &q);
72     Build(ROOT);
73     char cmd;
74     LL a , b , c;
75     while(q--)
76     {
77         scanf(" %c" , &cmd);
78         if(cmd == Q)
79         {
80             scanf("%lld%lld" , &a , &b);
81             printf("%lld\n" , Query(ROOT , a , b));
82         }
83         else
84         {
85             scanf("%lld%lld%lld" , &a , &b , &c);
86             Update(ROOT , a , b , c);
87         }
88     }
89 }
View Code

 

POJ3468-A Simple Problem with Integers(区间更新 + SegmentTree || SplayTree || BinaryIndexTree)

标签:eal   str   char   log   style   cee   技术分享   memset   show   

原文地址:http://www.cnblogs.com/jianglingxin/p/6621812.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!