题目链接:hdu 4983 Wow! Such Sequence!

题目大意:就是三种操作

1 k d, 改动k的为值添加d

2 l r, 查询l到r的区间和

3 l r。 间l到r区间上的所以数变成近期的斐波那契数,相等的话取向下取。

解题思路:线段树。对于每一个节点新增一个bool表示该节点下面的位置是否都是斐波那契数。

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm> #define lson(x) ((x<<1))
#define rson(x) ((x<<1)|1) using namespace std;
typedef __int64 ll; const int maxn = 100005;
const int maxf = 100;
const ll INF = 2000000000000000LL; int n, m;
ll fib[maxf], fn, num[maxn]; struct maxnode {
int l, r;
ll sum;
bool isfib; void set (int l, int r, ll sum, bool isfib) {
this->l = l;
this->r = r;
this->sum = sum;
this->isfib = isfib;
}
} node[4 * maxn]; void init () {
fib[0] = fib[1] = 1;
for (fn = 2;; fn++) {
fib[fn] = fib[fn - 2] + fib[fn - 1];
if (fib[fn] > INF)
break;
}
} void pushup(int x) {
int l = lson(x), r = rson(x); node[x].isfib = (node[l].isfib && node[r].isfib);
node[x].sum = node[l].sum + node[r].sum;;
} void build(int l, int r, int x) {
node[x].set(l, r, 0, false); if (l == r)
return; int mid = (l + r) / 2; build(l, mid, lson(x));
build(mid + 1, r, rson(x));
} ll find (ll x) {
int id;
ll ans = INF;
for (int i = 0; i < fn; i++) {
ll k = (fib[i] > x ? fib[i] - x : x - fib[i]);
if (k < ans) {
ans = k;
id = i;
}
}
return fib[id];
} void add (int k, ll v, int x) { if (node[x].l == k && node[x].r == k) {
node[x].sum += v;
node[x].isfib = (find(node[x].sum) == node[x].sum ? true : false);
return;
} int mid = (node[x].l + node[x].r) / 2;
if (k <= mid)
add(k, v, lson(x));
else if (k > mid)
add(k, v, rson(x));
pushup(x);
} void insert(int l, int r, int x) { if (node[x].isfib)
return; if (node[x].l == node[x].r) {
node[x].sum = find(node[x].sum);
node[x].isfib = true;
return;
} int mid = (node[x].l + node[x].r) / 2;
if (l <= mid)
insert(l, r, lson(x));
if (r > mid)
insert(l, r, rson(x));
pushup(x);
} ll query(int l, int r, int x) { if (node[x].l >= l && node[x].r <= r)
return node[x].sum; int mid = (node[x].l + node[x].r) / 2; ll ans = 0;
if (l <= mid)
ans += query(l, r, lson(x));
if (r > mid)
ans += query(l, r, rson(x));
return ans;
} int main() {
init(); while (scanf("%d%d", &n, &m) == 2) {
build(1, n, 1); int Q, a, b;
ll v; while (m--) {
scanf("%d", &Q);
if (Q == 1) {
scanf("%d%I64d", &a, &v);
add(a, v, 1);
} else if (Q == 2) {
scanf("%d%d", &a, &b);
printf("%I64d\n", query(a, b, 1));
} else {
scanf("%d%d", &a, &b);
insert(a, b, 1);
}
}
}
return 0;
}

hdu 4893 Wow! Such Sequence!(线段树)的更多相关文章

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

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

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

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

  3. HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)

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

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

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

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

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

  6. hdu 5828 Rikka with Sequence 线段树

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

  7. hdu 4893 Wow! Such Sequence!

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

  8. HDU 5828 Rikka with Sequence (线段树+剪枝优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5828 给你n个数,三种操作.操作1是将l到r之间的数都加上x:操作2是将l到r之间的数都开方:操作3是 ...

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

随机推荐

  1. linux strace追踪mysql执行语句 (mysqld --debug)

    转载请注明出处:使用strace追踪多个进程 http://www.ttlsa.com/html/1841.html http://blog.itpub.net/26250550/viewspace- ...

  2. Inside Portable Class Libraries

    Portable Class Libraries were introduced with Visual Studio 2010 SP1 to aid writing libraries that c ...

  3. debian添加中文支持

    转载:http://www.shunix.com/debian-chinese-support-472/   debian与ubuntu有很大的相似性,但是debian相对更原始,比如在语言支持这一块 ...

  4. Ext Form

    表单Ext.form.FormPanel 1.表单 对于传统的b/s应用来说,数据录入元素是放在表单<form>标签里面的.而对于ExtJS应用来说,则可以直接使用FormPanel控件来 ...

  5. 修改Eclipse/MyEclipse项目的默认编码

    应该是中文操作系统的原因,eclipse默认的新项目的编码是GBK,出于对编码支持的考虑,项目组中最好统一要求是UTF-8编码进行开发. 修改eclipse的配置,可以使得eclipse的新建项目的默 ...

  6. Objective-C:对象之间循环引用会造成死循环

    对象之间的循环引用        两个对象A.B,有可能会出现一种特殊的情况:A中包含B的实例变量:B中又包含A的实例变量,如果两个实例变量都是强引用(A有B实例变量的所有权,B也有A的实例变量的所有 ...

  7. C/C++中printf/cout 计算顺序与缓冲区问题

    1.printf/cout在同一个语句中都是从右向左计算的. 看如下的代码: #include <stdio.h> int main() { ; printf("%d %d&qu ...

  8. iOS开发-音乐播放

    现在的各种App大行其道,其实常用也就是围绕着吃喝玩乐基本的需求,视频,音乐在智能手机出现之前更是必不可少的功能,每个手机都会有一个自带的音乐播放器,当然公众也有自己的需求所以也就造就了各种音乐播放软 ...

  9. tomcat 用AXIS2发布WebService 网站的方法

    Axis2+tomcat7.0 实现webService 服务端发布与客户端的调用. Aixs2开发webService的方法有很多,在此只介绍一种比较简单的实现方法. 第一步:首先要下载开发所需要的 ...

  10. jquery获得select option的值和对select option的操作

    <body> <select name="month" id="selMonth" onchange="set()"> ...