线段树模板
2018-02-15 22:20
615 查看
#define maxn 100005 #define mid ((l+r)>>1) #define lson rt<<1, l, mid #define rson rt<<1|1, mid+1, r #define ll long long int len[maxn<<2], lazy[maxn<<2], sum[maxn<<2], mx[maxn<<2]; int a, b, c, n, m; void pushup(int rt) { sum[rt] = sum[rt<<1] + sum[rt<<1|1]; } void pushdown(int rt){ if(lazy[rt]) { lazy[rt<<1] = lazy[rt]; lazy[rt<<1|1] = lazy[rt]; sum[rt<<1] = lazy[rt] * len[rt<<1]; sum[rt<<1|1] = lazy[rt] * len[rt<<1|1]; lazy[rt] = 0; } } void build(int rt, int l, int r){ lazy[rt] = 0; len[rt] = (r-l+1); if( l == r) { sum[rt] = 1; return;} build(lson); build(rson); pushup(rt); } void update(int rt, int l, int r) { if( a > r || b < l ) return; if( a <= l && b >= r) /**a l r b*/ { lazy[rt] = c; sum[rt] = c * len[rt]; return; } pushdown(rt); update(lson); update(rson); pushup(rt); } ll query(int rt, int l, int r) { if( a > r || b < l ) return 0; if( a <= l && b >= r) return sum[rt]; pushdown(rt); ll ans = 0; ans += query(lson); ans += query(rson); return ans; } int main() { int t, ww = 1; scanf("%d", &t); while(t--) { scanf("%d %d", &n,&m); build(1, 1, n); while(m--) { scanf("%d %d %d", &a, &b, &c); update(1, 1, n); //cout << sum[1] << endl; } printf("Case %d: The total value of the hook is %d.\n", ww++, sum[1]); } }
相关文章推荐
- 线段树[模板]
- 线段树模板(来自胡浩大牛)
- HDU-1754 I Hate It (线段树裸题 splay模板 单点修改 区间询问最大值)
- 线段树详解+模板
- kuangbin专题七:A题 HDU 1166 敌兵布阵(单点更新,区域查询求和的线段树模板)
- 线段树模板
- 【南阳OJ 116】士兵杀敌(二)(线段树)(更改某一点的值&查找总和 模板题)
- 线段树区间合并模板-杭电1540
- 【线段树模板】
- 线段树模板
- 洛谷P3372 【模板】线段树 1(lazy)
- (模板)线段树 (区间更新,区间求和)
- POJ3468 线段树模板
- 【模板】线段树
- hdu 1698 线段树的区间修改 模板~~
- 线段树模板
- 【线段树成段更新-模板】【HDU1698】Just a Hook
- 线段树模板
- HDU 1698 线段树成段更新模板
- 数组机器人--(线段树模板题)