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区间上的所以数变成近期的斐波那契数,相等的话取向下取。
解题思路:线段树。对于每一个节点新增一个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!(线段树)的更多相关文章
- 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年多校联合 第三场 G)(线段树)
磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add 把d加到第k个数上去2 ...
- 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! (树状数组)
题意:给有三种操作,一种是 1 k d,把第 k 个数加d,第二种是2 l r,查询区间 l, r的和,第三种是 3 l r,把区间 l,r 的所有数都变成离它最近的Fib数, 并且是最小的那个. 析 ...
- hdu 5828 Rikka with Sequence 线段树
Rikka with Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...
- hdu 4893 Wow! Such Sequence!
http://acm.hdu.edu.cn/showproblem.php?pid=4893 三种操作: 1 k d - "add" 2 l r - "query sum ...
- HDU 5828 Rikka with Sequence (线段树+剪枝优化)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5828 给你n个数,三种操作.操作1是将l到r之间的数都加上x:操作2是将l到r之间的数都开方:操作3是 ...
- 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 操作按正常单调更新,区 ...
随机推荐
- cloudstack openstack zstack
http://www.cnblogs.com/skyme/archive/2013/06/06/3118852.html http://www.niubua.com/ http://zstack.or ...
- 解决win8内置管理员无法激活此应用
解决win8内置管理员无法激活此应用 方法/步骤 在运行中输入:“gpedit.msc”,就会启动组策略编辑器. 依次展开“计算机配置”里面的 “Windows设置” “安全设置” “本地策略 ...
- MVC无限级分类02,增删改查
继上一篇"MVC无限级分类01,分层架构,引入缓存,完成领域模型与视图模型的映射",本篇开始MVC无限级分类的增删改查部分,源码在github. 显示和查询 使用datagrid显 ...
- 编码原则:必须使用的 TODO
结构 // TODO:JS ParentId 不要使用硬编码. var parentId = record.get('ParentId'); var parentNode = me.getStore( ...
- pytest文档16-用例a失败,跳过测试用例b和c并标记失败xfail
前言 当用例a失败的时候,如果用例b和用例c都是依赖于第一个用例的结果,那可以直接跳过用例b和c的测试,直接给他标记失败xfail 用到的场景,登录是第一个用例,登录之后的操作b是第二个用例,登录之后 ...
- java中迭代器应用
本文将利用分析代码的方式,来学习一个集合类的内部结构,以及遍历集合的迭代模式的源码实现细节. 下面我们先简单讨论一个根接口Collection,然后分析一个抽象类AbstractList和它的对应It ...
- Android之判断时间是否为今天
字符串: sdate = 2013-07-16 13:35:02 /** * 判断给定字符串时间是否为今日 * @param sdate * @return boolean */ publ ...
- 【BZOJ】【1091】【SCOI2003】切割多边形
计算几何+枚举 我比较傻逼……一开始想了个贪心,就是这样:
- 第二章 Javac编译原理
注:本文主要记录自<深入分析java web技术内幕>"第四章 javac编译原理" 1.javac作用 将*.java源代码文件转化为*.class文件 2.编译流程 ...
- 齐次坐标(Homogeneous Coordinates)
原文:http://blog.163.com/m_note/blog/static/208197045201272341230195/ 齐次坐标(Homogeneous Coordinates) 问题 ...