您的位置:首页 > 其它

HDU 1698 Just a Hook

2016-03-14 21:47 246 查看
题意:给你一个数为n的区间。区间的起始价值为1。然后要进行m次操作。操作即为改变给定区间的值(范围为1-3),要你计算终于的权值

思路:就是线段树的区间跟新了

AC代码:

#include <iostream>
#include<cstdio>
using namespace std;

struct node
{
int value;
int a,b;
}tree[300010];

void maketree(int i,int a,int b)
{
tree[i].a=a;
tree[i].b=b;
tree[i].value=1;
if(a==b)
{
return ;
}
int mid=(a+b)/2;
maketree(2*i,a,mid);
maketree(2*i+1,mid+1,b);
}

void update(int i,int a,int b,int v)
{
if(tree[i].value==v) //假设该区域内值一样则不用改动
return ;
if(tree[i].a==a && tree[i].b==b )//假设改动区域一样,则直接把该区域的值改为指定值
{
tree[i].value=v;
return ;
}
if(tree[i].value !=-1) //假设是纯色的,而改动区域不一致。则先将其子区域置为父值。对子区域进行操作
{
tree[2*i].value=tree[2*i+1].value=tree[i].value;
tree[i].value =-1; //标记为杂色
}
int mid=(tree[i].a+tree[i].b)/2; //以下一系列行为都是在父区间为杂色时对子区间进行的操作
if(a>mid)            //更新区间为右区间
update(2*i+1,a,b,v);
else if(b<=mid)      //更新区间为左区间
update(2*i,a,b,v);
else                 //否则左右区间皆更新
{
update(2*i,a,mid,v);
update(2*i+1,mid+1,b,v);
}

}

int search(int i) //计算总值
{
if(tree[i].value!=-1)
return (tree[i].b-tree[i].a+1)*tree[i].value;
else
return search(i*2)+search(i*2+1);
}

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