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

题目大意: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. Error: Cannot find module 'express'

    安装Express命令如下: npm install -g express 安装成功之后会在C:\Users\[YOUR_USER_NAME]\AppData\Roaming\npm\node_mod ...

  2. UI控件tag属性和魔法数字的处理

    说明:tag属性有很大的用处,它就好像每个UI控件的id,当多个按钮指向同一个监听方法时,可以给方法带参数UIButton,然后根据不同的tag值 来判断执行哪个按钮的监听事件: - (IBActio ...

  3. mysql存储过程中字符串参数单引号

    注意:存储过程中单引号  ,四个单引号 SET @sql = CONCAT('select user_id into ',m_user_id,' from go_user where mobile = ...

  4. Learn know more about big data

    As we all know,we are in a big data age now."Every sword has two slides",as a ITer,we shou ...

  5. PHP中应用Service Locator服务定位及单例模式

    单例模式将一个对象实例化后,放在静态变量中,供程序调用. 服务定位(ServiceLocator)就是对象工场Factory,调用者对象直接调用Service Locator,与被调用对象减轻了依赖关 ...

  6. 设置DIV隐藏与显示,表格滑动条

    问题描述:         现在希望使用JS设置DIV块的显示与隐藏,当某一个事件触发是,自动显示DIV块,显示表格数据,但是要求表格显示滑动条 问题解决:   (1)DIV块的隐藏与显示 如上所示, ...

  7. BZOJ 4302 Buildings 解题报告

    这个题好像很有趣的样子. 题目分析: 房间都是 $1\times k$ 的,也就是一条一条的.这个好像比较显然的样子. 一个房间如果要覆盖某个格子$u$,那么这个房间的面积至少为 $dis(u, Bo ...

  8. ffmpeg参数解释

    基本选项: -formats 输出所有可用格式 -f fmt 指定格式(音频或视频格式) -i filename 指定输入文件名,在linux下当然也能指定: 0.0(屏幕录制)或摄像头 -y 覆盖已 ...

  9. 坑人的 try catch finally

    一直以为这样可以关闭 fs, 其实不行 static void Main(string[] args) { FileStream fs = null; try { fs = new FileStrea ...

  10. SQL Server 之 锁

    锁,是由锁管理器负责维护,其目的是保证事务的ACID,是平衡并发和数据安全的机制. 锁定粒度与并发性是成反比的,默认情况下,SQL Server Compact 4.0 对数据页使用行级锁定,对索引页 ...