hdu4893 Wow! Such Sequence!
线段树结点上保存一个一般的sum值,再同一时候保存一个fbsum,表示这个结点表示的一段数字若为斐波那契数时的和
当进行3操作时,仅仅用将sum = fbsum就可以
其它操作照常进行,仅仅是单点更新的时候也要先向下更新
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <string>
#include <set>
#include <stack>
#include <map>
#include <cmath>
#include <vector>
#include <iostream>
#include <algorithm>
#include <bitset>
#include <fstream>
using namespace std;
//LOOP
#define FF(i, a, b) for(int i = (a); i < (b); ++i)
#define FE(i, a, b) for(int i = (a); i <= (b); ++i)
#define FED(i, b, a) for(int i = (b); i>= (a); --i)
#define REP(i, N) for(int i = 0; i < (N); ++i)
#define CLR(A,value) memset(A,value,sizeof(A))
#define FC(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
//OTHER
#define SZ(V) (int)V.size()
#define PB push_back
#define MP make_pair
#define all(x) (x).begin(),(x).end()
//INPUT
#define RI(n) scanf("%d", &n)
#define RII(n, m) scanf("%d%d", &n, &m)
#define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)
#define RIV(n, m, k, p) scanf("%d%d%d%d", &n, &m, &k, &p)
#define RV(n, m, k, p, q) scanf("%d%d%d%d%d", &n, &m, &k, &p, &q)
#define RS(s) scanf("%s", s)
//OUTPUT
#define WI(n) printf("%d\n", n)
#define WS(n) printf("%s\n", n) #define sqr(x) (x) * (x)
typedef long long LL;
typedef unsigned long long ULL;
typedef vector <int> VI;
const double eps = 1e-9;
const int MOD = 1000000007;
const double PI = acos(-1.0);
//const int INF = 0x3f3f3f3f;
const int maxn = 100010;
const LL INF = 0x3f3f3f3f3f3f3f3fLL; #define ll rt << 1
#define rr rt << 1 | 1 struct Node{
int l, r, m;
LL sum, fbsum;
bool f;
}t[maxn * 4];
LL fb[10000];
int fbcnt; void init()
{
fb[1] = 1, fb[0] = 1;
for (int i = 2; ; i++)
{
fb[i] = fb[i - 1] + fb[i - 2];
if (fb[i] > INF)
{
fbcnt = i - 1;
return;
}
}
return;
} void push_up(int rt)
{
t[rt].sum = t[ll].sum + t[rr].sum;
t[rt].fbsum = t[ll].fbsum + t[rr].fbsum;
t[rt].f = t[ll].f & t[rr].f;
} LL get(LL x)
{
int pos = lower_bound(fb, fb + fbcnt, x) - fb;
if (pos && abs(fb[pos - 1] - x) <= abs(fb[pos] - x))
return fb[pos - 1];
return fb[pos];
} void push_down(int rt)
{
if (t[rt].f)
{
t[ll].sum = t[ll].fbsum;
t[rr].sum = t[rr].fbsum;
t[rr].f = t[ll].f = 1;
t[rt].f = 0;
}
} void build(int l, int r, int rt)
{
t[rt].l = l, t[rt].r = r, t[rt].m = (l + r) >> 1;
if (l == r)
{
t[rt].sum = 0;
t[rt].fbsum = 1;
t[rt].f = 0;
return;
}
build(l, t[rt].m, ll);
build(t[rt].m + 1, r, rr);
push_up(rt);
} void update(int x, int add, int rt)
{
if (x == t[rt].l && t[rt].r == x)
{
t[rt].sum += add;
t[rt].fbsum = get(t[rt].sum);
t[rt].f = 0;
return;
}
push_down(rt);
if (x <= t[rt].m)
update(x, add, ll);
else
update(x, add, rr);
push_up(rt);
} void updatefb(int l, int r, int rt)
{
if (l <= t[rt].l && r >= t[rt].r)
{
t[rt].sum = t[rt].fbsum;
t[rt].f = 1;
return;
}
push_down(rt);
if (l <= t[rt].m)
updatefb(l, r, ll);
if (r > t[rt].m)
updatefb(l, r, rr);
push_up(rt);
} LL query(int l, int r, int rt)
{
if (l <= t[rt].l && r >= t[rt].r)
return t[rt].sum;
push_down(rt);
LL ans = 0;
if (l <= t[rt].m)
ans += query(l, r, ll);
if (r > t[rt].m)
ans += query(l, r, rr);
return ans;
} int main()
{
init();
int n, m;
while (~RII(n, m))
{
build(1, n, 1);
int x, y, op;
while (m--)
{
RIII(op, x, y);
if (op == 1)
update(x, y, 1);
else if (op == 2)
printf("%I64d\n", query(x, y, 1));
else
updatefb(x, y, 1);
}
}
return 0;
}
/*
5 4
3 1 3
2 1 3
1 3 3
2 1 3 5 2
3 1 3
2 1 2
*/
hdu4893 Wow! Such Sequence!的更多相关文章
- HDU4893:Wow! Such Sequence!(段树lazy)
Problem Description Recently, Doge got a funny birthday present from his new friend, Protein Tiger f ...
- Wow! Such Sequence!(线段树4893)
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 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!(线段树)
题目链接:hdu 4983 Wow! Such Sequence! 题目大意:就是三种操作 1 k d, 改动k的为值添加d 2 l r, 查询l到r的区间和 3 l r. 间l到r区间上的所以数变成 ...
- Wow! Such Sequence! (线段树) hdu4893
http://acm.hdu.edu.cn/showproblem.php?pid=4893 先贴上一份还没过的代码,不知道拿出错了 1 // by caonima ; ; ],col[MAX< ...
- 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 操作按正常单调更新,区 ...
- HDOJ 4893 Wow! Such Sequence!
题意是这样的,给定一个n个元素的数组,初始值为0,3种操作: 1 k d将第k个数增加d: 2 l r 询问区间l...r范围内数之和: 3 l r 表示将区间l...r内的数变成离他最近的斐波那契数 ...
- 2014多校3 Wow! Such Sequence!段树
主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=4893 这个问题还真是纠结啊--好久不写线段树的题了.由于这几天学伸展树.然后认为线段树小case了. ...
随机推荐
- javascript中new操作符
当代码var p= new Person("tom")执行时,其实内部做了如下几件事情: 1.创建一个空白对象(new Object()). 2.拷贝Person.prototyp ...
- sql select case when 语句
有道笔试题: 服务器监控表server_status中,当服务器状态发生server_status变化时数据表中将被插入一条记录,状态0表示停机 1表示正常,用SQL查询Server A 的停机开始 ...
- Python3学习笔记 - 准备环境
前言 最近乘着项目不忙想赶一波时髦学习一下Python3.由于正好学习了Docker,并深深迷上了Docker,所以必须趁热打铁的用它来创建我们的Python3的开发测试环境.Python3的中文教程 ...
- 面向亿万级用户的QQ一般做什么?——兴趣部落的 Web 同构直出分享
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:李强,腾讯web开发工程师商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处.原文链接:http://wetest.qq.co ...
- Linux下gcc编译生成动态链接库*.so文件并调用它
动态库*.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链接,总算搞懂了这个之前一直不太了解得东东,这里做个笔记,也为其它正为动态库链接库而苦恼的兄弟们提供一 ...
- [转载] 快速理解Kafka分布式消息队列框架
转载自http://blog.csdn.net/xiaolang85/article/details/18048631 ==是什么 == 简单的说,Kafka是由Linkedin开发的一个分布式的消息 ...
- 前端面试题(4)iframe有哪些优点?iframe缺点是什么?
优点: iframe能够原封不动的把嵌入的网页展现出来. 如果有多个网页引用iframe,那么你只需要修改iframe的内容,就可以实现调用的每一个页面内容的更改,方便快捷. 网页如果为了统一风格,头 ...
- JavaScript学习笔记(八)——变量的作用域与解构赋值
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- Fedora 23建立wifi热点(Android手机可用)
在ubuntu14.04下使用ap-hotspot,速度还不错.但是在15.04下就用不了了,不知为啥.现在使用fedora23,在学校还是挺需要给手机连wifi的,于是google看看ap-hots ...
- vue初级知识总结
从我第一篇博客的搭建环境开始,就开始学习vue了,一直想将这些基本知识点整理出来,但是一直不知如何下手,今天刚好实战了两个小demo,所以就想趁这机会将以前的一起整理出来,这是vue最基础的知识,我有 ...