题意:一个初始为0的数组,支持三种操作:1、向第k个数添加d,(|d| < 2^31);2、把[l, r]区间内的数字都换成与它最相近的Fibonacci数;3、询问[l, r]区间的和。

思路:初始化Fibonacci数组,longlong 类型内90个就够用了。

  线段树区间查询,用lazy标记, sgt[]记录线段树各个节点的区间和, fib_num_sum[]记录与各个叶子节点当前值最接近的Fibonacci数,传递到区间fib_num_sum[]就是区间Fibonacci数的和。

  操作1时第k个数的sgt[]+= d,同时更新fib_num_sum[]。操作2即把找到的区间sgt[]=fib_num_sum[]。操作3,直接返回区间sgt[]值。

AC代码:

 #include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 100005
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
long long sgt[maxn<<], fib_num_sum[maxn<<];
bool lazy[maxn<<];
long long fib[];
void init_fib()
{
fib[] = fib[] = ;
for(int i = ; i < ; i++){
fib[i] = fib[i-] + fib[i-];
}
} void push_up(int rt)
{
sgt[rt] = sgt[rt<<] + sgt[rt<<|];
fib_num_sum[rt] = fib_num_sum[rt<<] + fib_num_sum[rt<<|];
} void push_down(int rt)
{
if(lazy[rt]){
lazy[rt<<] = lazy[rt<<|] = ;
lazy[rt] = ;
sgt[rt<<] = fib_num_sum[rt<<];
sgt[rt<<|] = fib_num_sum[rt<<|];
}
} long long find_fib(long long x)
{
int a = lower_bound(fib, fib+, x) - fib;
if(x && fib[a] - x >= x - fib[a-]) return fib[a-];
return fib[a];
} void build(int l, int r, int rt)
{
lazy[rt] = , fib_num_sum[rt] = ;
if(l == r){
sgt[rt] = ;
return;
}
int m = (r + l) >>;
build(lson);
build(rson);
push_up(rt);
}
void add(int l, int r, int rt, int k, int d)
{
if(l == r) {
sgt[rt] += d;
fib_num_sum[rt] = find_fib(sgt[rt]);
return;
}
push_down(rt);
int m = (l+r)>>;
if(m >= k) add(lson, k, d);
if(m < k) add(rson, k, d);
push_up(rt);
} void change(int l, int r, int rt, int L, int R)
{
if(L <= l&&r <= R){
lazy[rt] = ;
sgt[rt] = fib_num_sum[rt];
return;
}
push_down(rt);
int m = (r+l)>>;
if(L <= m) change(lson, L, R);
if(m < R) change(rson, L, R);
push_up(rt);
} long long query(int l, int r, int rt, int L, int R)
{
if(L <= l&&r <= R) return sgt[rt];
push_down(rt);
int m = (r+l)>>;
long long ans = ;
if(L <= m) ans += query(lson, L, R);
if(m < R) ans += query(rson, L, R);
return ans;
} int n, m;
void work()
{
build(, n, );
while(m--){
int a; scanf("%d", &a);
if(a == ) {
int k, d; scanf("%d%d", &k, &d);
add(, n, , k, d);
}
if(a == ) {
int l, r; scanf("%d%d", &l, &r);
printf("%I64d\n", query(, n, , l, r));
}
if(a == ) {
int l, r; scanf("%d%d", &l, &r);
change(, n, , l, r);
}
}
} int main()
{
init_fib();
while(scanf("%d%d", &n, &m) != EOF) work();
return ;
}

hdu-4893-Wow! Such Sequence!-线段树【2014多校第三场-J】的更多相关文章

  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!(2014年多校联合 第三场 G)(线段树)

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

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

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

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

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

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

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

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

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

  7. hdu 5828 Rikka with Sequence 线段树

    Rikka with Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...

  8. 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 操作按正常单调更新,区 ...

  9. hdu 4893 Wow! Such Sequence!

    http://acm.hdu.edu.cn/showproblem.php?pid=4893 三种操作: 1 k d - "add" 2 l r - "query sum ...

随机推荐

  1. css3动画笔记

    ------------------------------------------------------------------------------------ @keyframes anim ...

  2. winform 按顺序连续打印多个PDF文件

    关于PDF打印的问题,前面有篇文章(点这里查看)也叙述过,今天来谈谈另外一种方法 其实方法很简单,因为需要把多个PDF文档按顺序连续打印,为此我们为什么不把要打印的pdf文档按顺序合并成一个PDF打印 ...

  3. Asp.net页面无刷新请求实现

    Asp.net页面无刷新请求实现 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=&qu ...

  4. CSS自定义select下拉选择框(不用其他标签模拟)

    今天群里有人问到怎么自定义select下拉选择框的样式,于是群里就展开了激烈的讨论,刚开始一直就是考虑怎样使用纯CSS实现,把浏览器默认的样式覆盖掉,但最后均因兼容问题处理不好而失败告终,最后的解决方 ...

  5. php随机数怎么获取?一个简单的函数就能生成

    小美女建了一个站,有些页面相似度比较高,想添加一些字段来实现差异化,比如用php随机数生成从10到100之间随机一个数字.其实会php的朋友几十个字符就能实现了,如下代码所示,简单吧?10代表最小值, ...

  6. javascript实现快速排序和二分法查找

    1.快速排序: 思路:找到数组中间的元素,把它单拎出来,然后从0开始判断数组中的元素比该基准元素大还是小,小的存左边,大的存右边,然后如此反复递归,得出结果. function quickSort(a ...

  7. 【面试题041】和为s的两个数字VS和为s的连续正数序列

    [面试题041]和为s的两个数字VS和为s的连续正数序列 题目一:     输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s.如果有多对数字的和等于s,输出任意一对即可. ...

  8. ListView的item选中效果

    有时app会需要点击某个item并实现选中的效果,例如做pad时用Fragment实现的左侧列表右侧内容的效果,点击左侧某一个item后会高亮选中 有时简单的使用setSelected(boolean ...

  9. MyEclipse编码设置

    (1)windows---->Preferences (2)general---->Workspace (3)设置编码

  10. editplus的各式插件

    C/C++, Java, JSP, C#, .NET, SQL, Pascal, Python, Assembly, Basic files http://www.editplus.com/javac ...