题意:

有三种操作:

1 x y: 表示给x位置加上y

2 x y:查询【x,y】的区间和

3 x y:将 【x,y】 区间上的数变为最接近的 Fibonacci。

思路: 1 操作按正常单调更新,区间求和的操作。

2 操作按正常区间求和。

    3  如果是之前该区间未被 第三类操作操作过,则更新到底,如果之前已经被第三类操作操作过则直接返回。 这里要打一个标记,要注意 在第1类操作单点加时要把标记往下更新。

  1. #include<cstring>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include <iostream>
  6. #define LL long long
  7. #define debug(x) printf(#x"= %d\n",x);
  8. #define N 100050
  9. #define L(x) (x<<1)
  10. #define R(x) (x<<1|1)
  11. using namespace std;
  12. int flag[N*];
  13. LL sum[N*];
  14. LL f[];
  15. int fcnt;
  16. void build(int l,int r,int i)
  17. {
  18. flag[i]=sum[i]=;
  19. if(l!=r)
  20. {
  21. int mid=(l+r)>>;
  22. build(l,mid,L(i));
  23. build(mid+,r,R(i));
  24. }
  25. }
  26. void pushdown(int i)
  27. {
  28. if(flag[i])
  29. {
  30. flag[L(i)]=flag[R(i)]=;
  31. flag[i]=;
  32. }
  33. }
  34. void pushup(int i)
  35. {
  36. sum[i]=sum[L(i)]+sum[R(i)];
  37. }
  38. void add(int l,int r,int p,int va,int i)
  39. {
  40. if(l==r)
  41. {
  42. sum[i]+=va;
  43. flag[i]=;
  44. return;
  45. }
  46. pushdown(i);
  47. int mid=(l+r)>>;
  48. if(p<=mid)add(l,mid,p,va,L(i));
  49. else add(mid+,r,p,va,R(i));
  50. pushup(i);
  51. }
  52. void update(int l,int r,int pl,int pr,int i)
  53. {
  54. if(l==r)
  55. {
  56. if(sum[i]<=){
  57. sum[i]=;
  58. }
  59. else
  60. {
  61. int l=,r=fcnt;
  62. while(r-l>)
  63. {
  64. int mid=(l+r>>);
  65. if(f[mid]>=sum[i])r=mid;
  66. else l=mid;
  67. }
  68. if(sum[i]-f[l]<=f[r]-sum[i])
  69. sum[i]=f[l];
  70. else
  71. sum[i]=f[r];
  72. }
  73. //printf("::%d %I64d\n",l,sum[i]);
  74. return;
  75. }
  76. if(flag[i])
  77. return;
  78. if(l>=pl&&r<=pr)
  79. flag[i]=;
  80. int mid=(l+r)>>;
  81. if(pl<=mid)
  82. update(l,mid,pl,pr,L(i));
  83. if(pr>mid)
  84. update(mid+,r,pl,pr,R(i));
  85. pushup(i);
  86. }
  87. LL query(int l,int r,int pl,int pr,int i)
  88. {
  89. if(l>=pl&&r<=pr)
  90. {
  91. return sum[i];
  92. }
  93. int mid=(l+r)>>;
  94. LL tmp=;
  95. if(pl<=mid)tmp+=query(l,mid,pl,pr,L(i));
  96. if(pr>mid)tmp+=query(mid+,r,pl,pr,R(i));
  97. return tmp;
  98. }
  99. int main() {
  100. f[]=f[]=;
  101. for(int i=;;++i)
  102. {
  103. f[i]=f[i-]+f[i-];
  104. if(f[i]>1e17)
  105. {
  106. fcnt=i;
  107. break;
  108. }
  109. }
  110. int n,m;
  111. while(scanf("%d%d",&n,&m)!=EOF)
  112. {
  113. int x,y,z;
  114. build(,n,);
  115. while(m--)
  116. {
  117. scanf("%d%d%d",&x,&y,&z);
  118. if(x==)
  119. {
  120. add(,n,y,z,);
  121. }
  122. else if(x==)
  123. {
  124. printf("%I64d\n",query(,n,y,z,));
  125. }
  126. else
  127. {
  128. update(,n,y,z,);
  129. }
  130. }
  131. }
  132. return ;
  133. }

HDU 4893 Wow! Such Sequence!(2014 Multi-University Training Contest 3)的更多相关文章

  1. HDU 4893 Wow! Such Sequence! (线段树)

    Wow! Such Sequence! 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4893 Description Recently, Doge ...

  2. 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区间上的所以数变成 ...

  3. HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)

    磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add  把d加到第k个数上去2 ...

  4. 线段树 + 区间更新: HDU 4893 Wow! Such Sequence!

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

  5. hdu 4893 Wow! Such Sequence!

    http://acm.hdu.edu.cn/showproblem.php?pid=4893 三种操作: 1 k d - "add" 2 l r - "query sum ...

  6. HDU 4893 Wow! Such Sequence! (树状数组)

    题意:给有三种操作,一种是 1 k d,把第 k 个数加d,第二种是2 l r,查询区间 l, r的和,第三种是 3 l r,把区间 l,r 的所有数都变成离它最近的Fib数, 并且是最小的那个. 析 ...

  7. hdu 5003 模拟水题 (2014鞍山网赛G题)

    你的一系列得分 先降序排列 再按0.95^(i-1)*ai 这个公式计算你的每一个得分 最后求和 Sample Input12530 478Sample Output984.1000000000 # ...

  8. HDU 4675 GCD of Sequence(莫比乌斯反演 + 打表注意事项)题解

    题意: 给出\(M\)和\(a数组\),询问每一个\(d\in[1,M]\),有多少组数组满足:正好修改\(k\)个\(a\)数组里的数使得和原来不同,并且要\(\leq M\),并且\(gcd(a_ ...

  9. HDU 5783 Divide the Sequence(数列划分)

    p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: Calibri; font-s ...

随机推荐

  1. Java中的JDBC数据库连接

    JDBC编程步骤 1.加载数据库驱动. // 加载驱动 Class.forName(driverClass) // 加载mysql驱动 Class.forName("com.mysql.jd ...

  2. Object Pascal 运算符

          Object Pascal 的运算符 运算符是程序代码中对各种类型的数据进行计算的符号,通常分为算数运算符.逻辑运算符.比较运算符和按位运算符. 1.算术运算符Object Pascal ...

  3. XML HTML

    XML和HTML常用转义字符 XML和HTML中都有一些特殊的字符,这些字符在XML和HTML中是不能直接使用的,如果必须使用这些字符,应该使用其对应的转义字符. XML常用转义字符: 字符 转义字符 ...

  4. Java troubleshooting guide

    http://www.oracle.com/technetwork/java/javase/toc-135973.html --不同的 OutOfMemoryError/内存溢出,以及相关的解决

  5. 转 java int与Integer的区别

    int是java提供的8种原始数据类型之一, Java为每个原始类型提供了封装类,Integer是java为int提供的封装类. int 是基本类型,Integer是引用类型. java.lang.I ...

  6. js树目录结构

    jstree https://www.jstree.com/demo/ treejs http://www.treejs.cn/v3/demo.php#_206

  7. java 集合(List)

    List: 特有的方法: 添加: add(int index, E element) addAll(int index, Collection<? extends E> c) 获取: ge ...

  8. DEDE首页会员部分,后台登陆,会员登录相关页面

    首页会员涉及部分 \templets\default\style\page.css \member\ajax_loginsta.php 会员登录页面涉及部分 \member\templets\inde ...

  9. 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) 条件:矩阵的分值定义为每 ...

  10. Spring表达式语言 之 5.1 概述 5.2 SpEL基础(拾叁)

    5.1  概述 5.1.1  概述 Spring表达式语言全称为"Spring Expression Language",缩写为"SpEL",类似于Struts ...