HDU 1698 Just a Hook
2012-04-06 01:48
302 查看
HDU_1698
直接用线段树对区间成段更新即可。
直接用线段树对区间成段更新即可。
#include<stdio.h> #include<string.h> #define MAXD 100010 int N, M, flag[4 * MAXD], sum[4 * MAXD]; void build(int cur, int x, int y) { int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1; flag[cur] = 0, sum[cur] = 1; if(x == y) return ; build(ls, x, mid); build(rs, mid + 1, y); } void init() { scanf("%d%d", &N, &M); build(1, 1, N); } void pushdown(int cur, int x, int y) { if(flag[cur]) { int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1; flag[ls] = flag[rs] = flag[cur]; sum[ls] = (mid - x + 1) * flag[cur]; sum[rs] = (y - mid) * flag[cur]; flag[cur] = 0; } } void update(int cur) { sum[cur] = sum[cur << 1] + sum[(cur << 1) | 1]; } void change(int cur, int x, int y, int s, int t, int v) { int mid = (x + y) >> 1, ls = cur << 1, rs = (cur << 1) | 1; if(x >= s && y <= t) { flag[cur] = v; sum[cur] = v * (y - x + 1); return ; } pushdown(cur, x, y); if(mid >= s) change(ls, x, mid, s, t, v); if(mid + 1 <= t) change(rs, mid + 1, y, s, t, v); update(cur); } void solve() { int i, x, y, z; for(i = 0; i < M; i ++) { scanf("%d%d%d", &x, &y, &z); change(1, 1, N, x, y, z); } printf("The total value of the hook is %d.\n", sum[1]); } int main() { int t, tt; scanf("%d", &t); for(tt = 0; tt < t; tt ++) { init(); printf("Case %d: ", tt + 1); solve(); } return 0; }
相关文章推荐
- hdu1698-Just a Hook
- HDU 1698 (线段树 区间更新) Just a Hook
- Just a Hook(hdu 1698)
- hdu 1698 Just a Hook
- HDU 1698 Just a Hook 线段树 成段替换
- HDU 1698 Just a Hook 线段树
- HDU 1698 Just a Hook 线段树成段更新
- hdu 1698 - Just a Hook(线段树区间更新)
- Just a Hook HDU - 1698(线段树区间更新)
- HDU - 1698 Just a Hook
- HDU 1698 Just a Hook 水过
- Just a Hook - HDU 1698 线段树
- HDU 1698 Just a Hook // 线段树 区间更新
- HDU 1698 Just a Hook (线段树区间更新)
- hdu 1698 Just a Hook
- HDU 1698 Just a Hook(线段树区间替换)
- HDU-1698-Just a Hook-区间更新
- E - Just a Hook HDU - 1698——线段树区间更新+lazy标记
- HDU 1698 Just a Hook (段树更新间隔)
- HDU 题目1698 Just a Hook(线段树)