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] ...
随机推荐
- GetWindowRect() GetClientRect() ScreenToClient() MoveWindow()
CWnd.GetWindowRect 参照坐标系:屏幕坐标系,原点为屏幕左上角(0,0)的位置 功能:取得调用窗口CWnd在屏幕坐标系下的RECT坐标 CWnd.GetClientRect 参照坐标系 ...
- ionic+cordova+angularJs监听刷新
普通的js返回并刷新这里就不多说了,百度就有很多方法. 下面说的是使用了angularjs.ionic开发的一个手机app中我使用的返回上一页并刷新的方法. 场景:回复的页面是单独的,点击保存回复后会 ...
- 40个Java集合面试问题和答案【中】【转载】
接上文:http://www.cnblogs.com/xujianbo/p/5148075.html 16.UnsupportedOperationException是什么? Unsupporte ...
- vs2012找不到system web optimization命名空间
今天新装了vs2012,安装完成后,创建了一个mvc4应用程序,创建生成出现了几个错误.通过错误我们的解决方案就是去找引用不到的路径,如何在vs2012中实现呢? 在工具栏中找工具--库程序包管理器- ...
- Sql 解释
SQL(Structured Query Language) 结构化查询语言,虽然是查询语言,也是一种编程语言,但是执行查询操作. 根据数据的操作对象,可以将SQL语句分为几类. DDL(Data D ...
- Java标准输入输出流的重定向及恢复
在Java中输入输出数据一般(图形化界面例外)要用到标准输入输出流System.in和System.out,System.in,System.out默认指向控制台,但有时程序从文件中输入数据并将结果输 ...
- Linux网络应用编程之VLAN(Packet Tracer仿真)
VLAN 一.VLAN概述 VLAN(虚拟局域网):将多个设备和用户在逻辑上联网在一起,这些设备和用户不受物理位置的限制(物理设备可以在不同的地方),但是他们的通信就好像在同一网段中一样,这就叫VLA ...
- js之replace实现简单模板替换引擎
eg: var app={}; app.tempEngine= (function () { var pattern = /\{(\w*[:]*[=]*\w+)\}(?!})/g; return ...
- CSS选择器,标签限定
例子:ul#nav, ul li#nav和 #nav ul, #nav ul li 注意空格,没有空间隔开的就可以理解为限定 区别 1.ul#nav:表示id='nav'的ul:(ul限定#nav标签 ...
- C#获取运行程序的进程ID
C#获取运行程序的进程ID [DllImport("User32.dll", CharSet = CharSet.Auto)] public static extern int G ...