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. int a[5]={1,2,3,4,5};printf(&quot;%d\n&quot;, *((int*)(&amp;a+1)-2);

    有说服力的笔试题有一定的期限,问:什么是结果,答案是4,为什么要挤? 我明白(不知道是不正确): &a这是一个数组指针,类型int[5],然后&a添加1其实a+sizeof(int)* ...

  2. net开发过程中Bin目录net开发过程中Bin目录下面几种文件

    .net开发过程中Bin目录下面几种文件格式的解释 在.NET开发中,我们经常会在bin目录下面看到这些类型的文件: .pdb..xsd..vshost.exe..exe..exe.config..v ...

  3. bonecp使用数据源

    bonecp.properties jdbc.driverClass=oracle.jdbc.driver.OracleDriver jdbc.jdbcUrl=jdbc:oracle:thin:@19 ...

  4. JavaScript事件收集

    1. onabort . 2. onactivate 当对象设置为活动元素时触发. 3. onafterprint 对象所关联的文档打印或打印预览后马上在对象上触发.   4. onafterupda ...

  5. 【三】注入框架RoboGuice使用:(Your First Resource Injection)

    上一篇我们简单的介绍了一下RoboGuice的使用([二]注入框架RoboGuice使用:(Your First View Injection)),今天我们来看下资源文件的使用注解的方法: 为了在Ac ...

  6. HDU 1195 Open the Lock (双宽搜索)

    意甲冠军:给你一个初始4数字和目标4数字,当被问及最初的目标转换为数字后,. 变换规则:每一个数字能够加1(9+1=1)或减1(1-1=9),或交换相邻的数字(最左和最右不是相邻的). 双向广搜:分别 ...

  7. atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系

    atitit.基于组件的事件为基础的编程模型--服务器端控件(1)---------服务器端控件和标签之间的关系 1. server控件是要server了解了标签.种类型的server控件: 1 1. ...

  8. hdu 4870 Rating(可能性DP&amp;高数消除)

    Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  9. Spring先进的交易管理困难剖析

    1Spring事务传播行为 所谓事务传播行为就是多个事务方法相互调用时,事务怎样在这些方法间传播.Spring支持7种事务传播行为 PROPAGATION_REQUIRED(增加已有事务) 假设当前没 ...

  10. Net 项目代码风格

    .Net 项目代码风格要求   .Net 项目代码风格要求 PDF版下载:项目代码风格要求V1.0.pdf 代码风格没有正确与否,重要的是整齐划一,这是我拟的一份<.Net 项目代码风格要求&g ...