HDU

来源:互联网 发布:出版社待遇知乎 编辑:程序博客网 时间:2024/06/09 16:38

题目链接

HDU - 1698

题目大意

n[1,n]1
qabc[a,b]c[1,n]

数据范围

1n1000000q100000
1abn1c3

解题思路

线

详见代码:

#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <set>#include <map>#include <queue>using namespace std;typedef long long LL;const int inf = 1 << 30;const LL INF = 1LL << 60;const int MaxN = 1e5;int T, t;int n, q;int ans;struct segtree{    int l, r;    int sum;}tree[4 * MaxN + 5];int lazy[4 * MaxN + 5];//lazy[rt]表示rt号节点被修改的值是多少void push_up(int rt) {    tree[rt].sum = tree[rt << 1].sum + tree[rt << 1 | 1].sum;}void push_down(int rt) {    if(lazy[rt] > 0) {        tree[rt << 1].sum = (tree[rt << 1].r - tree[rt << 1].l + 1) * lazy[rt];        tree[rt << 1 | 1].sum = (tree[rt << 1 | 1].r - tree[rt << 1 | 1].l + 1) * lazy[rt];        lazy[rt << 1] = lazy[rt];        lazy[rt << 1 | 1] = lazy[rt];        lazy[rt] = 0; //标记下放后清零    }}void Build(int rt, int l, int r) //建树{    lazy[rt] = 0;    tree[rt].l = l, tree[rt].r = r;    if(l == r) {        tree[rt].sum = 1;        return ;    }    int mid = (l + r) >> 1;    Build(rt << 1, l, mid);    Build(rt << 1 | 1, mid + 1, r);    push_up(rt); }void update(int rt, int L, int R, int w){    //如果所更新的区间完全包含节点rt所管辖的区间,直接更新这个区间    //不必在往下更新,节约时间    if(L <= tree[rt].l && tree[rt].r <= R)    {        lazy[rt] = w;        tree[rt].sum = (tree[rt].r - tree[rt].l + 1) * w;        return;    }    push_down(rt);    int mid = (tree[rt].l + tree[rt].r) >> 1;    if(L <= mid) update(rt << 1, L, R, w);    if(R > mid) update(rt << 1 | 1, L, R, w);    push_up(rt);}/*int query(int rt, int L, int R){    if(L <= tree[rt].l && tree[rt].r <= R)         return tree[rt].sum;    push_down(rt);    int mid = (tree[rt].l + tree[rt].r) >> 1;    int res = 0;    if(L <= mid) res += query(rt << 1, L, R);    if(R > mid) res += query(rt << 1 | 1, L, R);    return res;}*/int main(){    t = 0;    scanf("%d", &T);    while(T--) {        ans = 0;        scanf("%d", &n);        scanf("%d", &q);        Build(1, 1, n);        for(int i = 1; i <= q; i++) {            int l, r, w;            scanf("%d %d %d", &l, &r, &w);            update(1, l, r, w);        }        //ans = query(1, 1, n);        //要求区间[1, n]的和,直接输出tree[1].sum不就好了!还去query啥!?        //越做越煞笔!        ans = tree[1].sum;        printf("Case %d: The total value of the hook is %d.\n", ++t, ans);        memset(tree, 0, sizeof(tree));        //注意多组清零,还因此挂了一发    }    return 0;}
原创粉丝点击