标签:des style blog http color java os io
解题报告
题意:
原本区间1到n都是1,区间成段改变成一个值,求最后区间1到n的和。
思路:
线段树成段更新,区间去和。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int sum[500000],lz[500000];
void push_up(int root,int l,int r)
{
sum[root]=sum[root*2]+sum[root*2+1];
}
void push_down(int root,int l,int r)
{
if(lz[root]!=-1)
{
int m=(r-l+1);
lz[root*2]=lz[root];
lz[root*2+1]=lz[root];
sum[root*2]=lz[root]*(m-m/2);
sum[root*2+1]=lz[root]*(m/2);
lz[root]=-1;
}
}
void update(int root,int l,int r,int ql,int qr,int v)
{
if(ql>r||qr<l)return ;
if(ql<=l&&r<=qr)
{
lz[root]=v;
sum[root]=v*(r-l+1);
return ;
}
int mid=(l+r)/2;
push_down(root,l,r);
update(root*2,l,mid,ql,qr,v);
update(root*2+1,mid+1,r,ql,qr,v);
push_up(root,l,r);
}
int q_sum(int root,int l,int r ,int ql,int qr)
{
if(ql>r||qr<l)return 0;
if(ql<=l&&r<=qr)return sum[root];
int mid=(l+r)/2;
return q_sum(root*2,l,mid,ql,qr)+q_sum(root*2+1,mid+1,r,ql,qr);
}
int main()
{
int t,i,k,j,ql,qr,a,q,n;
while(~scanf("%d",&t))
{
k=1;
while(t--)
{
memset(lz,-1,sizeof(lz));
memset(sum,0,sizeof(sum));
scanf("%d%d",&n,&q);
for(i=1; i<=n; i++)
update(1,1,n,i,i,1);
for(i=1; i<=q; i++)
{
scanf("%d%d%d",&ql,&qr,&a);
update(1,1,n,ql,qr,a);
}
printf("Case %d: The total value of the hook is %d.\n",k++,q_sum(1,1,n,1,n));
}
}
return 0;
}
1 10 2 1 5 2 5 9 3
Case 1: The total value of the hook is 24.
HDU1698_Just a Hook(线段树/成段更新),布布扣,bubuko.com
标签:des style blog http color java os io
原文地址:http://blog.csdn.net/juncoder/article/details/38454379