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 ...
随机推荐
- 【CentOS】安装配置vncserver
参考资料: http://my.oschina.net/yankunren/blog/70042 安装过程 (1).检查vncserver是否已经安装 [root@Nginx canyouNgx]# ...
- CSS3动画制作的简单示例
CSS3 大大强化了制作动画的能力,但是如果要做出图案比较复杂的动画,选择 GIF 依然是一个不错的选择.今天给大家介绍一个使用 CSS animation 配合雪碧图(CSS sprite)来制作动 ...
- Android系统软件卸载方法
最简单直接的卸载方式当然是用Re文件浏览器进系统软件目录删除即可,其次是用LBE等工具卸载系统软件.不过发现系统软件卸载后还会有桌面图标,怎么都干不掉,真是匪夷所思啊!简直就打不死的小强 系统软件装在 ...
- 索引服务混战ASP.NET――微软的又一个隔离墩
话说月初笔者在华山之巅搞定了ASP.NET一起莫名奇妙的异常,自此之后和公主过着…嘟--,不好意思,书都看杂了,串了台了.好,咱们闲言少叙,书归正传. 自从上次解决了由调试文件库引起的ASP.NET执 ...
- sql注入分类
Sql注入根据数据提取通道的类型,从服务器接收到的响应等可以分为不同的类型. 基于从服务器接收到的响应 ▲基于错误的SQL注入 ▲联合查询的类型 ▲堆查询注射 ▲SQL盲注 •基于布尔SQL盲注 •基 ...
- 设置VMWARE通过桥接方式使用主机无线网卡上网
原文:http://www.cnblogs.com/liongis/p/3265458.html 环境:WIN7旗舰版,台式机,U盘无线上网卡. 虚拟软件:VMware9.0,虚拟系统:CentOS6 ...
- H5+ and mui学习记录
基础 1.H5+ 定义实现了一些调用原生方法的对象 2.其他的原生方法可以通过Native.js调用 webview 3.webview是调用原生界面的H5+对象 4.单个webview只承载单个页面 ...
- PHP命名空间(Namespace)
http://www.jb51.net/article/36389.htm 字符串形式的动态调用方式 //魔法常量__NAMESPACE__的值是当前空间名称 //可以组合成字符串并调用 $comme ...
- POJ 1477
#include <iostream> #define MAXN 100 using namespace std; int _[MAXN]; int main() { //freopen( ...
- 刘汝佳 算法竞赛-入门经典 第二部分 算法篇 第五章 3(Sorting/Searching)
第一题:340 - Master-Mind Hints UVA:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Item ...