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
Source
Recommend
hujie | We have carefully selected several similar problems for you:
4896

pid=4895" target="_blank">
4895
4894

pid=4892" target="_blank">
4892

pid=4891" target="_blank">
4891

解题:线段树结点含两个和,一个真正和,还有一个是3号操作的备用和。

#include<iostream>
#include<stdio.h>
using namespace std;
struct tree
{
int l,r,t;
__int64 s,ts;
}ss[100010*3];
__int64 f[100]={1,1};
void setit(int l,int r,int d)
{
ss[d].l=l;
ss[d].r=r;
ss[d].t=0;//推断子结点是否须要进行3号操作
ss[d].s=0;//当前区间内的总和
ss[d].ts=1;//当前区间进行3号操作的备用和
if(l==r)
return;
setit(l,(l+r)/2,d*2);
setit((l+r)/2+1,r,d*2+1);
ss[d].ts=ss[d*2].ts+ss[d*2+1].ts;
}
__int64 doublekill(__int64 k)//查找与k最相近的Fibonacci
{
int l=0,r=77,mid;
__int64 x1,x2;
while(l<=r)
{
mid=(l+r)/2;
if(f[mid]==k)return f[mid];
if(f[mid]<k)l=mid+1;
else r=mid-1;
}
x1=f[l]-k;
if(x1<0)x1=-x1;
if(l>0)
{
x2=f[l-1]-k;
if(x2<0)x2=-x2;
if(x2<=x1)return f[l-1];
}
return f[l];
}
void insert1(__int64 e,int k,int d)//点更新
{
int l,r,mid;
l=ss[d].l;
r=ss[d].r;
mid=(l+r)/2;
if(l==r)
{
if(ss[d].t)
{
ss[d].s=ss[d].ts; ss[d].t=0;
}
ss[d].s+=e; ss[d].ts=doublekill(ss[d].s);//同一时候更新备用
return;
}
if(ss[d].t)//假设当前段须要进行3号操作
{
ss[d*2].t=1; ss[d*2+1].t=1; ss[d].t=0;
ss[d*2].s=ss[d*2].ts;
ss[d*2+1].s=ss[d*2+1].ts;
}
if(k>mid)insert1(e,k,d*2+1);
else insert1(e,k,d*2);
ss[d].s=ss[d*2].s+ss[d*2+1].s;
ss[d].ts=ss[d*2].ts+ss[d*2+1].ts;
}
void insert2(int l,int r,int d)//区间进行3号操作
{
int ll,rr,mid;
ll=ss[d].l;
rr=ss[d].r;
mid=(ll+rr)/2;
if(ll>=l&&rr<=r)
{
ss[d].s=ss[d].ts; ss[d].t=1;//子结点须要3号操作更新
return;
}
if(ss[d].t)
{
ss[d*2].t=1; ss[d*2+1].t=1; ss[d].t=0;
ss[d*2].s=ss[d*2].ts;
ss[d*2+1].s=ss[d*2+1].ts;
}
if(l<=mid)insert2(l,r,d*2);
if(r>mid)insert2(l,r,d*2+1);
ss[d].s=ss[d*2].s+ss[d*2+1].s;
}
__int64 find(int l,int r,int d)//求和
{
__int64 ll,rr,mid,s=0;
ll=ss[d].l;
rr=ss[d].r;
mid=(ll+rr)/2;
if(ll>=l&&rr<=r)
{
return ss[d].s;
}
if(ss[d].t)
{
ss[d*2].t=1; ss[d*2+1].t=1; ss[d].t=0;
ss[d*2].s=ss[d*2].ts;
ss[d*2+1].s=ss[d*2+1].ts;
}
if(l<=mid)s+=find(l,r,d*2);
if(r>mid)s+=find(l,r,d*2+1);
ss[d].s=ss[d*2].s+ss[d*2+1].s;
return s;
}
int main (void)
{
int n,m,i,j,k,l;
__int64 d;
for(i=2;i<78;i++)
f[i]=f[i-1]+f[i-2];
while(scanf("%d%d",&n,&m)>0)
{
setit(1,n,1);
while(m--)
{
scanf("%d%d",&j,&k);
if(j==1)
{
scanf("%I64d",&d);insert1(d,k,1);
}
else
{
scanf("%d",&l);
if(j==2)printf("%I64d\n",find(k,l,1));
else insert2(k,l,1);
}
}
}
return 0;
}

hdu4893Wow! Such Sequence! (线段树)的更多相关文章

  1. hdu-4893-Wow! Such Sequence!-线段树【2014多校第三场-J】

    题意:一个初始为0的数组,支持三种操作:1.向第k个数添加d,(|d| < 2^31);2.把[l, r]区间内的数字都换成与它最相近的Fibonacci数;3.询问[l, r]区间的和. 思路 ...

  2. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  3. Wow! Such Sequence!(线段树4893)

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

  4. Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间取摸

    D. The Child and Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...

  5. HDU 6047 Maximum Sequence(线段树)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...

  6. Codeforces 438D The Child and Sequence - 线段树

    At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at ...

  7. hdu 5828 Rikka with Sequence 线段树

    Rikka with Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...

  8. 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区间上的所以数变成 ...

  9. hdu-5805 NanoApe Loves Sequence(线段树+概率期望)

    题目链接: NanoApe Loves Sequence Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 262144/131072 ...

随机推荐

  1. iOS9中请求出现App Transport Security has blocked a cleartext HTTP (http://)

    错误描述: App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecu ...

  2. mysql实现增量备份

    有点要注意 如果你误删了表 想通过这个恢复 必须恢复日志里面有创建表的日志 不然的话是无法回复的  就是必须是从你开始创建表的时候就已经记录日志了  恢复到哪个位置 就按照哪个位置来计算 mysql ...

  3. JavaScript escape() 函数

    JavaScript escape() 函数 JavaScript 全局对象 定义和用法 escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串. 语法 escape(str ...

  4. PHPCMS v9修改栏目或者单页没有权限

    问题: 普通管理员没有权限修改栏目,只有超级管理员才有权限修改,凡是非超级管理员,设置栏目权限后只能添加栏目,不能对栏目进行修改和删除操作,提示您没有权限操作该项这使系统的一个BUG.   一.对于普 ...

  5. LRU缓存算法 - C++版

    LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法. 实现思路: hashtable + 双向链表 时间复杂度: 插入,查找,删除:O(1) 空间使用 ...

  6. 文成小盆友python-num13 整个堡垒机

    本节主要内容: 1.pymsql的使用 2.SQLAchemy使用 3.Paramiko 4.通过ORM功能使用和Paramiko的使用实现一个简单的堡垒机模型. 一.pymsql的使用 pymsql ...

  7. printk和printf的区别

    内核使用printk()打印! 应用层使用printf()打印! &&& 大部分常用的C库函数在Linux内核中都已经得到了实现.在所有没有实现的函数中,最著名的就数print ...

  8. d010: 分离自然数

    内容: 一个三位自然数,分离出它的百位.十位与个位上的数字 输入说明: 一行一个三位整数 输出说明: 一行三个数字 , 空格隔开.分别是百 十 个位数字 输入样例:   256 输出样例 : 2 5 ...

  9. 转: ubuntu配置NFS,挂载开发板

    ====================================== 命令: 1. $sudo apt-get install nfs-kernel-server           (安装N ...

  10. 用存储过程生成订单号ID

    DECLARE @sonumber BIGINTSELECT @sonumber=CONVERT(BIGINT, @serverId + Substring(CONVERT(VARCHAR(4), D ...