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 ...
随机推荐
- 房费制 它 结账BUG
声明:以下内容仅仅是对在桌子上的卡与卡表的后面,适合学生的表! 最近,我们已经开始做VB.NET系统重构版,在这里跟大家聊聊我在机房收费系统中发现的漏洞. 在机房收费系统中有这样一个窗口--结 ...
- js cookie设置最大过期时间 Infinity
Note: 对于永久cookie我们用了Fri, 31 Dec 9999 23:59:59 GMT作为过期日.如果你不想使用这个日期,可使用世界末日Tue, 19 Jan 2038 03:14:07 ...
- ios 类似的效果淘宝商品详细页面
今天试着写ios 分类似影响淘宝的商品详细页面 我使用第三方库EGORefreshTableHeaderView有一个下拉效果刷新PWLoadMoreTableFooterView上拉电阻负载许多其他 ...
- POJ 3207 Ikki's Story IV - Panda's Trick (2-SAT)
职务地址:id=3207">POJ 3207 找好矛盾关系.矛盾关系是(2,5)和(3,6)这两个仅仅能一个在外边,一个在里边.利用这个矛盾关系来建图. 能够用在外边和里边来当1和0, ...
- 【Linux命令】--(9)其他常用命令
其他常用命令+++++++++++++++++++++++++++++++lndiffdatecal grep wcpswatchatcrontab++++++++++++++++++++++++++ ...
- extjs_09_定义自己的页面组件
1.项目截图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWRhbV93enM=/font/5a6L5L2T/fontsize/400/fill/I0J ...
- Instll meld in windows
在linux下用meld感觉颇为不错,但是在windows上真是折腾老久.p4merge也试了试, 但还是meld用起来更顺手. 使用 https://wiki.gnome.org/Meld/Wind ...
- oracle_单向函数_数字化功能
oracle_单向函数_数字化功能 1.abs(x) 为了获得x绝对值 2.ceil(x) 用于获得大于或等于x的最小整数. 3.floor(x) 用于获得小于或等于x 4.mod(x,y ...
- Linux内核分析(二)----内核模块简介|简单内核模块实现
原文:Linux内核分析(二)----内核模块简介|简单内核模块实现 Linux内核分析(二) 昨天我们开始了内核的分析,网上有很多人是用用源码直接分析,这样造成的问题是,大家觉得很枯燥很难理解,从某 ...
- jQuery性能优化篇
jQuery高级技巧——性能优化篇 阅读目录 通过CDN(Content Delivery Network)引入jQuery库 减少DOM操作 适当使用原生JS 选择器优化 缓存jQuery对象 定义 ...