hdu4893Wow! Such Sequence! (线段树)
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
4896
pid=4895" target="_blank">
4895
pid=4892" target="_blank">
4892
pid=4891" target="_blank">
4891
#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! (线段树)的更多相关文章
- hdu-4893-Wow! Such Sequence!-线段树【2014多校第三场-J】
题意:一个初始为0的数组,支持三种操作:1.向第k个数添加d,(|d| < 2^31);2.把[l, r]区间内的数字都换成与它最相近的Fibonacci数;3.询问[l, r]区间的和. 思路 ...
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
- Wow! Such Sequence!(线段树4893)
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 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 ...
- HDU 6047 Maximum Sequence(线段树)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...
- 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 ...
- hdu 5828 Rikka with Sequence 线段树
Rikka with Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...
- 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区间上的所以数变成 ...
- hdu-5805 NanoApe Loves Sequence(线段树+概率期望)
题目链接: NanoApe Loves Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/131072 ...
随机推荐
- GDI+基础(1)
转载:http://www.cnblogs.com/peterzb/archive/2009/07/19/1526555.html System.Drawing 命名空间提供了对 GDI+ 基本图形功 ...
- (转)server.urlencode有什么用?怎么用?
这个函数主要是为了,不同浏览器的事,如果你传递的参数是中文,有的浏览器就显示出错,如果转换成编码形式,就可以正确传递!当然在IE下2个结果都是一样的,你看不出来区别,用编码来传递参数是一个好习惯,养成 ...
- 【转】常用背景色RGB数值
[转自]http://blog.sina.com.cn/s/blog_8fc890a201013z8h.html
- C#01
C#语言 求4名同学三门成绩的平均值 using System; using System.Collections.Generic; using System.Linq; using System.T ...
- 转:测试计划(出处:: 51Testing软件测试网--zfx081)
测试计划阶段主要处于测试的先期准备阶段,在该阶段中主要是对将要进行的测试工作做一个整体的规划.包括一下内容: 1.测试目的和测试项目简介. 1.1测试目的:××××系统的测试计划有助于实现一下目标 ...
- Oracle数据库之数据类型
Oracle数据库之数据类型 Oracle基本数据类型(亦叫内置数据类型,internal datatypes或built-in datatypes)可以按类型分为:字符串类型.数字类型.日期类型.L ...
- 复制、移动和删除:cp, rm, mv
要复制文件,请使用cp(copy)命令.不过,cp命令的用途很多.除了单纯的复制之外,还可以建立连接文件(就是快捷方式),比较两个文件的新旧而予以更新,以及复制整个目录等等.至于移动目录与文件,则使用 ...
- 一个读取C#特性Description方法
class Program { static void Main(string[] args) { string str= DB.write.ToDescription(); Console.Writ ...
- C程序设计语言练习题1-19
练习1-19 编写函数reverse(s),将字符串s中的字符顺序颠倒过来.使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序.代码如下: #include <stdio.h> // ...
- 隐藏NGINX服务器名称 和版本号
隐藏NGINX服务器名称: 修改或隐藏服务器名称需要修改源码nginx.h,nginx.h在src/core/目录下 .具体操作如下: 把下面两个宏的值修改为自己设定的值,例如"NGX&qu ...