HDOJ--4893--Wow! Such Sequence!【线段树+单点、区间更新】
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4893
题意:给你一个长度n的数列,初始都为0。有三种操作,第一种给第k个位置的数加d。另外一种是查询区间 [l , r] 的总和。第三种是使区间 [l , r] 的值改为离它近期的那个斐波那契数的值。
我刚開始用sum数组存储节点的值。第三种操作是个区间更新,可是区间更新的值不一样。我就想当然的搜到最底部的节点来处理更新,果断T了。后来想了想。事实上能够在节点上再加一个信息。就是这个值下次进行第三种操作要变成的值,在每次进行第一种操作时进行这个值得更新,区间也一样存储下次变化后的总值。这样在进行第三种操作时就能够进行区间更新了比較省时。我不习惯用结构体写,所以多定义了一个数组。
sum数组存储正常值。fuck数组存储下次要变成的斐波那契值。col数组仅仅起标记作用。
事实上这题就是简单的单点更新和区间更新,合到了一起,我还是做的太少。没有在单点更新和区间查询中加pushdown,WA了两发。
#include<cstring>
#include<string>
#include<fstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<ctime>
#include<cstdlib>
#include<functional>
#include<cmath>
using namespace std;
#define PI acos(-1.0)
#define MAXN 100100
#define eps 1e-11
#define INF 0x7FFFFFFF
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 long long sum[MAXN<<2];
long long col[MAXN<<2];
long long fuck[MAXN<<2];
long long n,m;
long long f[100];
void pushup(long long rt){
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
fuck[rt] = fuck[rt<<1] + fuck[rt<<1|1];
}
void pushdown(long long rt,long long m){
if(col[rt]){
col[rt<<1] = fuck[rt<<1];
col[rt<<1|1] = fuck[rt<<1|1];
sum[rt<<1] = fuck[rt<<1];
sum[rt<<1|1] = fuck[rt<<1|1];
col[rt] = 0;
}
}
void build(long long l,long long r,long long rt){
col[rt] = 0;
if(l==r){
sum[rt] = 0;
fuck[rt] = 1;
return ;
}
long long m = (l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}
void update(long long pos,long long add,long long l,long long r,long long rt){
if(l==r){
sum[rt] += add;
long long p = lower_bound(f,f+90,sum[rt])-f;
if(p-1>=0){
long long fp1 = f[p] - sum[rt];
if(fp1<0) fp1 = -fp1;
long long fp2 = f[p-1] - sum[rt];
if(fp2<0) fp2 = -fp2;
if(fp1>=fp2) fuck[rt] = f[p-1];
else fuck[rt] = f[p];
}
else fuck[rt] = f[p];
return ;
}
pushdown(rt,r-l+1);
long long m = (l+r)>>1;
if(pos<=m) update(pos,add,lson);
else update(pos,add,rson);
pushup(rt);
}
void update2(long long L,long long R,long long l,long long r,long long rt){
if(L<=l&&r<=R){
col[rt] = fuck[rt];
sum[rt] = fuck[rt];
return ;
}
pushdown(rt,r-l+1);
long long m = (l+r)>>1;
if(L<=m) update2(L,R,lson);
if(R>m) update2(L,R,rson);
pushup(rt);
}
long long query(long long L,long long R,long long l,long long r,long long rt){
if(L<=l&&r<=R){
return sum[rt];
}
pushdown(rt,rt-l+1);
long long ans = 0;
long long m = (l+r)>>1;
if(L<=m) ans += query(L,R,lson);
if(R>m) ans += query(L,R,rson);
return ans;
}
int main(){
long long i,j,l,r,k,d,x;
f[0] = 1;
f[1] = 1;
for(i=2;i<90;i++){
f[i] = f[i-1] + f[i-2];
}
while(scanf("%I64d%I64d",&n,&m)!=EOF){
build(1,n,1);
while(m--){
scanf("%I64d%I64d%I64d",&x,&l,&r);
if(x==1){
update(l,r,1,n,1);
}
else if(x==2){
long long ans = query(l,r,1,n,1);
printf("%I64d\n",ans);
}
else{
update2(l,r,1,n,1);
}
}
}
return 0;
}
HDOJ--4893--Wow! Such Sequence!【线段树+单点、区间更新】的更多相关文章
- 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区间上的所以数变成 ...
- 2019hdu多校3 hdu4893(线段树单点 区间更新
补这题主要是因为第三个操作要维护区间,而不是点,否则会T. https://vjudge.net/problem/HDU-4893 题意:输入n.q.表示有n个数,初始化默认这n个数都为零,有q次操作 ...
- 蓝桥杯Log大侠(线段树单点区间更新)
标题:Log大侠 atm参加了速算训练班,经过刻苦修炼,对以2为底的对数算得飞快,人称Log大侠. 一天,Log大侠的好友 drd 有一些整数序列需要变换,Log大侠正好施展法力... 变换的规则是: ...
- ZOJ 2301 Color the Ball 线段树(区间更新+离散化)
Color the Ball Time Limit: 2 Seconds Memory Limit: 65536 KB There are infinite balls in a line ...
- 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 ...
随机推荐
- WebService-axis2
WebService框架有好多,常用的cxf,axis2等,axis2的配置过程相对简单,不用编写接口,在实现.只需要一个Service服务类即可.配置过程大致如下: 1,导入jar包(这里我是把ax ...
- HTML表单设计(上)
1,表单标记<form>...</form> <form>...</form>定义表单的开始位置和结束位置,表单提交时的内容就是<form> ...
- Tomcat部署项目乱码问题总结
打包好的war包放在tomcat下,有时会出现中文乱码的情况.首先应当确定项目的编码格式,tomcat的编码格式,以及cmd命令行的编码格式. 项目编码 将要输出到控制台或日志的字符串转为UTF-8 ...
- unlink()
unlink() 函数删除文件. 若成功,则返回 true,失败则返回 false. 语法 unlink(filename,context) 参数 描述 filename 必需.规定要删除的文件. c ...
- Vim配置及使用笔记
Vim配置及使用笔记 安装 apt-get install vim -y 配置说明 vim /etc/vim/vimrc 在配置文件后加入这些配置项 set nu set tabstop=4 set ...
- Java注解Annotation详解
从JDK5开始,Java增加了Annotation(注解),Annotation是代码里的特殊标记,这些标记可以在编译.类加载.运行时被读取,并执行相应的处理.通过使用Annotation,开发人员可 ...
- SQL Server 结构分解
关系引擎和存储引擎是SQL Server 的两大组件,其中关系引擎也叫查询处理器,它包括查询优化器.命令解析器.查询执行器.存储引擎管理所有的数据及涉及的IO,它包括事务管理器和数据访问方法和缓冲区管 ...
- Gluon炼丹(Kaggle 120种狗分类,迁移学习加双模型融合)
这是在kaggle上的一个练习比赛,使用的是ImageNet数据集的子集. 注意,mxnet版本要高于0.12.1b2017112. 下载数据集. train.zip test.zip labels ...
- CCF认证之——相反数
这道题目非常简单! #include<iostream> using namespace std; int main() { ],n,count=; cin >> n; ; i ...
- TFS2017持续发布中调用PowerShell启停远程应用程序
目前团队项目中有多个Web.服务以及与大数据平台对接接口等应用,每次的发布和部署采用手工的方式进行.停止应用程序,拷贝发布包,启动应用程序,不停的循环着,并且时不时地会出现一些人为错误性问题.这种模式 ...