题目:http://acm.hdu.edu.cn/showproblem.php?pid=1698
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int tmax=1e5+5;
int n,ql,qr,v,sumv[4*tmax],setv[4*tmax];
int _sum;
void maintain(int x,int l,int r)
{
int lc=x*2,rc=x*2+1;
sumv[x]=0;
if(setv[x]>=0) sumv[x]=setv[x]*(r-l+1);
else sumv[x]=sumv[lc]+sumv[rc];
return;
}
void pushdown(int x)
{
int lc=x*2,rc=x*2+1;
if(setv[x]>=0) //有标记才传递,-1代表没有标记
{
setv[lc]=setv[rc]=setv[x];
setv[x]=-1;
}
return;
}
void update(int x,int l,int r)
{
//printf("%d %d %d\n",x,l,r);
if(ql<=l&&r<=qr) setv[x]=v;
else
{
pushdown(x);
int mid=l+(r-l)/2;
if(ql<=mid) update(x*2,l,mid);
else maintain(x*2,l,mid);
if(mid<qr) update(x*2+1,mid+1,r);
else maintain(x*2+1,mid+1,r);
}
maintain(x,l,r);
return;
}
void query(int x,int l,int r)
{
if(setv[x]>=0)
_sum+=setv[x]*(min(r,qr)-max(l,ql)+1);
else if(ql<=l&&r<=qr)
_sum+=sumv[x];
else
{
int mid=l+(r-l)/2;
if(mid>=ql) query(x*2,l,mid);
if(mid<qr) query(x*2+1,mid+1,r);
}
return;
}
int main()
{
int T,q,i;
scanf("%d",&T);
for(int kase=1;kase<=T;kase++)
{
memset(sumv,0,sizeof(sumv));
memset(setv,-1,sizeof(setv));
scanf("%d%d",&n,&q);
ql=1;qr=n;v=1;
update(1,1,n);
for(i=1;i<=q;i++)
{
scanf("%d%d%d",&ql,&qr,&v);
update(1,1,n);
}
_sum=0;
ql=1;qr=n;
query(1,1,n);
printf("Case %d: The total value of the hook is %d.\n",kase,_sum);
}
return 0;
}