E - Just a Hook HDU - 1698

Posted zstofljq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了E - Just a Hook HDU - 1698相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698

通过这个题练习了基本的Pushdown的操作

参考着蓝书的模板敲了一下,需要修改的地方就是:这里的区间修改是直接改变值而不是增加值

把+=改成=即可。

技术图片
 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 100005
18 #define inf 0x3f3f3f3f
19 #define ll long long
20 struct SegmentTree
21 
22     int l, r;
23     ll data;
24     ll add;
25     #define l(x) t[x].l
26     #define r(x) t[x].r
27     #define data(x) t[x].data
28     #define add(x) t[x].add
29  t[N * 4 + 5];
30 ll n, m, cnt;
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) = 1;
39         return;
40     
41     int m = (l + r) / 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         data(2 * p) = add(p) * (r(2 * p) - l(2 * p) + 1);
52         data(2 * p + 1) = add(p) * (r(2 * p + 1) - l(2 * p + 1) + 1);
53         add(2 * p) = add(p);
54         add(2 * p + 1) = add(p);
55         add(p) = 0;
56     
57 
58 void change(int p,int l,int r,int d)
59 
60     if(l<=l(p)&&r>=r(p))
61     
62         data(p) = (r(p) - l(p) + 1) * d;
63         add(p) = d;
64         return;
65     
66     spread(p);
67     int m = (l(p) + r(p)) / 2;
68     int ls = 2 * p, rs = 2 * p + 1;
69     if(l<=m)
70         change(ls, l, r, d);
71     if(r>m)
72         change(rs, l, r, d);
73     data(p) = data(ls) + data(rs);
74 
75 int main()
76 
77     fast;
78     cin >> cnt;
79     forab(cas,1,cnt)
80     
81         cin >> n >> m;
82         build(1, 1, n);
83         forab(i,1,m)
84         
85             int x, y, z;
86             cin >> x >> y >> z;
87             change(1, x, y, z);
88         
89         cout << "Case " << cas << ": The total value of the hook is " <<t[1].data<< "." << endl;
90     
91 
92 /*
93 1
94 10
95 2
96 1 5 2
97 5 9 3
98  */
View Code

 

以上是关于E - Just a Hook HDU - 1698的主要内容,如果未能解决你的问题,请参考以下文章

hdu1698 Just a Hook 区间修改(模板题)

Just a Hook HDU - 1698Just a Hook HDU - 1698 线段树区间替换

hdu 1698 Just a Hook

Just a Hook HDU - 1698

HDU - 1698 Just a Hook

HDU - 1698 Just a Hook