zoj3573 Under Attack (线段树)

来源:互联网 发布:程序员面试技巧 知乎 编辑:程序博客网 时间:2024/05/18 22:15
这是ZOJ Monthly, February 2012的C题,比赛时我提交了好几次结果都是Segmentation Fault。我也不知道这是什么错误,检查了好几遍代码也没发现有什么问题。今天又重敲了一遍,提交还是SF。想了想,把数组改大了些,再提交,AC~  但是之前数组的大小已经大于4倍区间了啊,真心不知道为什么。。。
/* * ===================================================================================== * *       Filename:  cc.cpp * *    Description:   * *        Version:  1.0 *        Created:  2012年02月26日 12时29分01秒 *       Revision:  none *       Compiler:  gcc * *         Author:  ahfywff (), ahfywff@163.com *   Organization:   * * ===================================================================================== */#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int maxn = 222222;int dl[maxn<<2], dr[maxn<<2], dm[maxn<<2], dd[maxn<<2];void pushUp(int rt){if (dm[rt<<1] > dm[rt<<1|1]){dl[rt] = dl[rt<<1];dr[rt] = dr[rt<<1];dm[rt] = dm[rt<<1];}else if (dm[rt<<1] < dm[rt<<1|1]){dl[rt] = dl[rt<<1|1];dr[rt] = dr[rt<<1|1];dm[rt] = dm[rt<<1|1];}else{dl[rt] = dl[rt<<1];dr[rt] = dr[rt<<1|1];dm[rt] = dm[rt<<1];}return ;}void pushDown(int rt){if (dd[rt] != 0){dd[rt<<1] += dd[rt];dd[rt<<1|1] += dd[rt];dm[rt<<1] += dd[rt];dm[rt<<1|1] += dd[rt];dd[rt] = 0;}return ;}void build(int l, int r, int rt){dl[rt] = l;dr[rt] = r;dm[rt] = dd[rt] = 0;if (l == r) return ;int m = (l + r) >> 1;build(l, m, rt << 1);build(m + 1, r, rt << 1 | 1);return ;}void update(int L, int R, int d, int l, int r, int rt){if (L <= l && R >= r){dm[rt] += d;dd[rt] += d;return ;}pushDown(rt);int m = (l + r) >> 1;if (L <= m) update(L, R, d, l, m, rt << 1);if (R > m) update(L, R, d, m + 1, r, rt << 1 | 1);pushUp(rt);return ;}int main(){int l, a, b, d;while (scanf("%d", &l) != EOF){build(0, l, 1);while (scanf("%d %d %d", &a, &b, &d)){if (a == -1) break;update(a, b, d, 0, l, 1);}printf("%d %d\n", dl[1], dr[1]);}return 0;}

原创粉丝点击