原文: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));
}
}
本文介绍了一种利用线段树进行区间染色问题的解决方法,包括问题背景、思路、代码实现和结果展示。代码示例中详细展示了如何通过线段树更新区间颜色并计算最终总价值。

4万+

被折叠的 条评论
为什么被折叠?



