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

Problem Description
Recently, Doge got a funny birthday present from his new friend, Protein Tiger from St. Beeze College. No, not cactuses. It's a mysterious blackbox.



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.
 
Input
Input contains several test cases, please process till EOF.

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.
 
Output
For each Type 2 ("query sum") operation, output one line containing an integer represent the answer of this query.
 
Sample Input
1 1
2 1 1
5 4
1 1 7
1 3 17
3 2 4
2 1 5
 
Sample Output
0
22
 
Author
Fudan University
 
Source

题意不说了,非常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 线段树裸题的更多相关文章

  1. POJ 3468 线段树裸题

    这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...

  2. BZOJ1067&P2471 [SCOI2007]降雨量[线段树裸题+细节注意]

    dlntqlwsl 很裸的一道线段树题,被硬生生刷成了紫题..可能因为细节问题吧,我也栽了一次WA50分.不过这个隐藏条件真的对本菜鸡来说不易发现啊. 未知的年份连续的就看成一个就好了,把年份都离散化 ...

  3. CPU监控 线段树裸题

    LINK:bzoj3064 此题甚好码了20min停下来思考的时候才发现不对的地方有点坑... 还真不好写来着 可这的确是线段树的裸题...我觉得我写应该没有什么大问题 不过思路非常的紊乱 如果是自己 ...

  4. HDU 4893 线段树的 点更新 区间求和

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  5. 【LOJ6029】「雅礼集训 2017 Day1」市场(线段树裸题)

    点此看题面 大致题意: 维护序列,支持区间加法,区间除法(向下取整),区间求\(min\)和区间求和. 线段树维护区间除法 区间加法.区间求\(min\)和区间求和都是线段树基本操作,因此略过不提. ...

  6. HDU 4893 线段树

    比赛时太大意,斐波拉契数列开小了. 题目大意:1个序列,3种操作,改变序列某个数大小,将序列中连续的一段每个数都变成其最近的斐波拉契数,以及查询序列中某一段的数之和. 解题思路:维护add[]数组表示 ...

  7. HDU1166 线段树裸题 区间求和

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  8. hdu 1754 线段树模板题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 #include <cstdio> #include <cmath> # ...

  9. [HDU1754]I Hate It线段树裸题

    http://acm.hdu.edu.cn/showproblem.php?pid=1754 解题关键:刚开始死活超时,最后发现竟然是ch,和t1.t2每次循环都定义的锅,以后养成建全局变量的习惯. ...

随机推荐

  1. 网络 - 网关的作用、DNS的作用

    DNS的作用 域名系统.负责把域名翻译成ip,或者把ip翻译成域名. hosts文件用于静态的域名解析.优先级高于DNS解析. DNS服务器,负责解析域名到ip地址上. 114.114.114.114 ...

  2. k8s istio 配置请求的路由规则

    使用istio我们可以根据权重和HTTP headers来动态配置请求路由. 基于内容的路由 因为BookInfo示例部署了3个版本的评论微服务,我们需要设置一个默认路由. 否则,当你多次访问应用程序 ...

  3. 【算法】Quick Select

    针对问题 找到一对无序的数中第  K  大,或者第 K 小的元素,返回该元素的值或者它的 index(index 的情况比较适合这堆数每个都独一无二的情况,不然可能会有多个答案). 关键思想 拿一个数 ...

  4. IP与以太网的包收发操作

    你好,这是<网络是怎样连接的>的第3篇读书笔记,第二章<用电信号传输TCP/IP>后半部分:IP与以太网的包收发操作. 先看下经典的TCP/IP四层模型: 通常,下层模块支撑上 ...

  5. 关于Html基础语法学习

    晚上做完初赛,好像有点颓,就来学了学html,毕竟博客里面会用到嘛. 首先贴出我所学习的教程 http://www.w3school.com.cn/html/index.asp 我觉得吧,可能以我的记 ...

  6. vue项目中阻止浏览器返回上一页

    vue项目中在某个页面阻止浏览器返回上一页,适用移动端.PC端. 使用场景例如: 首页 与 A页面     来回跳转,那样点击浏览器返回时也会来回跳转,本想当页面在首页的时候就不再返回了,所以这个时候 ...

  7. 树莓派-基于aria2实现离线下载

    安装aria2 aria2是linux下的一个下载工具,它支持http.bt种子.磁力链接三种方式下载 sudo apt-get install aria2 配置aria2 aria2支持命令参数,也 ...

  8. swi prolog 与c#

    最近,玩了一下prolog语言,感觉还是很有意思.由于我是学c#的,所以就不禁想看看c#如何与prolog进行结合,在网上找了一下,发现有个swi prolog对c#的dll,下载官网:http:// ...

  9. 第一个Hibernate程序

    一 新建一个Java工程(Hibernate) 在src目录下创建一个名为"hibernate.cfg.xml"的文件并配置好各个属性,如下: <?xml version=& ...

  10. jquery自动完成插件的使用

    .ui-autocomplete { z-index: !important; max-height: 100px; overflow-y: auto; /* 防止水平滚动条 */ overflow- ...