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. Ecstore关于finder的默认的参数row的数据不见了的一些小问题?

    在finder中,我们经常对默认的参数row进行数据的编辑处理,然而,在实际处理中,会遇到这么一个问题,该处理的数据不见了,造成这一原因的重要原 因是因为在设置的时候,把某些字段屏蔽掉了,导致返回的r ...

  2. AndroidSdk下载地址和环境变量配置

    一.Android Studio 下的AndroidSdk下载地址 http://tools.android-studio.org/index.php/sdk 二.Android Sdk环境变量设置 ...

  3. IIS 7.5 配置伪静态

    IIS 7.5 配置伪静态_win服务器_脚本之家 win7下IIS的安装和配置 图文教程详细出处参考:http://www.jb51.net/article/29787.htm http://blo ...

  4. [php基础]PHP环境变量$_SERVER和系统常量详细说明

    在PHP网站开发中,为了满足网站的需要,时常需要对PHP环境变量进行设置和应用,在虚拟主机环境下,有时我们更需要通过PHP环境变量操作函数来对PHP环境变量值进行设置.为此我们有必要对PHP环境变量先 ...

  5. github修改自己的昵称

    由于刚接触github,不会用,就随便写了个昵称,后来想改,却不知道从哪里改,到百度搜结果都是说不能修改的(这里就不吐槽百度了),还是直接上图吧. 点击Settings,然后跳转到下面界面,点击Acc ...

  6. An attempt to attach an auto-named database for file

    在用VS自带的 .mdf读取(joint)时,报错: Server Error in '/' Application. An attempt to attach an auto-named datab ...

  7. 反序列化 DateTime对象问题

      今天在Android的Json反序列化过程中,Date类型无法转化成自己想要的格式,鉴于之前在C#的反序列话中也遇到过这个问题,解决的同时,顺手做个总结,供自己及需要的人日后查阅.       将 ...

  8. jquery插件:点击拉出的右侧滑动菜单

    就是一个停留在页面右侧的滑动菜单,点击可以拉出,带回调函数.宽高位置可以参数指定.插件代码如下: (jquery的路径请自己修改) (function($){ $.fn.sideSwitch = fu ...

  9. Skin++ 皮肤库 CCheckListBox MFC 界面风格

    今天使用CCheckListBox,发现增加进去的字符串无法显示,但是当点击的时候,确有反应. 仔细检查代码,没有问题.之前也是这样用的,完全没有问题. 思前想后,觉得是因为使用了Skin++皮肤库, ...

  10. Java语言实现简单FTP软件------>FTP软件本地窗口的实现(五)

    1.首先看一下本地窗口的布局效果 2.看一下本地窗口实现的代码框架 2.本地窗口的具体实现代码LocalPanel.java package com.oyp.ftp.panel.local; impo ...