HDU4893:Wow! Such Sequence!(段树lazy)
After some research, Doge found that the box is maintaining a sequence an of n numbers internally, initially all numbers are zero, and there are THREE "operations":
1.Add d to the k-th number of the sequence.
2.Query the sum of ai where l ≤ i ≤ r.
3.Change ai to the nearest Fibonacci number, where l ≤ i ≤ r.
4.Play sound "Chee-rio!", a bit useless.
Let F0 = 1,F1 = 1,Fibonacci number Fn is defined as Fn = Fn - 1 + Fn - 2 for n ≥ 2.
Nearest Fibonacci number of number x means the smallest Fn where |Fn - x| is also smallest.
Doge doesn't believe the machine could respond each request in less than 10ms. Help Doge figure out the reason.
For each test case, there will be one line containing two integers n, m.
Next m lines, each line indicates a query:
1 k d - "add"
2 l r - "query sum"
3 l r - "change to nearest Fibonacci"
1 ≤ n ≤ 100000, 1 ≤ m ≤ 100000, |d| < 231, all queries will be valid.
1 1
2 1 1
5 4
1 1 7
1 3 17
3 2 4
2 1 5
0
22#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define ll __int64
#define maxn 100005
#define ls l,mid,2*i
#define rs mid+1,r,2*i+1
#define lson 2*i
#define rson 2*i+1
struct node
{
int l,r;
ll e,f;//e为该区间的和,f为其近期的斐波那契数
int flag,len;//flag,标记这个区间内是否斐波那契数,len为长度
} a[maxn<<2];
int n,m;
ll f[90] = {1,1}; ll pabs(ll a)
{
return a<0?-a:a;
} void PushDown(int i,int m)
{
if(a[i].flag)
{
a[lson].flag = a[rson].flag = a[i].flag;
a[lson].len = a[i].flag*(m-m>>1);
a[rson].len = a[i].flag*(m>>1);
a[lson].e = a[lson].f;
a[rson].e = a[rson].f;
a[i].flag = 0;
}
} void PushUp(int i)
{
a[i].e = a[lson].e+a[rson].e;
a[i].f = a[lson].f+a[rson].f;
} void init(int l,int r,int i)
{
a[i].flag = a[i].len = 0;
a[i].l = l;
a[i].r = r;
a[i].e = 0;
if(l == r)
{
a[i].f = 1;
return;
}
int mid = (l+r)>>1;
init(ls);
init(rs);
PushUp(i);
} void add(int pos,int m,int l,int r,int i)
{
if(pos<l || pos>r) return ;
if(l == r)
{
if(a[i].flag)
{
a[i].e = m+a[i].f;
a[i].flag = 0;
a[i].len = 0;
}
else a[i].e+=m;
int p = lower_bound(f,f+80,a[i].e)-f;
if(!p)
a[i].f = 1;
else if(pabs(a[i].e-f[p])<pabs(a[i].e-f[p-1]))
a[i].f = f[p];
else
a[i].f = f[p-1];
return ;
}
PushDown(i,r-l+1);
int mid = (l+r)>>1;
if(pos<=mid) add(pos,m,ls);
else add(pos,m,rs);
PushUp(i);
} ll query(int L,int R,int l,int r,int i)
{
if(R<l || L>r) return 0;
else if(L<=l && R>=r) return a[i].e;
PushDown(i,r-l+1);
ll ans = 0;
int mid = (l+r)>>1;
if(L<=mid)
ans += query(L,R,ls);
if(R>mid)
ans += query(L,R,rs);
return ans;
} void change(int L,int R,int l,int r,int i)
{
if(R<l || L>r) return ;
if(L<=l && R>=r)
{
a[i].e = a[i].f;
a[i].flag = 1;
a[i].len = r-l+1;
return ;
}
PushDown(i,r-l+1);
int mid = (l+r)>>1;
if(L<=mid)
change(L,R,ls);
if(R>mid)
change(L,R,rs);
PushUp(i);
} int main()
{
int i,j,x,k,d,l,r;
for(i = 2; i<80; i++)
f[i] = f[i-1]+f[i-2];
while(~scanf("%d%d",&n,&m))
{
init(1,n,1);
while(m--)
{
scanf("%d",&x);
if(x == 1)
{
scanf("%d%d",&k,&d);
add(k,d,1,n,1);
}
else
{
scanf("%d%d",&l,&r);
if(x == 2)
printf("%I64d\n",query(l,r,1,n,1));
else
change(l,r,1,n,1);
}
}
} return 0;
}
HDU4893:Wow! Such Sequence!(段树lazy)的更多相关文章
- 2014多校3 Wow! Such Sequence!段树
主题链接:http://acm.hdu.edu.cn/showproblem.php? pid=4893 这个问题还真是纠结啊--好久不写线段树的题了.由于这几天学伸展树.然后认为线段树小case了. ...
- 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!(线段树)
题目链接:hdu 4983 Wow! Such Sequence! 题目大意:就是三种操作 1 k d, 改动k的为值添加d 2 l r, 查询l到r的区间和 3 l r. 间l到r区间上的所以数变成 ...
- hdu4893 Wow! Such Sequence!
线段树结点上保存一个一般的sum值,再同一时候保存一个fbsum,表示这个结点表示的一段数字若为斐波那契数时的和 当进行3操作时,仅仅用将sum = fbsum就可以 其它操作照常进行,仅仅是单点更新 ...
- 线段树 + 区间更新: 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! (线段树)
Wow! Such Sequence! 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4893 Description Recently, Doge ...
- HDU 1394 Minimum Inversion Number (数据结构-段树)
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- PKU A Simple Problem with Integers (段树更新间隔总和)
意甲冠军:一个典型的段树C,Q问题,有n的数量a[i] (1~n),C, a, b,c在[a,b]加c Q a b 求[a,b]的和. #include<cstdio> #include& ...
- HDU 6356.Glad You Came-线段树(区间更新+剪枝) (2018 Multi-University Training Contest 5 1007)
6356.Glad You Came 题意就是给你一个随机生成函数,然后从随机函数里确定查询的左右区间以及要更新的val值.然后最后求一下异或和就可以了. 线段树,区间最大值和最小值维护一下,因为数据 ...
随机推荐
- view和activity的区别(转)
activity相当于控制部分,view相当于显示部分.两者之间是多对多的关系,所有东西必须用view来显示. viewGroup继承自view,实现了ViewManager,ViewParent接口 ...
- android 泰国/缅甸语/捷克较低,Contacts联系出现精神错乱之类的问题清单
更改ContactsProvider2.java文件 public static final String SECTION_HEADING = "SUBSTR(%1$s,1,1)" ...
- Linux在简短而经常使用的命令
Linux组成: 内核:的心脏.是执行程序和管理像磁盘和打印机等硬件设备的核心程序. shell:是系统的用户界面,提供了用户和内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行.是 ...
- 谷歌技术面试要点(Google面试)(14年5月20日交大专场)
技术面试的主题 1.简要自我介绍: 姓名.学校.专业 做过的项目与实习 个人主要成就 2.技术评估: 构建与开发算法 编程 计算机基础知识 数据结构 现实世界问题解决能力 设计问题(主要针对博士生) ...
- Android运用自己的标题栏
Android程序的标题栏TitleBar区域很单调,如果想个性化一些可以通过下面的方法来为自己软件的标题定制一个layout布局文件,比如浏览器的标题栏,它包含了网站的Favicon,自定义的进度条 ...
- HDU 3836 Equivalent SetsTarjan+缩点)
Problem Description To prove two sets A and B are equivalent, we can first prove A is a subset of B, ...
- Android Stuido怎样查看快捷键冲突?
看了这篇文章Android Studio怎样查看资源或者函数在哪些类中被引用.知道了快捷键失效的原因,当中有一个原因就是快捷键冲突.那怎样查看快捷键哪些项冲突了呢? Android Studio要查看 ...
- Lua Development Tools (LDT)
http://www.eclipse.org/ldt/ Lua Development Tools (LDT) is about providing Lua developers with an ID ...
- 【JAVA】【NIO】3、Java NIO Channel
Java NIO和流量相似,但有些差异: ·通道可读写,流仅支持单向.读或写 ·异步通道读取 ·通道读写器,他们是和Buffer交替 道的实现 下面是Java NIO中最重要的通道的实现: ·File ...
- mac eclipse svn subeclipse: Failed to load JavaHL Library.
Failed to load JavaHL Library. These are the errors that were encountered: no libsvnjavahl-1 in java ...