hdu 4893 Wow! Such Sequence!
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!的更多相关文章
- 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区间上的所以数变成 ...
- HDU 4893 Wow! Such Sequence! (线段树)
Wow! Such Sequence! 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4893 Description Recently, Doge ...
- 线段树 + 区间更新: HDU 4893 Wow! Such Sequence!
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- 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 操作按正常单调更新,区 ...
- HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)
磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add 把d加到第k个数上去2 ...
- HDU 4893 Wow! Such Sequence! (树状数组)
题意:给有三种操作,一种是 1 k d,把第 k 个数加d,第二种是2 l r,查询区间 l, r的和,第三种是 3 l r,把区间 l,r 的所有数都变成离它最近的Fib数, 并且是最小的那个. 析 ...
- HDOJ 4893 Wow! Such Sequence!
题意是这样的,给定一个n个元素的数组,初始值为0,3种操作: 1 k d将第k个数增加d: 2 l r 询问区间l...r范围内数之和: 3 l r 表示将区间l...r内的数变成离他最近的斐波那契数 ...
- 2014联合三所学校 (HDU 4888 HDU 4891 HDU 4893)
HDU 4891 The Great Pan 注册标题 他怎么说,你怎么样 需要注意的是乘法时,它会爆炸int 代码: #include<iostream> #include<c ...
- Wow! Such Sequence!(线段树4893)
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
随机推荐
- Connect2015 简要整理
2015 简要整理 去年 Connect(); 2014 Visual Studio Contact(); 直播笔记 对于我个人来说,今年 Connect(); 的三个重要发布: ASP.NET 5 ...
- java中的移位运算符:<<,>>,>>>总结(转)
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- 通过ccb(CocosBuilder)文件生成cocos2dx代码
在C++下使用ccb.绑定调用,成员变量.让人头疼又easy犯错. 自己用pythong写了个小程序,通过ccb文件直接生成C++代码 python我用的不多.又是随性所做.代码质量就非常差.大家多多 ...
- 具体的例子来教你怎么做LoadRunner结果分析
LoadRunner 解的地方--測试结果的分析.其余的录制和加压測试等设置对于我们来讲通过几次操作就能够轻松掌握了.针对 Results Analysis 我用图片加文字做了一个样例,希望通过样例能 ...
- PHP于DIRECTORY_SEPARATOR任务
DIRECTORY_SEPARATOR是php的内部常量.用于显示系统分隔符的命令,不须要不论什么定义与包括就可以直接使用. 在windows下路径分隔符是\(当然/在部分系统上也是能够正常执行的), ...
- 开始的iOS编程之前的准备
原地址:http://www.appcoda.com/what-you-need-to-begin-ios-programming/ 1.准备一台苹果设备 这段基本是废话,我就不翻译了,IOS开发你懂 ...
- Event Sourcing - ENode(二)
接上篇文章继续 http://www.cnblogs.com/dopeter/p/4899721.html 分布式系统 前篇谈到了我们为何要使用分布式系统,因为ENode本身就是一个分布式的框架.看了 ...
- C++ STL它vector详细解释
Vectors vector它是C++标准模板库部分,它是一种多用途,你可以使用各种数据结构和算法的模板类和库. vector其原因被认为是一个容器.因为它可以被存储为各种类型的对象作为容器.一 ...
- SVD在推荐系统中的应用
一.奇异值分解SVD 1.SVD原理 SVD将矩阵分为三个矩阵的乘积,公式: 中间矩阵∑为对角阵,对角元素值为Data矩阵特征值λi,且已经从大到小排序,即使去掉特征值小的那些特征,依然可以很好地重构 ...
- hibernate set的3属性
inverse 属性 在hibernate通过对 inverse 和表之间的关系. inverse = false 的为主动方,inverse = true 的为被动方, 由主动方负责维护关联关系 在 ...