zoukankan      html  css  js  c++  java
  • hihocoder1080 更为复杂的买卖房屋姿势

    思路:

    线段树区间修改,需要使用两个懒标记set和add。处理好两个标记的优先级即可(set之前的set和add是没有作用的)。

    实现:

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 const int N = 100005;
     5 
     6 int tree[N << 2], lazy_set[N << 2], lazy_add[N << 2], a[N], n, q;
     7 
     8 void build(int num, int l, int r)
     9 {
    10     if (l == r) { tree[num] = a[l]; return; }
    11     int m = l + r >> 1;
    12     build(num << 1, l, m);
    13     build(num << 1 | 1, m + 1, r);
    14     tree[num] = tree[num << 1] + tree[num << 1 | 1];
    15 }
    16 
    17 void pushdown(int num, int cl, int cr)
    18 {
    19     if (lazy_set[num])
    20     {
    21         tree[num << 1] = lazy_set[num] * cl;
    22         tree[num << 1 | 1] = lazy_set[num] * cr;
    23         lazy_set[num << 1] = lazy_set[num];
    24         lazy_set[num << 1 | 1] = lazy_set[num];
    25         lazy_add[num << 1] = 0;
    26         lazy_add[num << 1 | 1] = 0;
    27         lazy_set[num] = 0;
    28     }
    29     if (lazy_add[num])
    30     {
    31         tree[num << 1] += lazy_add[num] * cl;
    32         tree[num << 1 | 1] += lazy_add[num] * cr;
    33         lazy_add[num << 1] += lazy_add[num];
    34         lazy_add[num << 1 | 1] += lazy_add[num];
    35         lazy_add[num] = 0;        
    36     }
    37 }
    38 
    39 void update(int num, int l, int r, int x, int y, int p, int t)
    40 {
    41     if (x <= l && y >= r)
    42     {
    43         if (t == 0)
    44         {
    45             tree[num] += (r - l + 1) * p;
    46             lazy_add[num] += p;
    47         }
    48         else
    49         {
    50             tree[num] = (r - l + 1) * p; 
    51             lazy_set[num] = p;
    52             lazy_add[num] = 0;
    53         }
    54         return;
    55     }
    56     int m = l + r >> 1;
    57     pushdown(num, m - l + 1, r - m);
    58     if (x <= m) update(num << 1, l, m, x, y, p, t);
    59     if (y >= m + 1) update(num << 1 | 1, m + 1, r, x, y, p, t);
    60     tree[num] = tree[num << 1] + tree[num << 1 | 1];
    61 }
    62 
    63 int query(int num, int l, int r, int x, int y)
    64 {
    65     if (x <= l && y >= r) return tree[num];
    66     int m = l + r >> 1;
    67     pushdown(num, m - l + 1, r - m);
    68     int ans = 0;
    69     if (x <= m) ans += query(num << 1, l, m, x, y);
    70     if (y >= m + 1) ans += query(num << 1 | 1, m + 1, r, x, y);
    71     return ans;
    72 }
    73 
    74 int main()
    75 {
    76     ios::sync_with_stdio(false);
    77     cin >> n >> q;
    78     for (int i = 1; i <= n + 1; i++) cin >> a[i];
    79     build(1, 1, n + 1);
    80     int x, y, t, p;
    81     for (int i = 1; i <= q; i++)
    82     {
    83         cin >> t >> x >> y >> p;
    84         x++; y++;
    85         update(1, 1, n + 1, x, y, p, t);
    86         cout << query(1, 1, n + 1, 1, n + 1) << endl;
    87     }
    88     return 0;
    89 }
  • 相关阅读:
    什么是IOC
    spring的作用
    什么是spring框架?
    72
    71
    70
    69
    68
    67
    66
  • 原文地址:https://www.cnblogs.com/wangyiming/p/9866206.html
Copyright © 2011-2022 走看看