您的位置:首页 > 其它

成段更新总区间求和.HDU-1698 Just…

2014-03-20 13:00 411 查看
HDU-1698 Just a
Hook
题目大意:给定 N 根木棒,编号 1 到 N
进行管理。有三种颜色 1、2、3,
分别对应值 1、2、3,初始化为 1。
现在要求对一段连续编号的木棒进行染色,例:i j
z 表示将 i 到 j 号木棒染成颜色 z。
求 进行 M 次操作后总值。

#include <iostream>
#include <cstdio>
#define LL(x) ((x)<<1)
#define RR(x) ((x)<<1|1)
#define Max 100005
int n;
struct Seg_Tree
{
int left,right;
int col;

//该段的颜色
1、2、3;标记-1 表示该段不为纯色。
}tt[Max<<2];

void build(int left,int right,int idx)
{
tt[idx].left =
left;
tt[idx].right =
right;
tt[idx].col = 1;

//初始化时所有存在的线段都为1
if(left == right)

return ;
int mid = (left +
right)/2;

build(left,mid,LL(idx));

build(mid+1,right,RR(idx));
}

void update(int left,int right,int col,int idx)
//从left到right更改为col
{
/
int mid = (tt[idx].left
+ tt[idx].right)/2;
if(right
<= mid)
{

return
query(left,right,LL(idx));

}

else if(left
> mid)

{

return
query(left,right,RR(idx));

}

else

{

return
query(left,mid,LL(idx)) + query(mid+1,right,RR(idx));

}
}

int main()
{

//freopen("in.txt","r",stdin);

int T;

scanf("%d",&T);

for(int
cas=0;cas<T;cas++)

{

int n , m ;

scanf("%d",&n);

build(1,n,1);

scanf("%d",&m);

while(m --)

{

int
left,right,col;

scanf("%d%d%d",&left,&right,&col);

update(left,right,col,1);

}

printf("Case %d: The
total value of the hook is %d.\n",cas+1,query(1,n,1));

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: