2019hdu多校3 hdu4893(线段树单点 区间更新
补这题主要是因为第三个操作要维护区间,而不是点,否则会T。
https://vjudge.net/problem/HDU-4893
题意:输入n、q。表示有n个数,初始化默认这n个数都为零,有q次操作,操作种类分为三种:1、输入k,d,使得k位置的数加上d。2、输入l,r,求区间[l,r]的和并输出。3、输入l,r,把区间[l,r]内的数都改成斐波拉契数,修改方式为使得fabs[x-F[i]]最小,如果有多个F[i]满足情况,用最小的那个F[i]。1 ≤ n ≤ 100000, 1 ≤ m ≤ 100000, |d| < 231
做法:对于前两种操作,可以用单点更新来维护,但是对于第三种操作如果用单点更新的话,会TLE(n^2),所以我们要区间更新,我们要很快的知道区间[l,r]区间的FIB和,索性我们就在线段树里维护所有数的FIB和,在build,和操作一的时候更新就可以了。时间复杂度n*log(n)。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 100050;
int n, m;
struct node
{
int l, r;
LL sm1, sm2;
bool t;
} T[maxn << 2];
LL F[150];
void init()
{
F[0] = F[1] = 1;
for(int i = 2; i <= 90; i++)
F[i] = F[i - 1] + F[i - 2];
}
LL FBI(LL x)
{
int pos = (int)(lower_bound(F, F + 80, x) - F);
if(!pos) return F[0];
else
{
LL t1 = F[pos] - x;
LL t2 = x - F[pos - 1];
if(t1 < t2)
return F[pos];
else
return F[pos - 1];
}
}
void pushup(int id)
{
T[id].sm1 = T[id << 1].sm1 + T[id << 1 | 1].sm1;
T[id].sm2 = T[id << 1].sm2 + T[id << 1 | 1].sm2;
}
void pushdown(int id)
{
if(T[id].t)
{
T[id << 1].sm1 = T[id << 1].sm2;
T[id << 1].t = 1;
T[id << 1 | 1].sm1 = T[id << 1 | 1].sm2;
T[id << 1 | 1].t = 1;
T[id].t = 0;
}
}
void build(int id, int l, int r)
{
T[id].l = l;
T[id].r = r;
T[id].t = 0;
if(l == r)
{
T[id].sm1 = 0;
T[id].sm2 = 1;
return ;
}
else
{
int mid = (l + r) >> 1;
build(id << 1, l, mid);
build(id << 1 | 1, mid + 1, r);
pushup(id);
}
}
LL sum(int id, int l, int r)
{
if(T[id].l == l && T[id].r == r)
return T[id].sm1;
else
{
pushdown(id);
int mid = (T[id].l + T[id].r) >> 1;
if(r <= mid)
return sum(id << 1, l, r);
else if(l >= mid + 1)
return sum(id << 1 | 1, l, r);
else
return sum(id << 1, l, mid) + sum(id << 1 | 1, mid + 1, r);
}
}
void change(int id, int l, int r)
{
if(T[id].l == l && T[id].r == r)
{
T[id].sm1 = T[id].sm2;
T[id].t = 1;
return ;
}
else
{
pushdown(id);
int mid = (T[id].l + T[id].r) >> 1;
if(r <= mid)
{
change(id << 1, l, r);
}
else if(l >= mid + 1)
{
change(id << 1 | 1, l, r);
}
else
{
change(id << 1, l, mid);
change(id << 1 | 1, mid + 1, r);
}
pushup(id);
}
}
void update(int id, int pos, LL d)
{
if(T[id].l == T[id].r)
{
T[id].sm1 += d;
T[id].sm2 = FBI(T[id].sm1);
return ;
}
else
{
pushdown(id);
int mid = (T[id].l + T[id].r) >> 1;
if(pos <= mid)
update(id << 1, pos, d);
else
update(id << 1 | 1, pos, d);
pushup(id);
}
}
int main()
{
init();
while(scanf("%d%d", &n, &m) != EOF)
{
build(1, 1, n);//
LL d;
int k, l, r, ty;
for(int i = 1; i <= m; i++)
{
scanf("%d", &ty);
if(ty == 1)
{
scanf("%d%lld", &k, &d);
update(1, k, d);
}
else if(ty == 2)
{
scanf("%d%d", &l, &r);
printf("%lld\n", sum(1, l, r));
}
else
{
scanf("%d%d", &l, &r);
change(1, l, r);
}
}
}
return 0;
}
2019hdu多校3 hdu4893(线段树单点 区间更新的更多相关文章
- 蓝桥杯Log大侠(线段树单点区间更新)
标题:Log大侠 atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠. 一天,Log大侠的好友 drd 有一些整数序列需要变换,Log大侠正好施展法力... 变换的规则是: ...
- hdu 1556:Color the ball(线段树,区间更新,经典题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 1698:Just a Hook(线段树,区间更新)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- UVA 12436-Rip Van Winkle's Code(线段树的区间更新)
题意: long long data[250001]; void A( int st, int nd ) { for( int i = st; i \le nd; i++ ) data[i] = da ...
- hdu1698线段树的区间更新区间查询
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- HDU 1556 Color the ball(线段树:区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和 ...
- zoj3686(线段树的区间更新)
对线段树的区间更新有了初步的了解... A Simple Tree Problem Time Limit: 3 Seconds Memory Limit: 65536 KB Given a ...
- Color the ball (线段树的区间更新问题)
N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气球a开始到气球b依次给每个气球涂一次颜色.但 ...
- ZOJ 2301 Color the Ball 线段树(区间更新+离散化)
Color the Ball Time Limit: 2 Seconds Memory Limit: 65536 KB There are infinite balls in a line ...
随机推荐
- vue 实现,子组件向父组件 传递数据
首先理清组件之间的关系 组件与组件之间,还存在着不同的关系.父子关系与兄弟关系(不是父子的都暂称为兄弟吧). 父子组件 父子关系即是组件 A 在它的模板中使用了组件 B,那么组件 A 就是父组件,组件 ...
- 嵌入式Linux之telnet
telnetd 1.busybox搭建根文件系统时telnet配置Networking Utilities——>[*]telnetd[*]Support standalone telnetd ...
- 在Linux环境中运行python 项目
1首先创建一个虚拟环境或者在一个已有的虚拟环境中创建一个django项目 1.1 创建一个虚拟环境: mkvirtualenv my_django115 这会在 ~/Envs 中创建 my_djang ...
- 16/7/8_PHP-设置cookie会话控制(session与cookie)
设置cookie PHP设置Cookie最常用的方法就是使用setcookie函数,setcookie具有7个可选参数,我们常用到的为前5个: name( Cookie名)可以通过$_COOKIE[' ...
- C#模块初始化注入
这个功能可以实现很多很有用的功能,比如程序集加密,Hook安装等.英文转载备忘. 原地址:https://www.coengoedegebure.com/module-initializers-i ...
- 【python+selenium自动化】图像识别技术在UI自动化测试中的实际运用
引言: 目前在图像识别方面的自动化测试框架有很多,其中比较有名的是airtest,主要做手机端的游戏自动化测试(http://airtest.netease.com/) 因为没有实际把airtest运 ...
- 【MM系列】SAP MM中物料帐下修改物料的价格
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP 物料帐下修改物料的价格 ...
- 【ABAP系列】SAP ABAP中使用for all entries in小结
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP中使用for a ...
- C++笔记(2)——一些语法基础知识以及基本算法知识
今天和PAT无直接相关的关系,主要是关于一些语法/算法的笔记,因为我发现自己的基础还没有打扎实,有些时候看别人的代码还会觉得一头雾水,不明白代码的含义. 一些C/C++语法 先从语法开始吧.这部分很琐 ...
- js中ajax请求返回的数据处理成数组后,局部变量赋值给全局变量后,为空
第二步是想把ss的值扔给res_r,两个数组直接相等即可,可谁想到,取出来的值是空. 如图取出来的值是空. 我一脸懵逼,调试了些许时间,最后把ss遍历一下,在重新push进res_r 再来看效果,已经 ...