HDU 4893 线段树
比赛时太大意,斐波拉契数列开小了。
题目大意:1个序列,3种操作,改变序列某个数大小,将序列中连续的一段每个数都变成其最近的斐波拉契数,以及查询序列中某一段的数之和。
解题思路:维护add[]数组表示线段树中每一段的需要改变到斐波拉契数的总和即可,color[]表示该段是否需要改变成斐波拉契,而当需要改变成斐波拉契数时,直接将sum+=add。其余便是线段树基础操作。
#include <cstdio>
#define T 1000005
#define N 100005
long long f[],sum[T],add[T];
int l,r,p;
bool color[T];
void PushDown(int rt){
if(color[rt]){
color[rt]=;
color[rt*]=color[rt*+]=;
sum[rt*]+=add[rt*];
sum[rt*+]+=add[rt*+];
add[rt*]=;
add[rt*+]=;
}
}
void PushUp(int rt){
sum[rt]=sum[rt*]+sum[rt*+];
add[rt]=add[rt*]+add[rt*+];
}
void build(int l, int r, int rt){
sum[rt]=;
color[rt]=;
if(l==r) add[rt]=;
if(l>=r) return;
int m=(l+r)/;
build(l,m,rt*);
build(m+,r,rt*+);
PushUp(rt);
}
void update(int k, int d, int l, int r, int rt){
if(l==r){
color[rt]=;
sum[rt]+=d;
if(sum[rt]<=) add[rt]=-sum[rt];
else{
for(int i=; i<=; i++)
if(f[i]<=sum[rt]&&sum[rt]<f[i+]){
if(sum[rt]-f[i]<=f[i+]-sum[rt])
add[rt]=f[i]-sum[rt];
else
add[rt]=f[i+]-sum[rt];
break;
}
}
return;
}
PushDown(rt);
int m=(l+r)/;
if(k<=m) update(k,d,l,m,rt*);
else update(k,d,m+,r,rt*+);
PushUp(rt);
}
void change(int x, int y, int l, int r, int rt){
if(x<=l&&y>=r){
sum[rt]+=add[rt];
add[rt]=;
color[rt]=;
return;
}
PushDown(rt);
int m=(l+r)/;
if(x<=m&&!color[rt*]) change(x,y,l,m,rt*);
if(y>m&&!color[rt*+]) change(x,y,m+,r,rt*+);
PushUp(rt);
}
long long query(int x, int y, int l, int r, int rt){
if(x<=l&&y>=r) return sum[rt];
PushDown(rt);
int m=(l+r)/;
long long s=;
if(x<=m) s+=query(x,y,l,m,rt*);
if(y>m) s+=query(x,y,m+,r,rt*+);
PushUp(rt);
return s;
}
int main()
{
f[]=f[]=;
for(int i=; i<=; i++)
f[i]=f[i-]+f[i-];
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
build(,n,);
for(int i=; i<m; i++){
scanf("%d%d%d",&p,&l,&r);
switch (p){
case :
update(l,r,,n,);
break;
case :
printf("%I64d\n",query(l,r,,n,));
break;
case :
change(l,r,,n,);
break;
}
}
}
return ;
}
HDU 4893 线段树的更多相关文章
- HDU 4893 线段树的 点更新 区间求和
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- HDU 4893 线段树裸题
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- hdu 4533 线段树(问题转化+)
威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
随机推荐
- openstack安装、卸载与启动
一.安装: 更新: sudo apt-get update sudo apt-get upgrade 安装图形化界面: sudo apt-get install ubuntu-desktop 安装gc ...
- oracle 建立主键与索引【转】
此文转自:http://blog.sina.com.cn/s/blog_439f80c4010094n1.html 创建主键: alter table T add primary key (V) T是 ...
- spoj 375 Query on a tree(树链剖分,线段树)
Query on a tree Time Limit: 851MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Sub ...
- Linux下SVN的一些使用方法总结
Linux下SVN的一些使用方法总结 近期的一个项目不方便 Check 到本地,需要在测试服务器上进行编写和测试,所以就研究了一下如何在 Linux 命令行下使用 SVN. 首先 svn help ...
- 对于python的内存管理的好文章
http://www.cnblogs.com/vamei/p/3232088.html 包含了一个绘制关系图的包
- POJ 1054 The Troublesome Frog(枚举+剪枝)
题目链接 题意 :给你r*c的一块稻田,每个点都种有水稻,青蛙们晚上会从水稻地里穿过并踩倒,确保青蛙的每次跳跃的长度相同,且路线是直线,给出n个青蛙的脚印点问存在大于等于3的最大青蛙走的连续的脚印个数 ...
- 使用post()方法以POST方式从服务器发送数据
使用post()方法以POST方式从服务器发送数据 与get()方法相比,post()方法多用于以POST方式向服务器发送数据,服务器接收到数据之后,进行处理,并将处理结果返回页面,调用格式如下: $ ...
- Hibernate逍遥游记-第10章 映射继承关系-003继承关系树中的每个类对应一个表(joined-subclass)
1. 2. <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate ...
- 关于use-default-filters的一个问题
use-default-filters=true 默认行为会自动扫描所有注解
- C++:对象数组
对象数组 对象数组:每一个数组元素都是对象的数组,也就是说,若一个类有若干个对象,我们把这 一系列的对象用一个数组来存放.对应数组元素是对象,不仅具有的数据成员,而且还有函数 成员. @定义一个一维数 ...