您的位置:首页 > 其它

HDU 1698 JUST A HOOK(线段树)

2011-08-15 17:41 288 查看
原文:http://blog.acmj1991.com/?p=681

题意:dota…类似于给区间染色,后面的颜色覆盖前面的颜色,每种都有自己的价值。问最后总价值

思路:线段树更新线段的值,求总和

以为是从0开始….然后悲剧了

#include<stdio.h>
#include<string.h>
#define L(x)(x<<1)
#define R(x)(x<<1|1)

#define maxN 100010
int num;
struct node{
int l,r,k;
}po[4*maxN];

void Build_tree(int st,int l,int r)
{
po[st].l=l,po[st].r=r,po[st].k=1;
if(l==r)return ;
int mid=(l+r)>>1;
Build_tree(L(st),l,mid);
Build_tree(R(st),mid+1,r);
}
void add(int l,int r,int value,int st)
{
if(po[st].l==l&&po[st].r==r)
{
po[st].k=value;
return ;
}
if(po[st].k==value)return ;
if(po[st].k>0)po[R(st)].k=po[L(st)].k=po[st].k;
po[st].k=0;
int mid=(po[st].r+po[st].l)>>1;
if(r<=mid){
add(l,r,value,L(st));
}
else if(l>mid){
add(l,r,value,R(st));
}
else{
add(l,mid,value,L(st));
add(mid+1,r,value,R(st));
}
}
int get_sum(int st)
{
if(po[st].k!=0||po[st].r==po[st].l)
return po[st].k*(po[st].r-po[st].l+1);
return get_sum(L(st))+get_sum(R(st));
}

int main()
{
int t,n,m,x,y,z;
scanf("%d",&t);
for(int j=1;j<=t;j++)
{
printf("Case %d: The total value of the hook is ",j);
num=0;
scanf("%d%d",&n,&m);
Build_tree(1,1,n);
while(m--){
scanf("%d%d%d",&x,&y,&z);
add(x,y,z,1);
}
printf("%d.\n",get_sum(1));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: