hdu 1698 Just a Hook

来源:互联网 发布:淘宝退货被拒绝怎么办 编辑:程序博客网 时间:2024/05/16 09:26
线段树求整个区间的和//#pragma comment(linker, "/STACK:1024000000,1024000000")#include <iostream>#include <stack>#include <queue>#include <cstdio>#include <cstdlib>#include <cmath>#include <set>#include <vector>#include <cstring>#include <algorithm>#define INF 0x3fffffff#define N 100010#define M (N << 2)#define LL long long#define mod 95041567using namespace std;struct Node{    int set;    int sum;    int l, r;};Node p[M];void build(int rt, int l, int r){    p[rt].l = l;    p[rt].r = r;    p[rt].set = 0;    if(l == r){        p[rt].sum = 1;        return ;    }    int mid = (r - l) / 2 + l;    int lc = rt << 1;    int rc = lc + 1;    build(lc, l, mid);    build(rc, mid + 1, r);    p[rt].sum = p[lc].sum + p[rc].sum;}void pushdown(int rt){    if(! p[rt].set) return ;    int lc = rt << 1;    int rc = lc + 1;    p[lc].set = p[rc].set = p[rt].set;    p[lc].sum = p[lc].set * (p[lc].r - p[lc].l + 1);    p[rc].sum = p[rc].set * (p[rc].r - p[rc].l + 1);    p[rt].set = 0;}void update(int rt, int l, int r, int L, int R, int val){    if(l == L && r == R) {        p[rt].set = val;        p[rt].sum = (R - L + 1) * val;        return ;    }    pushdown(rt);    int mid = (r - l) / 2 + l;    int lc = rt << 1;    int rc = lc + 1;    if(R <= mid) update(lc, l, mid, L, R, val);    else if(L > mid) update(rc, mid + 1, r, L, R, val);    else {        update(lc, l, mid, L, mid, val);        update(rc, mid + 1, r, mid + 1, R, val);    }    p[rt].sum = p[lc].sum + p[rc].sum;}int main() {   // freopen("in.txt", "r", stdin);    int n, m, t, cnt = 0;    scanf("%d", &t);    while(t --){        scanf("%d %d", &n, &m);        build(1, 1, n);        while(m --){            int i, j, val;            scanf("%d %d %d", &i, &j, &val);            update(1, 1, n, i, j, val);        }        printf("Case %d: The total value of the hook is %d.\n", ++ cnt, p[1].sum);    }    return 0;}

原创粉丝点击