博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1556 线段树或树状数组,插段求点
阅读量:4673 次
发布时间:2019-06-09

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

1、   区间更新,单点查询

2、题意:n个气球,每次给(a,b)区间的气球涂一次色,问最后每个气球各涂了几次。

(1)树状数组

总结:树状数组是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值。

这里改下思路可以用树状数组。在更新(a,b)时,向上更新,将a~n加1,b+1~n减1。查询点时,向下求和即可。

#include
#include
#include
#include
#include
#include
#define F(i,a,b) for (int i=a;i
0) { sum+=c[x]; x-=lowbit(x); } return sum;}int main(){ while(~scanf("%d",&n),n) { mes(c,0); int a,b; FF(i,1,n) { scanf("%d%d",&a,&b); update(a,1); update(b+1,-1); } F(i,1,n) printf("%d ",Sum(i)); printf("%d\n",Sum(n)); } return 0;}
View Code

 (2)线段树+lazy思想

总结:lazy,更新时只到区间,可以节省很多时间。

#include
#include
#include
#include
#include
#include
#define F(i,a,b) for (int i=a;i
>1; build(o<<1,L,mid); build(o<<1|1,mid+1,R);}void update(int o,int l,int r,int L,int R){ if(l<=L&&R<=r) { c[o]++; return ; } //关键:只更新到区间,一开始更新到每个单独的点,果断T了,//然后用l==L&&R==r,又果断MLE int mid=(L+R)>>1; if(mid
>1; query(o<<1,L,mid); query(o<<1|1,mid+1,R);}int main(){ while(~scanf("%d",&n) ,n ) { build(1,1,n); fill(ans+1,ans+1+n,0); //fil函数 int a,b; FF(i,1,n) { scanf("%d%d",&a,&b); update(1,a,b,1,n); } query(1,1,n); F(i,1,n) printf("%d ",ans[i]); printf("%d\n",ans[n]); } return 0;}
View Code

转载于:https://www.cnblogs.com/sbfhy/p/6005338.html

你可能感兴趣的文章
python基础(三)
查看>>
GraphQL实战经验和性能问题的解决方案
查看>>
MySql大数据量恢复
查看>>
java-字符串反转
查看>>
获取一个目录下的所有文件
查看>>
微软发布Sample Browser for Windows 8版:5000示例代码,"触手可及"
查看>>
Windows 10 使用问题
查看>>
linux xargs命令
查看>>
用CSS3实现图像风格
查看>>
转载--黎曼
查看>>
mysql的建表语句
查看>>
免费的HTML5版uploadify
查看>>
机器学习之路:python 集成分类器 随机森林分类RandomForestClassifier 梯度提升决策树分类GradientBoostingClassifier 预测泰坦尼克号幸存者...
查看>>
通过onkeydown事件来控制只允许数字
查看>>
Python实现常用的数据结构
查看>>
snort简介以及在Ubuntu下的安装
查看>>
从SVN资源库下载项目
查看>>
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别
查看>>
php克隆 自动加载
查看>>
删除同目录下面txt文件(利用os,fnmacth模块)
查看>>