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;
}