标签:des style blog http io ar color os sp
1 10 2 1 5 2 5 9 3
Case 1: The total value of the hook is 24.
题意很简单,求总区间的和。每次更新时不要更新到底层就行,更新完成时顺便求和就行。最后f[1].s即是ans.
#include<cstdio>
#include<cmath>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll __int64
#define N 200005
struct node
{
int l,r;
int s,v,f; //区间和、该区间的单个点的值、f为不零则该区间有待更新值
}f[N*3];
void creat(int t,int l,int r)
{
f[t].l=l;
f[t].r=r;
f[t].v=1;
f[t].f=0;
if(l==r)
{
f[t].s=1;
return ;
}
int tmp=t<<1,mid=(l+r)>>1;
creat(tmp,l,mid);
creat(tmp|1,mid+1,r);
f[t].s=f[tmp].s+f[tmp|1].s;
}
void update(int t,int l,int r,int v)
{
int tmp=t<<1,mid=(f[t].l+f[t].r)>>1;
if(f[t].l==l&&f[t].r==r)
{
f[t].v=f[t].f=v;
f[t].s=(r-l+1)*v;
return ;
}
if(f[t].f) //向下更新
{
f[tmp].f=f[tmp|1].f=f[t].f;
f[tmp].v=f[tmp|1].v=f[t].f;
f[tmp].s=(f[tmp].r-f[tmp].l+1)*f[t].f;
f[tmp|1].s=(f[tmp|1].r-f[tmp|1].l+1)*f[t].f;
f[t].f=0;
}
if(r<=mid)
update(tmp,l,r,v);
else if(l>mid)
update(tmp|1,l,r,v);
else
{
update(tmp,l,mid,v);
update(tmp|1,mid+1,r,v);
}
f[t].s=f[tmp].s+f[tmp|1].s; //向上求和
f[t].f=0;
}
int main()
{
int T,i,n,q,cnt=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&q);
creat(1,1,n);
while(q--)
{
int l,r,v;
scanf("%d%d%d",&l,&r,&v);
update(1,l,r,v);
}
printf("Case %d: The total value of the hook is %d.\n",cnt++,f[1].s);
}
return 0;
}
hdu 1698 Just a Hook (成段更新+总区间求和)
标签:des style blog http io ar color os sp
原文地址:http://blog.csdn.net/u011721440/article/details/41629659