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 ...
随机推荐
- 张羿给的删除重复数据的mssql语句
select count(1), gsdm, idfrom ods_sc.T_D_DEVICE_COMMONgroup by gsdm, idhaving count(1) > 1; delet ...
- Entity Framework 的事务
一个db.SaveChanges()相当于一个事务,多个db.SaveChanges()保证操作完整性则需要使用事务 在Entity Framework 中使用事务,事务只会对数据库操作进行回滚,不会 ...
- C#基础学习第二天(.net菜鸟的成长之路-零基础到精通)
1.加号的使用 在我们c#当中,如果想要两个字符串相连接,那么我们可以使用+号连接. 加号两边如果有一边是字符串,那么此时字符串起到了一个连接的作用. 如果加号两遍都是数字,那么加号起到一个相加 ...
- zepto源码研究 - zepto.js-3 (常用的工具)
pluck: /** * 根据是否存在此属性来获取当前集合,返回一组属性值 * @param property * @returns {*} */ pluck: function(property){ ...
- JDBC数据源连接池的配置和使用实例
个人学习参考所用,勿喷! 使用JDBC建立数据库连接的两种方式: 1.在代码中使用DriverManager获得数据库连接.这种方式效率低,并且其性能.可靠性和稳定性随着用户访问量得增加逐渐下降. 2 ...
- cookie,localStorage,sessionStorage
1.cookie 由于HTTP是一种无状态的协议,服务器单从请求内容上无法判断客户身份.因此,cookie弥补这个缺陷,每次请求都携带cookie,这样服务器就能能知道不同的客户端请求了. 对于同一域 ...
- 学习笔记之AJAX无刷新分页
利用AJAX实现无刷新分页技术原理: 其主要是利用AJAX的异步处理机制,实现数据的异步传递,它隐藏了客户端向服务端请求数据的状态,在客户端表现为无刷新的显示状态. 实现分页的步骤: 1.客服端点击页 ...
- PHPCMS v9 模型概念及用法
phpcms v9 模型概念 一.什么是模型? 模型是系统知识的抽象表示.我们不能仅仅通过语言来描述一个系统,也不能仅仅通过记忆来记录关于系统的知识.知识是通过某种媒介来表达的,这种媒介所表达的内容就 ...
- python查看模块及相关函数帮助
Question: 如何查看正则表达式模块re及其相关函数的意义 1.终端命令行下 python >> import re >> help(re) Help on module ...
- 用C实现一个简单的对拍器——致每个曾经为求AC披星戴月的程序员们
大一新生,首次创作,虚心受教. 实现思路: 一.需要一个输入文件(input.txt),两个对拍程序(main1.exe,main2.exe) 二.将标准输入重定向为input.txt.将标准输出分别 ...