线段树 + 区间更新: HDU 4893 Wow! Such Sequence!
Wow! Such Sequence!
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2234 Accepted Submission(s): 657
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.
2 1 1
5 4
1 1 7
1 3 17
3 2 4
2 1 5
22
【题目分析】
这题相比于裸的线段树区间更新有了一些难度。
我们在每个结点中设一个fib,表示离sum最近的fibnacci数,每次区间更新时,就将sum的值更新为fib。fib的值只有在单点更新的过程中才会改变,也就是说当sum值改变的时候fib才改变,因为当sum变为fib后,离sum最近的fibnacci数还是fib值。
lazy----记录该点以下的孩子结点是否需要更新。
我用long long ,然后用了%lld输入,不知道杭电不支持%lld,debug了半天,TLE了20多次,后来改%lld为%I64d就过了,哭死QAQ...
//Memory Time
// K MS
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<iomanip>
#include<string>
#include<climits>
#include<cmath>
#define MAX 100010
#define LL long long
using namespace std;
LL n,m;
LL ans;
LL f[60]; struct Tree
{
LL l,r;
LL sum,fib;
bool lazy;
};
Tree tree[MAX*3]; LL Find(LL x)
{
if(x<=0)return 1;
LL ldis,rdis;
for(int i=0;i<59;++i)
{
if(f[i]<=x&&f[i+1]>=x)
{
ldis=x-f[i];
rdis=f[i+1]-x;
return ldis<=rdis?f[i]:f[i+1];
}
}
} void pushup(LL x)
{
LL tmp=x<<1;
tree[x].sum=tree[tmp].sum+tree[tmp+1].sum;
tree[x].fib=tree[tmp].fib+tree[tmp+1].fib;
} void pushdown(LL x)
{
if(!tree[x].lazy)return;
tree[x].lazy=0;
if(tree[x].l==tree[x].r)return;
LL tmp=x<<1;
tree[tmp].lazy=tree[tmp+1].lazy=1;
tree[tmp].sum=tree[tmp].fib;
tree[tmp+1].sum=tree[tmp+1].fib;
} void build(LL l,LL r,LL x)
{
tree[x].l=l,tree[x].r=r;
tree[x].sum=0,tree[x].fib=1,tree[x].lazy=0;
if(l==r)return;
LL tmp=x<<1;
LL mid=(l+r)>>1;
build(l,mid,tmp);
build(mid+1,r,tmp+1);
pushup(x);
} void add(LL x,LL k,LL num)
{
if(tree[x].l==tree[x].r)
{
tree[x].sum+=num;
tree[x].fib=Find(tree[x].sum);
return;
}
if(tree[x].lazy)
pushdown(x);
LL tmp=x<<1;
LL mid=(tree[x].l+tree[x].r)>>1;
if(k<=mid)
add(tmp,k,num);
else if(k>mid)
add(tmp+1,k,num);
pushup(x);
} void change(LL l,LL r,LL x)
{
if(r<tree[x].l||l>tree[x].r)return;
if(l<=tree[x].l&&r>=tree[x].r)
{
tree[x].sum=tree[x].fib;
tree[x].lazy=1;
return;
}
if(tree[x].lazy)pushdown(x);
LL tmp=x<<1;
LL mid=(tree[x].l+tree[x].r)>>1;
if(r<=mid)
change(l,r,tmp);
else if(l>mid)
change(l,r,tmp+1);
else
{
change(l,mid,tmp);
change(mid+1,r,tmp+1);
}
pushup(x);
} void query(LL l,LL r,LL x)
{
if(r<tree[x].l||l>tree[x].r)return;
if(l<=tree[x].l&&r>=tree[x].r)
{
ans+=tree[x].sum;
return;
}
if(tree[x].lazy)
pushdown(x);
LL tmp=x<<1;
LL mid=(tree[x].l+tree[x].r)>>1;
if(r<=mid)
query(l,r,tmp);
else if(l>mid)
query(l,r,tmp+1);
else
{
query(l,mid,tmp);
query(mid+1,r,tmp+1);
}
pushup(x);
} int main()
{
// freopen("cin.txt","r",stdin);
// freopen("cout.txt","w",stdout);
f[0]=f[1]=1;
for(int i=2;i<60;++i) f[i]=f[i-1]+f[i-2];
while(scanf("%I64d %I64d",&n,&m)!=EOF)
{
build(1,n,1);
LL a,b,c;
while(m--)
{
scanf("%I64d %I64d %I64d",&a,&b,&c);
if(a==1)
add(1,b,c);
else if(a==2)
{
ans=0;
query(b,c,1);
printf("%I64d\n",ans);
}
else
change(b,c,1);
}
}
return 0;
}
线段树 + 区间更新: HDU 4893 Wow! Such Sequence!的更多相关文章
- 线段树 + 区间更新 ----- HDU 4902 : Nice boat
Nice boat Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- 线段树-区间更新-HDU 1689
#include <iostream> #include <cstdio> #include <string> #include <cstring> # ...
- HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...
- HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...
- hdu 4031 attack 线段树区间更新
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Subm ...
- hdu 3966(树链剖分+线段树区间更新)
传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...
- HDU.1556 Color the ball (线段树 区间更新 单点查询)
HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
- HDU 1698 线段树 区间更新求和
一开始这条链子全都是1 #include<stdio.h> #include<string.h> #include<algorithm> #include<m ...
随机推荐
- sudo 的介绍
http://chenfage.blog.51cto.com/8804946/1830424
- Android开发中无处不在的设计模式——动态代理模式
继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...
- Sql Server删除数据表中重复记录 三种方法
本文介绍了Sql Server数据库中删除数据表中重复记录的方法. [项目]数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除![分析]1 ...
- HTML5学习笔记(十八):闭包
高阶函数 JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,也可以返回一个函数,这种函数就称之为高阶函数. 函数作为参 ...
- 菜鸟调错(一)——Maven项目部署到Jboss出现:Failed to create a new SAX parser
今天调试的时候遇到一个错误,往Jboss的deploy目录扔war包的时候,报了一个“Failed to create a new SAX parser”的错误.在网上找了找解决方案,一般都说将项目中 ...
- do-release-upgrade升级笔记
事后的总结: 后来可能因为阿里云镜像并不是完全底层无关镜像,do-release-upgrade后的18.04版本在经过一次异常的内核版本升级以后,restart失败,因为是虚机还很难处理,不得不直接 ...
- [CoreOS]CoreOS 实战:CoreOS 及管理工具介绍
转载:http://www.infoq.com/cn/articles/what-is-coreos [编者按]CoreOS是一个基于Docker的轻量级容器化Linux发行版,专为大型数据中心而设计 ...
- Django model中的Class Meta
1.Meta元数据 代码示例: class Foo(models.Model): bar = models.CharField(maxlength=30) class Meta: # ... Meta ...
- Android中XML文件的序列化生成与解析
xml文件是非常常用的,在android中json和xml是非常常用的两种封装数据的形式,从服务器中获取数据也经常是这两种形式的,所以学会生成和解析xml和json是非常有用的,json相对来说是比较 ...
- 【转】(四)unity4.6Ugui中文教程文档-------概要-UGUI Visual Components
原创至上,移步请戳:(四)unity4.6Ugui中文教程文档-------概要-UGUI Visual Components 3.Visual Components 有新的组件和游戏对象已添加到uG ...