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 ...
随机推荐
- Centos7下部署ceph 12.2.1 (luminous)集群及RBD使用
前言 本文搭建了一个由三节点(master.slave1.slave2)构成的ceph分布式集群,并通过示例使用ceph块存储. 本文集群三个节点基于三台虚拟机进行搭建,节点安装的操作系统为Cento ...
- WebService--axis
axis WebService虽然现在已经很少使用,但是还是把它的配置过程写出来,开发环境jdk 1.6 服务端: 1,导入需要jar包,自行下载 2,创建WebService接口 public in ...
- Hibernate开发文档
hibernate配置 映射约束文件 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3. ...
- ab使用命令
ab使用-A auth-username:password 向服务器提供基本认证信息.用户名和密码之间":"分割,以base64编码形式发送.无论服务器是否需要(即是否发送了 ...
- J-Link驱动下载和Hex程序下载
J-LINK驱动下载 1.首先拥有硬件J-Link硬件. 2.安装J-Link驱动程序SEGGER 下载地址如下 https://www.segger.com/downloads/jlink/JLin ...
- [转载] MapReduce工作原理讲解
转载自http://www.aboutyun.com/thread-6723-1-1.html 有时候我们在用,但是却不知道为什么.就像苹果砸到我们头上,这或许已经是很自然的事情了,但是牛顿却发现了地 ...
- 获取IP-linux(经典-实用)
Linux系统获取网卡ip 1.正宗的有6种取ip的方法 sed(3) +awk(2)+egrep(1) sed(替换): ( )\1 [^0-9.] 掐头|去尾 awk(分隔符): ...
- Linux nc 命令传输文件
NAME nc - arbitrary TCP and UDP connections and listensSYNOPSIS nc [-46DdhklnrStUuvz] [-i interv ...
- 实现基于tomcat集群会话保持
1.实验环境 我们需要准备两台虚拟机,把这两台虚拟机组成集群,实现会话保持. 2.配置server1 2.1 修改nginx配置文件 [root@server1 ~]# vim /etc/nginx/ ...
- 如何用Python写一个计算器软件 附带效果图
该计算器使用Python tkinter模块开发 效果如下图 import tkinter #导入tkinter模块 root = tkinter.Tk() root.minsize(280,500 ...