HDOJ 4893 Wow! Such Sequence!
题意是这样的,给定一个n个元素的数组,初始值为0,3种操作:
1 k d将第k个数增加d;
2 l r 询问区间l...r范围内数之和;
3 l r 表示将区间l...r内的数变成离他最近的斐波那契数,要求尽量小。
线段树操作题目,其中对于第三种操作用一个懒惰标记一下,表示l...r内的数是不是已经变成斐波那契数,如果是的话,求和就是其相应数的斐波那契数之和。
代码:
//Template updates date: 20140718
#include <bits/stdc++.h>
#define esp 1e-6
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define pb push_back
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define lowbit(x) (x&(-x))
#define mp(a, b) make_pair((a), (b))
#define bit(k) (1<<(k))
#define iin freopen("pow.in", "r", stdin);
#define oout freopen("pow.out", "w", stdout);
#define in freopen("solve_in.txt", "r", stdin);
#define out freopen("solve_out.txt", "w", stdout);
#define bug puts("********))))))");
#define Inout iin oout
#define inout in out #define SET(a, v) memset(a, (v), sizeof(a))
#define SORT(a) sort((a).begin(), (a).end())
#define REV(a) reverse((a).begin(), (a).end())
#define READ(a, n) {REP(i, n) cin>>(a)[i];}
#define REP(i, n) for(int i = 0; i < (n); i++)
#define VREP(i, n, base) for(int i = (n); i >= (base); i--)
#define Rep(i, base, n) for(int i = (base); i < (n); i++)
#define REPS(s, i) for(int i = 0; (s)[i]; i++)
#define pf(x) ((x)*(x))
#define mod(n) ((n))
#define Log(a, b) (log((double)b)/log((double)a))
#define Srand() srand((int)time(0))
#define random(number) (rand()%number)
#define random_range(a, b) (int)(((double)rand()/RAND_MAX)*(b-a) + a) using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<PII> VII;
typedef vector<PII, int> VIII;
typedef VI:: iterator IT;
typedef map<string, int> Mps;
typedef map<int, int> Mpi;
typedef map<int, PII> Mpii;
typedef map<PII, int> Mpiii;
const int maxm = + ; LL f[];
int n, m;
LL sum[maxm<<], sum1[maxm<<], cover[maxm<<]; void pre() {
f[] = f[] = ;
Rep(i, , ) {
f[i] = f[i-] + f[i-];
}
}
void PushDown(int rt) {
if(cover[rt]) {
cover[rt] = ;
cover[rt<<] = cover[rt<<|] = ;
sum[rt<<] = sum1[rt<<];
sum[rt<<|] = sum1[rt<<|];
}
}
void PushUp(int rt) {
sum[rt] = sum[rt<<]+sum[rt<<|];
sum1[rt] = sum1[rt<<]+sum1[rt<<|];
}
void build(int l, int r, int rt) {
if(l == r) {
sum[rt] = ;
sum1[rt] = ;
cover[rt] = ;
return ;
}
int m = (l+r)>>;
build(lson);
build(rson);
PushUp(rt);
cover[rt] = ;
} void update(int l, int r, int rt, int k, int d) {
if(l == k && r == k) {
sum[rt] += d;
int b = upper_bound(f+, f+, sum[rt]) - f;
if(abs(f[b]-sum[rt]) >= abs(f[b-]-sum[rt]))
sum1[rt] = f[b-];
else
sum1[rt] = f[b];
return;
}
PushDown(rt);
int m = (l+r)>>;
if(k <= m)
update(lson, k, d);
else update(rson, k, d);
PushUp(rt);
}
void update1(int L, int R, int l, int r, int rt) {
if(L <=l && R >= r) {
cover[rt] = ;
sum[rt] = sum1[rt];
return;
}
PushDown(rt);
int m = (l+r)>>;
if(L <= m)
update1(L, R, lson);
if(R > m)
update1(L, R, rson);
PushUp(rt);
}
LL query(int L, int R, int l, int r, int rt) {
if(L <= l && R >= r) {
return sum[rt];
}
int m = (l+r)>>;
PushDown(rt);
LL ans = ;
if(L <= m)
ans += query(L, R, lson);
if( R > m)
ans += query(L, R, rson);
return ans;
}
int main() { pre();
while(scanf("%d%d", &n, &m) == ) {
build(, n, );
REP(i, m) {
int u, l, r;
scanf("%d%d%d", &u, &l, &r);
if(u == ) {
printf("%I64d\n", query(l, r, , n, ));
} else if(u == ) {
update(, n, , l, r);
} else {
update1(l, r, , n, );
}
}
}
return ;
}
HDOJ 4893 Wow! Such Sequence!的更多相关文章
- HDU 4893 Wow! Such Sequence! (线段树)
		Wow! Such Sequence! 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4893 Description Recently, Doge ... 
- 线段树 + 区间更新: HDU 4893 Wow! Such Sequence!
		Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Oth ... 
- 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 4893 Wow! Such Sequence!
		http://acm.hdu.edu.cn/showproblem.php?pid=4893 三种操作: 1 k d - "add" 2 l r - "query sum ... 
- HDU 4893 Wow! Such Sequence!(2014 Multi-University Training Contest 3)
		题意: 有三种操作: 1 x y: 表示给x位置加上y 2 x y:查询[x,y]的区间和 3 x y:将 [x,y] 区间上的数变为最接近的 Fibonacci. 思路: 1 操作按正常单调更新,区 ... 
- HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)
		磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add 把d加到第k个数上去2 ... 
- HDU 4893 Wow! Such Sequence! (树状数组)
		题意:给有三种操作,一种是 1 k d,把第 k 个数加d,第二种是2 l r,查询区间 l, r的和,第三种是 3 l r,把区间 l,r 的所有数都变成离它最近的Fib数, 并且是最小的那个. 析 ... 
- Wow! Such Sequence!(线段树4893)
		Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ... 
- 思维题 HDOJ 5288 OO’s Sequence
		题目传送门 /* 定义两个数组,l[i]和r[i]表示第i个数左侧右侧接近它且值是a[i]因子的位置, 第i个数被选择后贡献的值是(r[i]-i)*(i-l[i]),每个数都枚举它的因子,更新l[i] ... 
随机推荐
- JAXB - Annotations, Annotation for Classes: XmlType
			This annotation adds information that would be available from a schema type, but isn't implied by a ... 
- Hadoop基于Protocol Buffer的RPC实现代码分析-Server端
			http://yanbohappy.sinaapp.com/?p=110 最新版本的Hadoop代码中已经默认了Protocol buffer(以下简称PB,http://code.google.co ... 
- ajax调用服务的基本格式
			<个人积累,转载请注明出处> 格式如下: $.ajax({ type: "post", //访问WebService使用Post方式请求 url: "http ... 
- 【Android】关于pix,dip,dip,sp等相关概念
			1.px (pixels)像素 – 是像素,就是屏幕上实际的像素点单位. dip或dp (device independent pixels)设备独立像素, 与设备屏幕有关. sp (scaled p ... 
- 常用经典SQL语句大全(提升)
			二.提升 1.说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用) 法一:select * into b from a where 1<>1(仅用于SQlServer) ... 
- Flexbox介绍
			CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式.对于很多应用来讲,弹性盒改进了盒模型,既不使用浮动 ... 
- Java实战之03Spring-05Spring中的事务控制(基于AOP)
			五.Spring中的事务控制(基于AOP) 1.Spring中事务有关的接口 1.1.明确: JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案 1. ... 
- 修改虚机IP
			同网段的话,直接修改,不同网段的话,使用以下方法: 步骤一:nova list --all-tenant 找到相应虚拟机+--------------------------------------+ ... 
- Visualsvn Server的搭建
			最近做项目在用svn,对svn有个初步了解,今天利用一点时间在本地配置了一个svn的服务端.整个过程分为以下几步: ①下载Visualsvn Server并且进行安装. ②安装好以后,在Visuals ... 
- PLINQ 简介
			PLINQ和LINQ的语法基本是差不多的,PLINQ该如何实现并行 var query = from item in source.AsParallel() select item; 一个简单的AsP ... 
