hdu 1968 Just a Hook 线段树区间更新
2016-07-05 20:07
363 查看
线段树区间更新
题意:胖子有一条大金属棒,大金属棒由n个小金属棒组成,每次操作将一个区间的小金属棒变成金银铜三者之一,最后取出所有区间的金属棒总价值,注意,金属棒的初始值1
思路:每次把该区间内的值更新为该值,并更新父节点
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#define maxn 100100
using namespace std;
int sto[maxn<<2];
int up[maxn<<2];
void Insert(int left,int right,int o)
{
up[o]=0;
if(left==right)
{
sto[o]=1;
return ;
}
int lso=o<<1;
int mid=(left+right)>>1;
Insert(left,mid,lso);
Insert(mid+1,right,lso|1);
sto[o]=sto[lso]+sto[lso|1];
}
void changedata(int num,int o)//更新节点
{
if(up[o]!=0)
{
int lso=o<<1;
up[lso]=up[o];
up[lso|1]=up[o];
sto[lso]=(num-(num>>1))*up[o];
sto[lso|1]=(num>>1)*up[o];
up[o]=0;
}
}
int getdata(int left,int right,int o,int begin,int end,int val)
{
if(begin<=left&&right<=end)//找到区间更新区间
{
up[o]=val;
sto[o]=(right-left+1)*val;
return sto[o];
}
changedata(right-left+1,o);
int lso=o<<1;
int mid=(left+right)>>1;
int ans=0;
if(begin<=mid)ans+=getdata(left,mid,lso,begin,end,val);
if(mid<end)ans+=getdata(mid+1,right,lso|1,begin,end,val);
sto[o]=sto[lso]+sto[lso|1];
return ans;
}
int main()
{
int t,n,m,ans=0;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
Insert(1,n,1);//初始值全为1
int x,y,z;
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&x,&y,&z);
int k=getdata(1,n,1,x,y,z);
}
printf("Case %d: The total value of the hook is %d.\n",++ans,sto[1]);
}
return 0;
}
题意:胖子有一条大金属棒,大金属棒由n个小金属棒组成,每次操作将一个区间的小金属棒变成金银铜三者之一,最后取出所有区间的金属棒总价值,注意,金属棒的初始值1
思路:每次把该区间内的值更新为该值,并更新父节点
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#define maxn 100100
using namespace std;
int sto[maxn<<2];
int up[maxn<<2];
void Insert(int left,int right,int o)
{
up[o]=0;
if(left==right)
{
sto[o]=1;
return ;
}
int lso=o<<1;
int mid=(left+right)>>1;
Insert(left,mid,lso);
Insert(mid+1,right,lso|1);
sto[o]=sto[lso]+sto[lso|1];
}
void changedata(int num,int o)//更新节点
{
if(up[o]!=0)
{
int lso=o<<1;
up[lso]=up[o];
up[lso|1]=up[o];
sto[lso]=(num-(num>>1))*up[o];
sto[lso|1]=(num>>1)*up[o];
up[o]=0;
}
}
int getdata(int left,int right,int o,int begin,int end,int val)
{
if(begin<=left&&right<=end)//找到区间更新区间
{
up[o]=val;
sto[o]=(right-left+1)*val;
return sto[o];
}
changedata(right-left+1,o);
int lso=o<<1;
int mid=(left+right)>>1;
int ans=0;
if(begin<=mid)ans+=getdata(left,mid,lso,begin,end,val);
if(mid<end)ans+=getdata(mid+1,right,lso|1,begin,end,val);
sto[o]=sto[lso]+sto[lso|1];
return ans;
}
int main()
{
int t,n,m,ans=0;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
Insert(1,n,1);//初始值全为1
int x,y,z;
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&x,&y,&z);
int k=getdata(1,n,1,x,y,z);
}
printf("Case %d: The total value of the hook is %d.\n",++ans,sto[1]);
}
return 0;
}
相关文章推荐
- GNU C 、ANSI C、标准C、标准c++区别和联系
- 喷码机配合厂线进行标识方案
- jsp学习总结
- 硬件驱动程序的知识点滴
- [bzoj3953] [WF2013]Self-Assembly
- Mybatis数据操作
- php发送邮箱
- 跟我学Android之九 日期时间组件
- 跟我学Android之九 日期时间组件
- 跟我学Android之九 日期时间组件
- shell脚本:收集系统和各种服务的状态信息
- prop()和attr()获取a 标签href值的重大区别
- Codeforces Round #285 (Div. 1) A. Misha and Forest 拓扑排序
- 树莓派IoT 学习3 修改静态ip
- 小字符喷码机和高解析喷码机的区别
- •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
- CreatCompatibleDC
- 寻找下一个结点
- FastDFS学习总结(1)--FastDFS安装和部署
- 1692.cover