hdu-4893-Wow! Such Sequence!-线段树【2014多校第三场-J】
题意:一个初始为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】的更多相关文章
- 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区间上的所以数变成 ...
- HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)
磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add 把d加到第k个数上去2 ...
- 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 ...
- 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!(2014 Multi-University Training Contest 3)
题意: 有三种操作: 1 x y: 表示给x位置加上y 2 x y:查询[x,y]的区间和 3 x y:将 [x,y] 区间上的数变为最接近的 Fibonacci. 思路: 1 操作按正常单调更新,区 ...
- hdu 4893 Wow! Such Sequence!
http://acm.hdu.edu.cn/showproblem.php?pid=4893 三种操作: 1 k d - "add" 2 l r - "query sum ...
随机推荐
- 博文&零散信息阅读
关于培养方案: 全国一线高校.网易云课堂和我院培养计划的区别主要体现在: 基础课上,我院删去了物理课程的必修要求. 专业课上,删去了汇编语言.编译原理.信息安全技术等学科的必修要求. 专业选修课上,我 ...
- 802.11 wireless 三
802.11 wireless 3watts,milliwatts,and Decibels瓦特(功率单位)的定义是1焦耳/秒微波炉1000瓦特,手机100-200毫瓦 decibels(分贝:比较能 ...
- JS--事件对象中部份浏览器不兼容方法
测试时主要用的浏览器是Firefox 28.0.IE11.IE8.Chrome 34.0 一.什么是事件对象:当触发某个事件的时候,会产生一个事件对象,这个对象包含着所有的与事件有关的信息,包括导致 ...
- frequentism-and-bayesianism-chs
frequentism-and-bayesianism-chs 频率主义和贝叶斯主义——一个实用的介绍 此notebook最初出现在博客Pythonic Perambulations的文章.BSD l ...
- 驱动笔记 - IO端口和IO内存
访问IO端口 (#include <asm/io.h>) 设备资源struct resource{ resource_size_t start; //资源起始物理地址 resource_s ...
- HDU 1715 大菲波数(JAVA, 简单题,大数)
题目 //BigInteger 和 BigDecimal 是在java.math包中已有的类,前者表示整数,后者表示浮点数 import java.io.*; import java.util.*; ...
- Unit4中的Annotation
Unit4中的Annotation(注解.注释) JUnit4 使用 Java 5 中的注解(annotation),以下是JUnit4 常用的几个annotation介绍@Before:初始化方法@ ...
- java for循环的几种写法
J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简单地方式来遍历数组和Collection等类型的对象.本文介绍使用这种循环的具体方式,说明如何自行定义能被这样遍历的类 ...
- MongoDB (十一) MongoDB 排序文档
sort() 方法 要在 MongoDB 中的文档进行排序,需要使用sort()方法. sort() 方法接受一个文档,其中包含的字段列表连同他们的排序顺序.要指定排序顺序1和-1. 1用于升序排列, ...
- Could not create the driver from NHibernate.Driver.SQLite20Driver
使用NHibernate连接Sqlite语句,版本为.net3.5. 升级.net 4.0出现异常,提示”Could not create the driver from NHibernate.Dri ...