题目链接: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. ztree插件的使用及列表项拖拽的实现(jQuery)+异步加载节点数据

    为了实现如图所示的树状结构图,并使列表项可拖动到盒子里,研究了ztree这个插件的使用,并仔细研究了列表项的拖动事件.完成了预期需求,对jQuery的运用得到了提高.这个插件的功能非常强大,除了基本的 ...

  2. asp.net MVC 3/4 equivalent to a response.filter

    am in a need to intercept all of the html that will be sent to the browser and replace some tags tha ...

  3. powerdesigner 设置字段显示comment注释

    在Columns标签下,一排按钮中找到这个按钮:Customize Columns and Filter

  4. 基于at91rm9200的i2c分析(DS1307实时时钟芯片)

    board-ek.c 构造i2c_board_info结构体 static struct i2c_board_info __initdata ek_i2c_devices[] = {     {    ...

  5. 升级iOS10后http网页定位失效解决方案

    最近我们在做项目时遇到这样一个新问题,用户在升级 iOS10 后,在 http 下使用 geolocation api 会报错,控制台输出 [blocked] Access to geolocatio ...

  6. php CURL 请求头和响应头获取

    1.从CURL中获取响应头 $oCurl = curl_init(); // 设置请求头, 有时候需要,有时候不用,看请求网址是否有对应的要求 $header[] = "Content-ty ...

  7. [置顶] Android异步加载数据库和多线程编程

    Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发.尚未有统一中文名称,中国大陆地区较多人使用“安卓” ...

  8. windows10(64位)Anaconda3+Python3.6搭建Tensorflow(cpu版本)及keras

    转自:windows10(64位)Anaconda3+Python3.6搭建Tensorflow(cpu版本)及keras 1.本来电脑安装的是anaconda3 5.3.1,但安装的python版本 ...

  9. 在CentOS/RHEL上设置SSH免密码登录

    本文会告诉你怎样在 CentOS/RHEL 上设置 SSH 免密码登录.自动登录配置好以后,你可以通过它使用 SSH (Secure Shell)和安全复制 (SCP)来移动文件. SSH 是开源的, ...

  10. Expectation Propagation: Theory and Application

    原文:http://dongguo.me/blog/2014/01/01/expectation-propagation/ 简介 第一次接触EP是10年在百度实习时,当时组里面正有计划把线上的CTR预 ...