博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 1698(线段树)
阅读量:4885 次
发布时间:2019-06-11

本文共 1655 字,大约阅读时间需要 5 分钟。

线段树的区间改变,基本板子。线段树学了一下午加一晚上,推荐一个大佬的博客,写的非常好:

#include 
#include
#include
#include
using namespace std;const int maxn=100000+100;struct setree{ int val,am;}tree[maxn*3];int m,n;int a[maxn];void build(int root,int a[],int l,int r){ tree[root].am=0; if(l==r) { tree[root].val=a[l]; return; } int mid=(l+r)/2; build(root*2,a,l,mid); build(root*2+1,a,mid+1,r); tree[root].val=tree[root*2].val+tree[root*2+1].val;}void update(int root,int l,int r,int p,int q,int vval){ if(q
r) return; if(l>=p&&r<=q) { tree[root].val=vval*(r-l+1); tree[root].am=vval; return; } int mid=(l+r)/2; int x=root; if(tree[x].am) { tree[2*x].am=tree[x].am;//改了改延迟标记,使它等于要变成的数 tree[2*x+1].am=tree[x].am; tree[2*x].val=tree[x].am*(mid-l+1);//区间的值等于区间长度乘以要变成的值 tree[2*x+1].val=tree[x].am*(r-mid); tree[x].am=0; } update(root*2,l,mid,p,q,vval); update(root*2+1,mid+1,r,p,q,vval); tree[root].val=tree[root*2].val+tree[root*2+1].val;}int t;int main(){ scanf("%d",&t); for(int zz=1;zz<=t;zz++) { scanf("%d",&n); for(int i=1;i<=n;i++) a[i]=1; build(1,a,1,n); scanf("%d",&m); for(int i=1;i<=m;i++) { int aa,bb,cc; scanf("%d%d%d",&aa,&bb,&cc); update(1,1,n,aa,bb,cc); } printf("Case %d: The total value of the hook is %d.\n",zz,tree[1].val); } return 0;}

 

http://www.cnblogs.com/TenosDoIt/p/3453089.html

转载于:https://www.cnblogs.com/Wangwanxiang/p/7265850.html

你可能感兴趣的文章
MySQL-ERROR 2003
查看>>
JavaScript内置对象
查看>>
ER图是啥?
查看>>
08.路由规则中定义参数
查看>>
Pandas截取列部分字符,并据此修改另一列的数据
查看>>
java.lang.IllegalArgumentException
查看>>
【Spark】编程实战之模拟SparkRPC原理实现自定义RPC
查看>>
接口实现观察者模式
查看>>
四则运算完结篇
查看>>
Objective-C中的类目,延展,协议
查看>>
Introduction Sockets to Programming in C using TCP/IP
查看>>
navigationController pop回之前控制器
查看>>
Web.config配置文件详解(新手必看)
查看>>
关于学习的一些感悟
查看>>
制作无广告启动盘
查看>>
python使用httplib2访问REST服务的例子
查看>>
经典代码(01)
查看>>
生成ico格式图标
查看>>
并查集hdu4424
查看>>
jdbc之分页查询
查看>>