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 操作按正常单调更新,区间求和的操作。
2 操作按正常区间求和。
3 如果是之前该区间未被 第三类操作操作过,则更新到底,如果之前已经被第三类操作操作过则直接返回。 这里要打一个标记,要注意 在第1类操作单点加时要把标记往下更新。
- #include<cstring>
- #include<algorithm>
- #include<cstdio>
- #include<cmath>
- #include <iostream>
- #define LL long long
- #define debug(x) printf(#x"= %d\n",x);
- #define N 100050
- #define L(x) (x<<1)
- #define R(x) (x<<1|1)
- using namespace std;
- int flag[N*];
- LL sum[N*];
- LL f[];
- int fcnt;
- void build(int l,int r,int i)
- {
- flag[i]=sum[i]=;
- if(l!=r)
- {
- int mid=(l+r)>>;
- build(l,mid,L(i));
- build(mid+,r,R(i));
- }
- }
- void pushdown(int i)
- {
- if(flag[i])
- {
- flag[L(i)]=flag[R(i)]=;
- flag[i]=;
- }
- }
- void pushup(int i)
- {
- sum[i]=sum[L(i)]+sum[R(i)];
- }
- void add(int l,int r,int p,int va,int i)
- {
- if(l==r)
- {
- sum[i]+=va;
- flag[i]=;
- return;
- }
- pushdown(i);
- int mid=(l+r)>>;
- if(p<=mid)add(l,mid,p,va,L(i));
- else add(mid+,r,p,va,R(i));
- pushup(i);
- }
- void update(int l,int r,int pl,int pr,int i)
- {
- if(l==r)
- {
- if(sum[i]<=){
- sum[i]=;
- }
- else
- {
- int l=,r=fcnt;
- while(r-l>)
- {
- int mid=(l+r>>);
- if(f[mid]>=sum[i])r=mid;
- else l=mid;
- }
- if(sum[i]-f[l]<=f[r]-sum[i])
- sum[i]=f[l];
- else
- sum[i]=f[r];
- }
- //printf("::%d %I64d\n",l,sum[i]);
- return;
- }
- if(flag[i])
- return;
- if(l>=pl&&r<=pr)
- flag[i]=;
- int mid=(l+r)>>;
- if(pl<=mid)
- update(l,mid,pl,pr,L(i));
- if(pr>mid)
- update(mid+,r,pl,pr,R(i));
- pushup(i);
- }
- LL query(int l,int r,int pl,int pr,int i)
- {
- if(l>=pl&&r<=pr)
- {
- return sum[i];
- }
- int mid=(l+r)>>;
- LL tmp=;
- if(pl<=mid)tmp+=query(l,mid,pl,pr,L(i));
- if(pr>mid)tmp+=query(mid+,r,pl,pr,R(i));
- return tmp;
- }
- int main() {
- f[]=f[]=;
- for(int i=;;++i)
- {
- f[i]=f[i-]+f[i-];
- if(f[i]>1e17)
- {
- fcnt=i;
- break;
- }
- }
- int n,m;
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- int x,y,z;
- build(,n,);
- while(m--)
- {
- scanf("%d%d%d",&x,&y,&z);
- if(x==)
- {
- add(,n,y,z,);
- }
- else if(x==)
- {
- printf("%I64d\n",query(,n,y,z,));
- }
- else
- {
- update(,n,y,z,);
- }
- }
- }
- return ;
- }
HDU 4893 Wow! Such Sequence!(2014 Multi-University Training Contest 3)的更多相关文章
- 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!(线段树)
题目链接: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!(2014年多校联合 第三场 G)(线段树)
磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add 把d加到第k个数上去2 ...
- 线段树 + 区间更新: 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!
http://acm.hdu.edu.cn/showproblem.php?pid=4893 三种操作: 1 k d - "add" 2 l r - "query sum ...
- HDU 4893 Wow! Such Sequence! (树状数组)
题意:给有三种操作,一种是 1 k d,把第 k 个数加d,第二种是2 l r,查询区间 l, r的和,第三种是 3 l r,把区间 l,r 的所有数都变成离它最近的Fib数, 并且是最小的那个. 析 ...
- hdu 5003 模拟水题 (2014鞍山网赛G题)
你的一系列得分 先降序排列 再按0.95^(i-1)*ai 这个公式计算你的每一个得分 最后求和 Sample Input12530 478Sample Output984.1000000000 # ...
- HDU 4675 GCD of Sequence(莫比乌斯反演 + 打表注意事项)题解
题意: 给出\(M\)和\(a数组\),询问每一个\(d\in[1,M]\),有多少组数组满足:正好修改\(k\)个\(a\)数组里的数使得和原来不同,并且要\(\leq M\),并且\(gcd(a_ ...
- HDU 5783 Divide the Sequence(数列划分)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...
随机推荐
- Java中的JDBC数据库连接
JDBC编程步骤 1.加载数据库驱动. // 加载驱动 Class.forName(driverClass) // 加载mysql驱动 Class.forName("com.mysql.jd ...
- Object Pascal 运算符
Object Pascal 的运算符 运算符是程序代码中对各种类型的数据进行计算的符号,通常分为算数运算符.逻辑运算符.比较运算符和按位运算符. 1.算术运算符Object Pascal ...
- XML HTML
XML和HTML常用转义字符 XML和HTML中都有一些特殊的字符,这些字符在XML和HTML中是不能直接使用的,如果必须使用这些字符,应该使用其对应的转义字符. XML常用转义字符: 字符 转义字符 ...
- Java troubleshooting guide
http://www.oracle.com/technetwork/java/javase/toc-135973.html --不同的 OutOfMemoryError/内存溢出,以及相关的解决
- 转 java int与Integer的区别
int是java提供的8种原始数据类型之一, Java为每个原始类型提供了封装类,Integer是java为int提供的封装类. int 是基本类型,Integer是引用类型. java.lang.I ...
- js树目录结构
jstree https://www.jstree.com/demo/ treejs http://www.treejs.cn/v3/demo.php#_206
- java 集合(List)
List: 特有的方法: 添加: add(int index, E element) addAll(int index, Collection<? extends E> c) 获取: ge ...
- DEDE首页会员部分,后台登陆,会员登录相关页面
首页会员涉及部分 \templets\default\style\page.css \member\ajax_loginsta.php 会员登录页面涉及部分 \member\templets\inde ...
- NOIP 2014 普及组 T4 子矩阵
[题意] 已知:n,m,r,c,a[i][j] (1 ≤ n ≤ 16, 1 ≤ m ≤ 16,1 ≤ a[i][j] ≤1000,1 ≤ r ≤ n, 1 ≤ c ≤ m) 条件:矩阵的分值定义为每 ...
- Spring表达式语言 之 5.1 概述 5.2 SpEL基础(拾叁)
5.1 概述 5.1.1 概述 Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts ...