HDU
来源:互联网 发布:报纸排版软件 adobe 编辑:程序博客网 时间:2024/06/07 03:12
HDU - 1698 http://acm.hdu.edu.cn/showproblem.php?pid=1698
思路:区间更新 直接整段区间求和
#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int maxn = 100000 + 10;int n,m;struct node{ int v,ltag,l,r,len;}tree[maxn << 2];void iset(int id,int l,int r){ tree[id].l = l; tree[id].r = r; tree[id].ltag = 0; tree[id].v = 1; tree[id].len = r-l+1;}int btree(int l,int r,int id){ iset(id,l,r); if(l == r) return tree[id].v; int mid = l+r>>1; btree(l,mid,id<<1); btree(mid+1,r,id<<1|1); return tree[id].v = tree[id<<1].v + tree[id<<1|1].v;}void uselazy(int lazy,int id){ tree[id].ltag = lazy; tree[id].v = lazy*tree[id].len;}int pushtag(int id){ int k = id; int lazy = tree[id].ltag; if(lazy) { uselazy(lazy,id<<1); uselazy(lazy,id<<1|1); tree[k].ltag = 0; } return 0;}int updata(int ql,int qr,int v,int id){ int l = tree[id].l, r = tree[id].r; if(l == ql && r == qr) {tree[id].ltag = v; return tree[id].v = v*tree[id].len;} pushtag(id); int mid = l+r>>1; if(qr <= mid) updata(ql,qr,v,id<<1); else if(ql > mid) updata(ql,qr,v,id<<1|1); else updata(ql,mid,v,id<<1), updata(mid+1,qr,v,id<<1|1); return tree[id].v = tree[id<<1].v + tree[id<<1|1].v;}int main(){ int t; scanf("%d",&t); for(int kase = 1; kase <= t; kase ++) { scanf("%d%d",&n,&m); btree(1,n,1); for(int i = 0; i < m ; i++) { int a,b,v; scanf("%d%d%d",&a,&b,&v); updata(a,b,v,1); } printf("Case %d: The total value of the hook is %d.\n",kase,tree[1].v); } return 0;}