比赛时太大意,斐波拉契数列开小了。

题目大意: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 线段树的更多相关文章

  1. HDU 4893 线段树的 点更新 区间求和

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  2. HDU 4893 线段树裸题

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  3. 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 ...

  4. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  5. hdu 3436 线段树 一顿操作

    Queue-jumpers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  6. hdu 3397 线段树双标记

    Sequence operation Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  7. hdu 4578 线段树(标记处理)

    Transformation Time Limit: 15000/8000 MS (Java/Others)    Memory Limit: 65535/65536 K (Java/Others) ...

  8. hdu 4533 线段树(问题转化+)

    威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Tot ...

  9. hdu 2871 线段树(各种操作)

    Memory Control Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

随机推荐

  1. When to use Class.isInstance() & when to use instanceof operator?

    I think the official documentation gives you the answer to this one (albeit in a fairly nonspecific ...

  2. Notes of the scrum meeting(10/28)

    meeting time:4:00~6:00p.m.,October 28th,2013 meeting place:雕刻时光 attendees: 顾育豪                       ...

  3. 如何编写好的jQuery代码

    本文就是自己看,如果您不小心进到了这里,请看源处,是这个作者翻译的:http://blog.sae.sina.com.cn/archives/4157 讨论jQuery和javascript性能的文章 ...

  4. 华为章宇:如何学习开源项目及Ceph的浅析

    转自http://www.csdn.net/article/2014-04-10/2819247-how-to-learn-opensouce-project-&-ceph 摘要:开源技术的学 ...

  5. Flv 视频格式(转)

    最近要用到flv,整理了一些flv格式的资料,供参考. flv文件主要由两部分组成:header和body. 1.header header部分记录了flv的类型.版本等信息,是flv的开头,一般都差 ...

  6. 【POJ】【3164】Commond Network

    最小树形图 最小树形图模板题,朱-刘算法. 题解:http://blog.csdn.net/shuangde800/article/details/8039359 这位大神代码写的非常通俗易懂,而且这 ...

  7. 20160725noip模拟赛“Paodekuai” alexandrali

    T1: 我们可以用火柴棒来表示十进制下的0~9, 如图所示 现给定火柴数n, 问用这n根火柴能组成的最小数和最大数分别是多少. 所有火柴必须全部用完, 并且所有数字必须是正的且不含前缀零. [解题] ...

  8. HDU 1573 X问题 (中国剩余定理)

    题目链接 题意 : 中文题不详述. 思路 : 中国剩余定理.求中国剩余定理中解的个数.看这里看这里 #include <stdio.h> #include <iostream> ...

  9. 【Linux高频命令专题(2)】awk

    简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再 ...

  10. VC程序查错之内存访问异常

    作者:langouster 先来看下面这张图,相信很多程序员都见过类似. ---------------------------test1.exe - 应用程序错误------------------ ...