HDU 4893 线段树裸题
Wow! Such Sequence!
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2512 Accepted Submission(s): 751
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
题意不说了,非常easy的线段树题目了。就是打标记改点求段,改动段时因为极限次数不多。直接暴力更新到点,
好久没写线段树了,错了好多次,写的好傻逼。
代码:
/* ***********************************************
Author :rabbit
Created Time :2014/8/4 14:58:15
File Name :11.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
ll fib[100];
struct node{
ll l,r;
ll sum,flag;
}a[800300];
ll m,n;
void pushup(ll t){
if(a[t].l==a[t].r)return;
a[t].sum=a[2*t].sum+a[2*t+1].sum;
a[t].flag=a[2*t].flag&a[2*t+1].flag;
}
void build(ll t,ll l,ll r){
// cout<<"hhh "<<l<<" "<<r<<endl;
a[t].l=l;
a[t].r=r;
a[t].sum=a[t].flag=0;
if(l==r)return;
ll mid=(l+r)/2;
build(2*t,l,mid);
build(2*t+1,mid+1,r);
pushup(t);
}
void update1(ll t,ll p,ll val){
if(a[t].l==a[t].r){
a[t].sum+=val;
a[t].flag=0;
return;
}
ll mid=(a[t].l+a[t].r)/2;
if(p<=mid)update1(2*t,p,val);
else update1(2*t+1,p,val);
pushup(t);
}
ll Find(ll x){
if(x <= 1)return 1;
int l = 1, r = 80, id = 80;
while(l <= r){
int mid = l+r>>1;
if(fib[mid] > x) id = mid, r = mid-1;
else l = mid+1;
}
if(x-fib[id-1] <= fib[id]-x) return fib[id-1];
return fib[id];
} void update2(ll t,ll l,ll r){
if(a[t].flag)return;
if(a[t].l==a[t].r){
a[t].sum=Find(a[t].sum);
a[t].flag=1;
//cout<<"ddd "<<l<<" "<<r<<" "<<a[t].sum<<endl;
return;
}
ll mid=(a[t].l+a[t].r)/2;
if(l<=mid)update2(2*t,l,r);
if(r>mid)update2(2*t+1,l,r);
pushup(t);
} ll getsum(ll t,ll l,ll r){
if(a[t].l>=l&&a[t].r<=r)return a[t].sum;
ll mid=(a[t].l+a[t].r)/2;
ll ans=0;
if(l<=mid)ans+=getsum(2*t,l,r);
if(r> mid) ans+=getsum(2*t+1,l,r);
return ans;
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout);
fib[0]=1;fib[1]=1;
for(ll i=2;i<=90;i++)fib[i]=fib[i-1]+fib[i-2];
while(~scanf("%I64d%I64d",&n,&m)){
// cout<<"ddd "<<endl;
build(1,1,n);
//cout<<"ppp "<<endl;
while(m--){
ll l,r,op;
scanf("%I64d%I64d%I64d",&op,&l,&r);
if(op==1){
update1(1,l,r);
// cout<<"han 1"<<endl;
}
if(op==2){
printf("%I64d\n",getsum(1,l,r));
// cout<<"han 2"<<endl;
}
if(op==3){
update2(1,l,r);
// cout<<"han 3"<<endl;
}
}
}
return 0;
}
/*
5 10
2 1 5
3 1 5
2 1 5
1 1 10
2 1 5
3 1 5
2 1 5 4 5
1 1 3
2 1 2
3 2 3
1 2 1
2 1 4
*/
HDU 4893 线段树裸题的更多相关文章
- POJ 3468 线段树裸题
这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...
- BZOJ1067&P2471 [SCOI2007]降雨量[线段树裸题+细节注意]
dlntqlwsl 很裸的一道线段树题,被硬生生刷成了紫题..可能因为细节问题吧,我也栽了一次WA50分.不过这个隐藏条件真的对本菜鸡来说不易发现啊. 未知的年份连续的就看成一个就好了,把年份都离散化 ...
- CPU监控 线段树裸题
LINK:bzoj3064 此题甚好码了20min停下来思考的时候才发现不对的地方有点坑... 还真不好写来着 可这的确是线段树的裸题...我觉得我写应该没有什么大问题 不过思路非常的紊乱 如果是自己 ...
- HDU 4893 线段树的 点更新 区间求和
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- 【LOJ6029】「雅礼集训 2017 Day1」市场(线段树裸题)
点此看题面 大致题意: 维护序列,支持区间加法,区间除法(向下取整),区间求\(min\)和区间求和. 线段树维护区间除法 区间加法.区间求\(min\)和区间求和都是线段树基本操作,因此略过不提. ...
- HDU 4893 线段树
比赛时太大意,斐波拉契数列开小了. 题目大意:1个序列,3种操作,改变序列某个数大小,将序列中连续的一段每个数都变成其最近的斐波拉契数,以及查询序列中某一段的数之和. 解题思路:维护add[]数组表示 ...
- HDU1166 线段树裸题 区间求和
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 1754 线段树模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 #include <cstdio> #include <cmath> # ...
- [HDU1754]I Hate It线段树裸题
http://acm.hdu.edu.cn/showproblem.php?pid=1754 解题关键:刚开始死活超时,最后发现竟然是ch,和t1.t2每次循环都定义的锅,以后养成建全局变量的习惯. ...
随机推荐
- luogu1168 中位数
题目大意 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[3], -, A[2k - 1]的中位数.即前1,3,5,--个数的中位数. 题解 ...
- LDA解决的问题
人类是怎么生成文档的呢?LDA的这三位作者在原始论文中给了一个简单的例子.比如假设事先给定了这几个主题:Arts.Budgets.Children.Education,然后通过学习训练,获取每个主题T ...
- Python中的traceback模块
traceback模块被用来跟踪异常返回信息. 如下例所示: 1.直接打印异常信息 import traceback try: raise SyntaxError, "traceback t ...
- 922. 按奇偶排序数组 II
给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数. 对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数:当 A[i] 为偶数时, i 也是偶数. 你可以返回任何满足上述条件的数组 ...
- C - Pocket Book(set)
Problem description One day little Vasya found mom's pocket book. The book had n names of her friend ...
- (C++)错误提示 c2352 :非静态成员函数的非法调用
静态成员函数相当于全局函数,只是有一个类名字空间的限制.而类成员函数是成员内部的函数,同一个类的对象实例可以有很多,每一个实例都有自已不同的成员变量值,成员函数一般都是对成员自已的成员变量值在操作.所 ...
- 重温前端基础之-css浮动与清除浮动
文档流的概念指什么?有哪种方式可以让元素脱离文档流? 文档流,指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列.并最终窗体自上而下分成一行行,并在每行中按从左到右的顺序排放元素.脱离文 ...
- express jade ejs 为什么要用这些?
express是快速构建web应用的一个框架 线上文档 http://www.expressjs.com.cn/ 不用express行不行呢? 看了网上的回答:不用express直接搭,等你 ...
- vue组件之间互相传值:父传子,子传父
今看到一篇很不错的vue组件传值文章,便于理解,遂做笔记- 一般页面的视图App.vue应为这样 一.父组件向子组件传值 1.创建子组件,在src/components/文件夹下新建一个Child.v ...
- C# indexof 注意