http://acm.hdu.edu.cn/showproblem.php?pid=4893

三种操作:

1 k d - "add"

2 l r - "query sum"

3 l r - "change to nearest Fibonacci"



节点附件三个值:

s1:由lazy控制的区间的正确的和。

s2:区间内与全部数相近的fib数之和,随着单点更新而更新。

col:lazy,标记区间是否所有取fib数,是取1,否则取0。

询问区间的和时,找到对应区间直接返回s1,若有col为1的区间要先向下推送,表示要取该区间的fib数的和。

Mark.....

#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL long long
#define _LL __int64
#define eps 1e-12
#define PI acos(-1.0)
#define C 240
#define S 20
using namespace std; const int maxn = 100010;
const int INF = 1 << 30; _LL fib[86];
void init()
{
fib[0] = fib[1] = 1;
for(int i = 2; i <= 85; i++)
fib[i] = fib[i-1] + fib[i-2];
} _LL Binsearch(_LL key)
{
int low = 0,high = 85;
while(low <= high)
{
int mid = (low + high) >> 1;
if(fib[mid] > key)
high = mid-1;
else low = mid+1;
}
if(fabs(fib[low]-key) < fabs(fib[high]-key))
return fib[low];
else return fib[high];
/*_LL Min = abs(fib[0]-key);
int pos = 0;
for(int i = 1; i <= 85; i++)
{
if(Min > abs(fib[i]-key))
{
Min = abs(fib[i]-key);
pos = i;
}
}
return fib[pos];*/
} struct node
{
int l, r;
LL s1,s2;
int col;
}tree[maxn*4]; void build(int v, int l, int r)
{
tree[v].l = l;
tree[v].r = r;
tree[v].col = 0;
tree[v].s1 = 0;
tree[v].s2 = r-l+1;
if(l == r)
{
return;
}
int mid = (l+r)>>1;
build(v*2,l,mid);
build(v*2+1,mid+1,r);
} void update_fib(int v, int l, int r)
{
if(tree[v].l == l && tree[v].r == r)
{
tree[v].col = 1;
tree[v].s1 = tree[v].s2;
return;
} if(tree[v].col == 1)
return;
int mid = (tree[v].l + tree[v].r) >> 1;
if(r <= mid)
update_fib(v*2,l,r);
else if(l > mid)
update_fib(v*2+1,l,r);
else
{
update_fib(v*2,l,mid);
update_fib(v*2+1,mid+1,r);
}
tree[v].s1 = tree[v*2].s1 + tree[v*2+1].s1;
tree[v].s2 = tree[v*2].s2 + tree[v*2+1].s2;
} void update(int v, int pos, _LL d)
{
if(tree[v].l == tree[v].r)
{
tree[v].s1 += d;
tree[v].s2 = Binsearch(tree[v].s1);
return;
} if(tree[v].col == 1)
{
int mid = (tree[v].l + tree[v].r) >> 1;
update_fib(v*2,tree[v].l,mid);
update_fib(v*2+1,mid+1,tree[v].r);
tree[v].col = 0;
} int mid = (tree[v].l + tree[v].r) >> 1 ;
if(pos <= mid)
update(v*2,pos,d);
else update(v*2+1,pos,d);
tree[v].s1 = tree[v*2].s1 + tree[v*2+1].s1;
tree[v].s2 = tree[v*2].s2 + tree[v*2+1].s2;
} _LL query(int v, int l, int r)
{
if(tree[v].l == l && tree[v].r == r)
{
return tree[v].s1;
} if(tree[v].col == 1)
{
int mid = (tree[v].l+tree[v].r)>>1;
update_fib(v*2,tree[v].l,mid);
update_fib(v*2+1,mid+1,tree[v].r);
tree[v].col = 0;
}
int mid = (tree[v].l + tree[v].r) >> 1;
if(r <= mid)
return query(v*2,l,r);
else if(l > mid)
return query(v*2+1,l,r);
else return query(v*2,l,mid) + query(v*2+1,mid+1,r);
} int main()
{
init();
int n,m;
int num,l,r,pos;
_LL d; while(~scanf("%d %d",&n,&m))
{
build(1,1,n);
while(m--)
{
scanf("%d",&num);
if(num == 1)
{
scanf("%d %I64d",&pos,&d);
update(1,pos,d);
// for(int i = 1; i <= 3; i++)
// printf("l : %2d r : %2d col : %2d s1 : %I64d s2 : %I64d\n",tree[i].l,tree[i].r,tree[i].col,tree[i].s1,tree[i].s2);
}
else if(num == 2)
{
scanf("%d %d",&l,&r);
printf("%I64d\n",query(1,l,r));
}
else
{
scanf("%d %d",&l,&r);
update_fib(1,l,r);
// for(int i = 1; i <= 3; i++)
// printf("l : %2d r : %2d col : %2d s1 : %I64d s2 : %I64d\n",tree[i].l,tree[i].r,tree[i].col,tree[i].s1,tree[i].s2);
}
}
}
return 0;
}

hdu 4893 Wow! Such Sequence!的更多相关文章

  1. hdu 4893 Wow! Such Sequence!(线段树)

    题目链接:hdu 4983 Wow! Such Sequence! 题目大意:就是三种操作 1 k d, 改动k的为值添加d 2 l r, 查询l到r的区间和 3 l r. 间l到r区间上的所以数变成 ...

  2. HDU 4893 Wow! Such Sequence! (线段树)

    Wow! Such Sequence! 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4893 Description Recently, Doge ...

  3. 线段树 + 区间更新: HDU 4893 Wow! Such Sequence!

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

  4. HDU 4893 Wow! Such Sequence!(2014 Multi-University Training Contest 3)

    题意: 有三种操作: 1 x y: 表示给x位置加上y 2 x y:查询[x,y]的区间和 3 x y:将 [x,y] 区间上的数变为最接近的 Fibonacci. 思路: 1 操作按正常单调更新,区 ...

  5. HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)

    磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add  把d加到第k个数上去2 ...

  6. HDU 4893 Wow! Such Sequence! (树状数组)

    题意:给有三种操作,一种是 1 k d,把第 k 个数加d,第二种是2 l r,查询区间 l, r的和,第三种是 3 l r,把区间 l,r 的所有数都变成离它最近的Fib数, 并且是最小的那个. 析 ...

  7. HDOJ 4893 Wow! Such Sequence!

    题意是这样的,给定一个n个元素的数组,初始值为0,3种操作: 1 k d将第k个数增加d: 2 l r 询问区间l...r范围内数之和: 3 l r 表示将区间l...r内的数变成离他最近的斐波那契数 ...

  8. 2014联合三所学校 (HDU 4888 HDU 4891 HDU 4893)

    HDU 4891 The Great Pan 注册标题  他怎么说,你怎么样  需要注意的是乘法时,它会爆炸int 代码: #include<iostream> #include<c ...

  9. Wow! Such Sequence!(线段树4893)

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

随机推荐

  1. 【Java基础】“数三退一”问题的代码实现

    现在有500个小孩,编号为0-499,手牵手连成一个圈,从第一个小孩开始"123123..."报数,数到三的小孩退出,求剩下的最后一个小孩的编号. public static vo ...

  2. asm 盘头损失,破坏

    BUG 14693394 – ORA-15196: INVALID ASM BLOCK HEADER [KFC.C:26076] [ENDIAN_KFBH] BUG 14758001 – ORA-15 ...

  3. 数据你把它的金额-JAVA分页

    数据量你造吗-JAVA分页 原创地址:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),须要转载的,保留下! Thanks 学习的心态第一,解行要对应. 事实 ...

  4. ASP.NET Core官方资料入口

    ASP.NET 5 has been renamed to ASP.NET Core 1.0 传送门

  5. MEF初体验之七:Using Catalogs

    MEF特性化编程模型的价值主张之一是通过catalogs动态发现部件的能力.Catalogs允许应用程序很容易地消费那些通过[Export]已经自我注册的exports. Assembly Catal ...

  6. C、C++用指针引用的差异

    1:并引述之间的区别在概念的指针 参考是可变的别名.例如 int m; int &n=m; 引用作为一个别名.它在逻辑上不是独立的.它的存在具有依附性.所以引用必须在一開始就被初始化.并且其引 ...

  7. 【C疯狂的教材】(四)C语言分支语句

    1.程序的结构 程序默认从上到下顺序运行(顺序结构) 程序的结构:顺序结构.分支结构.循环结构 2.if分支语句 程序运行的过程中能够有多个选择 格式: if(表达式){ 语句块; } ...... ...

  8. 原子操作(atomic operation)

    深入分析Volatile的实现原理 引言 在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共 ...

  9. (一个)AngularJS获取贴纸Hello World

    一旦项目使用JQuery原创javascript,最近参加了一个项目,需要使用AngularJS.RequireJS比较框架,如汰渍.这里写一些博客,记录自己的学习过程,虽然冠以原来的名字,实际上都是 ...

  10. 3D数学学习笔记——笛卡尔坐标系

    本系列文章由birdlove1987编写.转载请注明出处. 文章链接: http://blog.csdn.net/zhurui_idea/article/details/24601215 1.3D数学 ...