C - A Simple Problem with Integers POJ - 3468 -- 延迟标记

题目链接:http://poj.org/problem?id=3468

很基础的一道延迟标记的题

需要注意的是数据得到了加强,故这里要用__int64 

C - A Simple Problem with Integers POJ - 3468 -- 延迟标记
  1 #include <cmath>
  2 #include <queue>
  3 #include <string>
  4 #include <cstdio>
  5 #include <cstring>
  6 #include <iostream>
  7 #include <algorithm>
  8 #define forn(i, n) for (int i = 0; i < (n); i++)
  9 #define forab(i, a, b) for (int i = (a); i <= (b); i++)
 10 #define forba(i, b, a) for (int i = (b); i >= (a); i--)
 11 #define mset(a, n) memset(a, n, sizeof(a))
 12 #define fast ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
 13 #define P pair<int,int>
 14 #define fi first
 15 #define se second
 16 using namespace std;
 17 #define N 100000
 18 #define inf 0x3f3f3f3f
 19 #define ll long long
 20 struct SegmentTree
 21 {
 22     int l, r;
 23     __int64 data, add;
 24     #define l(x) t[x].l
 25     #define r(x) t[x].r
 26     #define data(x) t[x].data
 27     #define add(x) t[x].add
 28 } t[N * 4 + 5];
 29 __int64 temp[N], ans;
 30 int n, m;
 31 void build(int p,int l,int r)
 32 {
 33     l(p) = l;
 34     r(p) = r;
 35     add(p) = 0;
 36     if(l==r)
 37     {
 38         data(p) = temp[l];
 39         return;
 40     }
 41     int m = (r + l) / 2;
 42     int ls = 2 * p, rs = 2 * p + 1;
 43     build(ls, l, m);
 44     build(rs, m + 1, r);
 45     data(p) = data(ls) + data(rs);
 46 }
 47 void spread(int p)
 48 {
 49     if(add(p))
 50     {
 51         int ls = 2 * p, rs = ls + 1;
 52         data(ls) += add(p) * (r(ls) - l(ls) + 1);
 53         data(rs) += add(p) * (r(rs) - l(rs) + 1);
 54         add(ls) += add(p);
 55         add(rs) += add(p);
 56         add(p) = 0;
 57     }
 58 }
 59 void change(int p,int l,int r,__int64 d)
 60 {
 61     if(l<=l(p)&&r>=r(p))
 62     {
 63         data(p) += (__int64)d * (r(p) - l(p) + 1);
 64         add(p) += d;
 65         return;
 66     }
 67     spread(p);
 68     int m = (l(p) + r(p)) / 2;
 69     int ls = 2 * p, rs = 2 * p + 1;
 70     if(l<=m)
 71         change(ls, l, r, d);
 72     if(r>m)
 73         change(rs, l, r, d);
 74     data(p) = data(ls) + data(rs);
 75 }
 76 __int64 Query(int p,int l,int r)
 77 {
 78     if(l<=l(p)&&r>=r(p))
 79     {
 80         return data(p);
 81     }
 82     spread(p);
 83     int m = (l(p) + r(p)) / 2;
 84     int ls = 2 * p, rs = 2 * p + 1;
 85     ll val = 0;
 86     if(l<=m)
 87         val += Query(ls, l, r);
 88     if(r>m)
 89         val += Query(rs, l, r);
 90     return val;
 91 }
 92 int main()
 93 {
 94     scanf("%d%d", &n, &m);
 95     forab(i, 1, n) scanf("%I64d", temp + i);
 96     build(1, 1, n);
 97     forab(i,1,m)
 98     {
 99         getchar();
100         char c;
101         int a, b;
102         scanf("%c %d %d", &c, &a, &b);
103         if(c=='Q')
104         {
105             printf("%I64d\n", Query(1, a, b));
106         }
107         else
108         {
109             __int64 x;
110             scanf("%I64d", &x);
111             change(1, a, b, x);
112         }
113     }
114 }
View Code

 

上一篇:leetcode-mid-math-371. Sum of Two Integers-NO-???


下一篇:test