HDU 4893 线段树裸题
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
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
题意不说了,非常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 线段树裸题的更多相关文章
- POJ 3468 线段树裸题
这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...
- BZOJ1067&P2471 [SCOI2007]降雨量[线段树裸题+细节注意]
dlntqlwsl 很裸的一道线段树题,被硬生生刷成了紫题..可能因为细节问题吧,我也栽了一次WA50分.不过这个隐藏条件真的对本菜鸡来说不易发现啊. 未知的年份连续的就看成一个就好了,把年份都离散化 ...
- CPU监控 线段树裸题
LINK:bzoj3064 此题甚好码了20min停下来思考的时候才发现不对的地方有点坑... 还真不好写来着 可这的确是线段树的裸题...我觉得我写应该没有什么大问题 不过思路非常的紊乱 如果是自己 ...
- HDU 4893 线段树的 点更新 区间求和
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ...
- 【LOJ6029】「雅礼集训 2017 Day1」市场(线段树裸题)
点此看题面 大致题意: 维护序列,支持区间加法,区间除法(向下取整),区间求\(min\)和区间求和. 线段树维护区间除法 区间加法.区间求\(min\)和区间求和都是线段树基本操作,因此略过不提. ...
- HDU 4893 线段树
比赛时太大意,斐波拉契数列开小了. 题目大意:1个序列,3种操作,改变序列某个数大小,将序列中连续的一段每个数都变成其最近的斐波拉契数,以及查询序列中某一段的数之和. 解题思路:维护add[]数组表示 ...
- HDU1166 线段树裸题 区间求和
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- hdu 1754 线段树模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 #include <cstdio> #include <cmath> # ...
- [HDU1754]I Hate It线段树裸题
http://acm.hdu.edu.cn/showproblem.php?pid=1754 解题关键:刚开始死活超时,最后发现竟然是ch,和t1.t2每次循环都定义的锅,以后养成建全局变量的习惯. ...
随机推荐
- 修改linux内核的启动logo和禁用启动光标【转】
本文转载自:http://blog.csdn.net/hunanchenxingyu/article/details/40992947 1-1.制作logo的方法: 首先选择一个自己喜欢的图片,png ...
- 【BZOJ 2351】 Matrix
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2351 [算法] 哈希 [代码] #include<bits/stdc++.h& ...
- netcore发布到centos 验证码Zkweb.system.drawing不显示及乱码的问题
netcore发布到centos 使用的是Zkweb.system.drawing生成验证码,发布后可能会出现不显示及乱码的情况 1.验证码图片不显示(通过日志会发现生成图片时代码已经异常) Zkwe ...
- C#中图片转换为Base64编码,Base64编码转换为图片
#region 图片转为base64编码的字符串 public string ImgToBase64String(string Imagefilename) { try { Bitmap bmp = ...
- 使用Micrisoft.net设计方案 第二章组织模式
第二章组织模式 模式不仅依赖于它所包含的更小模式,同时也依赖包含它的更大的模式.它是描述复杂软件的系统方法. 本章的目标是让我们了解以下问题: 1.如何标识模式与模式的关系 2.如何把模式组织成模式集 ...
- adb 通过 WiFi 连接 Android 设备
PC 和 Android 设备连接在同一个局域网. 查看 Android 设备的 IP:设置 > WLAN > 选择连接的WiFi > 查看IP地址. PC 端执行: ping &l ...
- java网络编程之socket(1)
网络编程是什么 网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机.数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据. ...
- SQL Server-数据库架构和对象、定义数据完整性
前言 本节我们继续SQL之旅,本节我们如题来讲讲一些基本知识以及需要注意的地方,若有不妥之处,还望指出,简短的内容,深入的理解,Always to review the basics. 数据库架构和对 ...
- ML一些简单的资源
参考文献及推荐阅读 维基百科,http://en.wikipedia.org/wiki/K-nearest_neighbor_algorithm: 机器学习中的相似性度量,http://www.cnb ...
- PLSQL 11注册码
plsql 11 注册码:Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769 password:xs374ca