HDU 4893 线段树
比赛时太大意,斐波拉契数列开小了。
题目大意:1个序列,3种操作,改变序列某个数大小,将序列中连续的一段每个数都变成其最近的斐波拉契数,以及查询序列中某一段的数之和。
解题思路:维护add[]数组表示线段树中每一段的需要改变到斐波拉契数的总和即可,color[]表示该段是否需要改变成斐波拉契,而当需要改变成斐波拉契数时,直接将sum+=add。其余便是线段树基础操作。
#include <cstdio>
#define T 1000005
#define N 100005
long long f[],sum[T],add[T];
int l,r,p;
bool color[T];
void PushDown(int rt){
if(color[rt]){
color[rt]=;
color[rt*]=color[rt*+]=;
sum[rt*]+=add[rt*];
sum[rt*+]+=add[rt*+];
add[rt*]=;
add[rt*+]=;
}
}
void PushUp(int rt){
sum[rt]=sum[rt*]+sum[rt*+];
add[rt]=add[rt*]+add[rt*+];
}
void build(int l, int r, int rt){
sum[rt]=;
color[rt]=;
if(l==r) add[rt]=;
if(l>=r) return;
int m=(l+r)/;
build(l,m,rt*);
build(m+,r,rt*+);
PushUp(rt);
}
void update(int k, int d, int l, int r, int rt){
if(l==r){
color[rt]=;
sum[rt]+=d;
if(sum[rt]<=) add[rt]=-sum[rt];
else{
for(int i=; i<=; i++)
if(f[i]<=sum[rt]&&sum[rt]<f[i+]){
if(sum[rt]-f[i]<=f[i+]-sum[rt])
add[rt]=f[i]-sum[rt];
else
add[rt]=f[i+]-sum[rt];
break;
}
}
return;
}
PushDown(rt);
int m=(l+r)/;
if(k<=m) update(k,d,l,m,rt*);
else update(k,d,m+,r,rt*+);
PushUp(rt);
}
void change(int x, int y, int l, int r, int rt){
if(x<=l&&y>=r){
sum[rt]+=add[rt];
add[rt]=;
color[rt]=;
return;
}
PushDown(rt);
int m=(l+r)/;
if(x<=m&&!color[rt*]) change(x,y,l,m,rt*);
if(y>m&&!color[rt*+]) change(x,y,m+,r,rt*+);
PushUp(rt);
}
long long query(int x, int y, int l, int r, int rt){
if(x<=l&&y>=r) return sum[rt];
PushDown(rt);
int m=(l+r)/;
long long s=;
if(x<=m) s+=query(x,y,l,m,rt*);
if(y>m) s+=query(x,y,m+,r,rt*+);
PushUp(rt);
return s;
}
int main()
{
f[]=f[]=;
for(int i=; i<=; i++)
f[i]=f[i-]+f[i-];
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
build(,n,);
for(int i=; i<m; i++){
scanf("%d%d%d",&p,&l,&r);
switch (p){
case :
update(l,r,,n,);
break;
case :
printf("%I64d\n",query(l,r,,n,));
break;
case :
change(l,r,,n,);
break;
}
}
}
return ;
}
HDU 4893 线段树的更多相关文章
- HDU 4893 线段树的 点更新 区间求和
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- HDU 4893 线段树裸题
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- hdu 5877 线段树(2016 ACM/ICPC Asia Regional Dalian Online)
Weak Pair Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...
- hdu 3974 线段树 将树弄到区间上
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3436 线段树 一顿操作
Queue-jumpers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- hdu 3397 线段树双标记
Sequence operation Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 4578 线段树(标记处理)
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others) ...
- hdu 4533 线段树(问题转化+)
威威猫系列故事——晒被子 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Tot ...
- hdu 2871 线段树(各种操作)
Memory Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
随机推荐
- Asp.Net生命周期系列二
在上回书开始的时候我们提到博客园的IIS看了一眼我的请求后就直接交给ASP.NET去处理了,并且要求ASP.NET处理完之后返回HTML以供展示. 那么我们不仅要问: 1, IIS肯定是没有眼睛 ...
- beego 0.9.0 中智能路由AutoRouter的使用方法及源码解读
了解beego的开发者肯定知道,beego的路由设计来源于sinatra,原来是不支持自动路由的,每一个路由都要自己配置的,如: type MainController struct { beego. ...
- Careercup - Facebook面试题 - 5671785349513216
2014-05-02 01:05 题目链接 原题: bool anaStrStr (string needle, string haystack) { } Write a function that ...
- bzoj 3907: 网格 组合数学
3907: 网格 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 13 Solved: 7[Submit][Status][Discuss] Descr ...
- 【Vijos】【1164】曹冲养猪
中国剩余定理 没啥重要的……模板题,中国剩余定理就是解出模线性方程组的一个可行解(好像也是唯一解?) 这是一种神奇的构造方法……明白了为什么这样构造是对的就行了=.=至于怎么想到这种构造方法的……去问 ...
- .NET基础篇——Entity Framework 数据转换层通用类
在实现基础的三层开发的时候,大家时常会在数据层对每个实体进行CRUD的操作,其中存在相当多的重复代码.为了减少重复代码的出现,通常都会定义一个共用类,实现相似的操作,下面为大家介绍一下Entity F ...
- C# 知识笔记
HttpContext.Request.Form.ToString() 获取Form表单中的内容 /// <summary> /// 获取 GET 提交方式值 /// </summa ...
- ZOJ 1642 Match for Bonus (DP)
题目链接 题意 : 给你两个字符串,两个字符串都有共同的字母,给你每个字母的值,规则是,找出两个字符串中的共同的一个字母,然后这个字母的值就可以加到自己的分数上,但是这步操作之后,这两个字母及其之前的 ...
- keystonejs
开始之前先确保你已经安装了Node.js 0.10+ 和MongoDB v2.4+. 要使用KeystoneJS,你需要掌握合理的Javascript知识,并熟悉数据库概念之类的基础知识,会用 nod ...
- application.xml定时
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...