【题目链接】:http://codeforces.com/contest/719/problem/E

【题意】



给你一个数列,有两种操作1 l r x 给[l,r]区间上的数加上x, 2 l r 询问[l,r]区间fibonacci数列的和(f[l]+f[l+1]+……f[r])

【题解】



斐波那契数列有个矩阵乘法公式

f[n]=

  1. [0 1] ^n× [0 0]
  2. [1 1] [0 1]

最后得到的矩阵A

A[1][2]就是答案;(即第一行第二列)



写个线段树的成段更新;

用懒惰标记记录加上的数字x对应的A^x

维护区间的矩阵和就好;

新增加的A^x不要每次都重新算,不然会T





【Number Of WA】



9



【完整代码】

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define lson l,m,rt<<1
  4. #define rson m+1,r,rt<<1|1
  5. #define LL long long
  6. #define rep1(i,a,b) for (int i = a;i <= b;i++)
  7. #define rep2(i,a,b) for (int i = a;i >= b;i--)
  8. #define mp make_pair
  9. #define pb push_back
  10. #define fi first
  11. #define se second
  12. #define ms(x,y) memset(x,y,sizeof x)
  13. typedef pair<int,int> pii;
  14. typedef pair<LL,LL> pll;
  15. const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
  16. const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
  17. const double pi = acos(-1.0);
  18. const int N = 1e5+100;
  19. const int G = 2; //�����С
  20. const int MOD = 1e9 + 7; //ģ��
  21. struct MX
  22. {
  23. LL v[G+1][G+1];
  24. void O() { ms(v, 0); }
  25. void E() { ms(v, 0); for (int i = 1; i <= G; ++i)v[i][i] = 1; }
  26. MX operator * (const MX &b) const
  27. {
  28. MX c; c.O();
  29. for (int k = 1; k <= G; ++k)
  30. {
  31. for (int i = 1; i <= G; ++i) if (v[i][k])
  32. {
  33. for (int j = 1; j <= G; ++j)
  34. {
  35. c.v[i][j] = (c.v[i][j] + (LL)v[i][k] * b.v[k][j]) % MOD;
  36. }
  37. }
  38. }
  39. return c;
  40. }
  41. MX operator + (const MX &b) const
  42. {
  43. MX c; c.O();
  44. for (int i = 1; i <= G; ++i)
  45. {
  46. for (int j = 1; j <= G; ++j)
  47. {
  48. c.v[i][j] = (v[i][j] + b.v[i][j]) % MOD;
  49. }
  50. }
  51. return c;
  52. }
  53. MX operator ^ (LL p) const
  54. {
  55. MX y; y.E();
  56. MX x; memcpy(x.v, v, sizeof(v));
  57. while (p)
  58. {
  59. if (p&1) y = y*x;
  60. x = x*x;
  61. p>>=1;
  62. }
  63. return y;
  64. }
  65. }A,v,cur;
  66. int n,m,flag[N<<2];
  67. MX sum[N<<2],lazy_tag[N<<2];
  68. LL a[N];
  69. inline void push_up(int rt)
  70. {
  71. sum[rt] = sum[rt<<1] + sum[rt<<1|1];
  72. }
  73. void build(int l,int r,int rt)
  74. {
  75. lazy_tag[rt].E();
  76. if (l==r)
  77. {
  78. sum[rt] = A^a[l];
  79. return;
  80. }
  81. int m = (l+r)>>1;
  82. build(lson),build(rson);
  83. push_up(rt);
  84. }
  85. inline void push_down(int rt)
  86. {
  87. if (!flag[rt]) return;
  88. flag[rt<<1] = flag[rt<<1|1] = 1;
  89. flag[rt] = 0;
  90. sum[rt<<1]=sum[rt<<1]*lazy_tag[rt];
  91. sum[rt<<1|1]=sum[rt<<1|1]*lazy_tag[rt];
  92. lazy_tag[rt<<1] = lazy_tag[rt<<1]*lazy_tag[rt];
  93. lazy_tag[rt<<1|1] = lazy_tag[rt<<1|1]*lazy_tag[rt];
  94. lazy_tag[rt].E();
  95. }
  96. void up_data(int L,int R,int x,int l,int r,int rt)
  97. {
  98. if (L<= l && r <= R)
  99. {
  100. lazy_tag[rt]=lazy_tag[rt]*cur;
  101. sum[rt] = sum[rt]*cur;
  102. flag[rt] = 1;
  103. return;
  104. }
  105. push_down(rt);
  106. int m = (l+r)>>1;
  107. if (L <= m) up_data(L,R,x,lson);
  108. if (m < R) up_data(L,R,x,rson);
  109. push_up(rt);
  110. }
  111. MX Q(int L,int R,int l,int r,int rt)
  112. {
  113. if (L <= l && r <= R)
  114. return sum[rt];
  115. push_down(rt);
  116. int m = (l+r)>>1;
  117. MX temp1,temp2;
  118. temp1.O(),temp2.O();
  119. if (L <= m) temp1 = Q(L,R,lson);
  120. if (m < R) temp2 = Q(L,R,rson);
  121. temp1 = temp1 + temp2;
  122. return temp1;
  123. }
  124. LL query(int l,int r)
  125. {
  126. MX temp = Q(l,r,1,n,1);
  127. temp = temp*v;
  128. return temp.v[1][2];
  129. }
  130. int main()
  131. {
  132. //freopen("F:\\rush.txt","r",stdin);
  133. ios::sync_with_stdio(false),cin.tie(0);//scanf,puts,printf not use
  134. cin >> n >> m;
  135. rep1(i,1,n) cin >> a[i];
  136. A.v[1][1] = 0,A.v[1][2] = A.v[2][1] = A.v[2][2] = 1;
  137. v.v[1][1] = v.v[1][2] = v.v[2][1] = 0,v.v[2][2] = 1;
  138. build(1,n,1);
  139. rep1(i,1,m)
  140. {
  141. int type;
  142. cin >> type;
  143. if (type==1)
  144. {
  145. int l,r,x;
  146. cin >> l >> r >> x;
  147. cur = A^x;
  148. up_data(l,r,x,1,n,1);
  149. }
  150. else
  151. {
  152. int l,r;
  153. cin >> l >> r;
  154. cout << query(l,r) << endl;
  155. }
  156. }
  157. return 0;
  158. }

【codeforces 719E】Sasha and Array的更多相关文章

  1. 【24.17%】【codeforces 721D】Maxim and Array

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  2. 【codeforces 754A】Lesha and array splitting

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  3. 【Codeforces 258B】 Sort the Array

    [题目链接] http://codeforces.com/contest/451/problem/B [算法] 模拟 在序列中找到一段单调递增的子序列,将这段序列反转,然后判断序列是否变得单调递增,即 ...

  4. codeforces 719E E. Sasha and Array(线段树)

    题目链接: E. Sasha and Array time limit per test 5 seconds memory limit per test 256 megabytes input sta ...

  5. 【44.19%】【codeforces 727C】Guess the Array

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. 【Codeforces 1042D】Petya and Array

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 把a[i]处理成前缀和 离散化. 枚举i从1..n假设a[i]是区间和的a[r] 显然我们需要找到a[r]-a[l]<t的l的个数 即a ...

  7. 【codeforces 1109B】Sasha and One More Name

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 如果这个回文串的左半部分,字母全是一样的. 那么显然不可能再分出来了,因为不管怎么分怎么排列,最后肯定都只能和原串一样. 所以无解 其他情况下 ...

  8. 【Codeforces 1114B】Yet Another Array Partitioning Task

    [链接] 我是链接,点我呀:) [题意] 让你把数组分成k个连续的部分 使得每个部分最大的m个数字的和最大 [题解] 把原数组降序排序 然后选取前m*k个数字打标记 然后对于原数组 一直贪心地取 直到 ...

  9. 【Codeforces 1109C 】Sasha and a Patient Friend

    Codeforces 1109 C 题意:现在有个碗,每时每刻其中的水量都会加一个整数(可以为负). 给\(n\)个询问,询问有\(3\)种类型: \(1\ t\ s\):将从第\(t\)秒开始水量增 ...

随机推荐

  1. 新建maven web工程报错

    问题: 检查本地仓库: 检查1.0跟release的文件夹: 试试:http://www.ithao123.cn/content-8028507.html 然后选择maven catalog下的:(这 ...

  2. web.xml配置编码过滤器解决中文乱码问题

    为了防止前端传入的中文数据出现乱码问题,使用Spring提供的编码过滤器来统一编码. 要使用编码过滤器,只需要在web.xml中添加如下代码: <filter> <filter-na ...

  3. CH Round #46A 磁力块

    还是一道好题的 对于一个磁石是否被吸引,有两个关键字:距离和质量.(二维偏序??) 好像是很厉害的分块姿势,先按第一关键字排序,在块中按第二关键字排 进行bfs,对于当前磁石,有1~k-1个块是第一关 ...

  4. 样条函数(spline function)—— 分段多项式函数(piecewise polynomial function)

    1. 分段多项式函数 样条函数是某种意义上的分段函数. Spline (mathematics) - Wikipedia 最简单的样条函数是一种分段多项式函数(piecewise polynomial ...

  5. 【HDU 1846】 Brave Game

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=1846 [算法] 巴什博弈 若有(m+1)个石子,显然先手不能直接取完,后手必胜 因此,我们可以把石 ...

  6. GStreamer基础教程01 - Hello World

    摘要 在面对一个新的软件库时,第一步通常实现一个“hello world”程序,来了解库的用法.对于GStreamer,我们可以实现一个极简的播放器,来了解GStreamer的使用. 环境配置 为了快 ...

  7. Super超级ERP系统---(3)基础信息管理--商品管理

    商品管理主要包括商品的添加,修改,维护商品所在分类,单位,供应商,品牌,名称,价格,尺寸,规格等属性的维护.   1.商品添加 2.商品列表展示 商品列表界面左侧商品分类,右侧是商品信息

  8. 以SqlHelper为例论面向对象中封装的使用(续)

    上文以SqlHelper为例说明了面向对象中封装的好处,但是上文只是简单封装,考虑下面代码的情况: public static Activate GetByCode(string code) { Li ...

  9. [Offer收割]编程练习赛38

    漏写的数字 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #inclu ...

  10. Vue.js 2 vs Vue.js 3的实现 – 云栖社区

    Vue.js 2 vs Vue.js 3的实现 – 云栖社区 vue.js核心团队已经讨论过将在Vue3实现的变化.虽然API不会改变,但是数据响应机制(译者注:对数据改变的监听和通知)发生了变化.这 ...