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

题目大意: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. C# 获取数组的子集

    private static void PrintSubItems(int[] source) { int i = 1; int total = int.Parse(Math.Pow(2, sourc ...

  2. Careercup - Google面试题 - 4807591515389952

    2014-05-06 00:45 题目链接 原题: What would happen if you have only one server for a web cache (a web brows ...

  3. C# book

    <编写高质量代码:改善C#程序的157个建议>源码下载 http://www.cnblogs.com/luminji/archive/2011/09/20/2182265.html < ...

  4. [转载]C# ListView用法详解

    一.ListView类 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false) 提示:只有在Details视图该属性才有意义. (2) GridLines:设 ...

  5. memcached-repcached

    memcached的复制功能 下载对应的repcached版本:http://sourceforge.jp/projects/sfnet_repcached/,必须版本对应才行 当前只支持到1.2.8 ...

  6. HTTP请求报文与响应报文

    http://docs.telerik.com/fiddler/KnowledgeBase/HTTP HTTP请求报文与响应报文 HTTP http://www.w3.org/Protocols/rf ...

  7. Palindrome Partitioning II

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...

  8. 【leetcode】Majority Element (easy)(*^__^*)

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  9. C# 在vs2010中打开vs2012的项目(转)

    在vs2010中打开vs2012的项目 今天在自己的电脑上装了vs2010然后要打开之前在vs2012上创建的sln文件 被提示-- 无法打开在新版本上创建的sln--解决方案--文件 其实vs201 ...

  10. POJ1046Color Me Less

    http://poj.org/problem?id=1046 据说这个题是个水题,但我还是WA了好几次,最后才改对了 #include<cstdio> #include<cstrin ...