CodeForces - 316E3 Summer Homework
Discription
By the age of three Smart Beaver mastered all arithmetic operations and got this summer homework from the amazed teacher:
You are given a sequence of integers a1, a2, ..., an. Your task is to perform on it mconsecutive operations of the following type:
- For given numbers xi and vi assign value vi to element axi.
- For given numbers li and ri you've got to calculate sum , where f0 = f1 = 1 and at i ≥ 2: fi = fi - 1 + fi - 2.
- For a group of three numbers li ri di you should increase value ax by di for allx (li ≤ x ≤ ri).
Smart Beaver planned a tour around great Canadian lakes, so he asked you to help him solve the given problem.
Input
The first line contains two integers n and m (1 ≤ n, m ≤ 2·105) — the number of integers in the sequence and the number of operations, correspondingly. The second line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 105). Then follow m lines, each describes an operation. Each line starts with an integer ti (1 ≤ ti ≤ 3) — the operation type:
- if ti = 1, then next follow two integers xi vi (1 ≤ xi ≤ n, 0 ≤ vi ≤ 105);
- if ti = 2, then next follow two integers li ri (1 ≤ li ≤ ri ≤ n);
- if ti = 3, then next follow three integers li ri di (1 ≤ li ≤ ri ≤ n, 0 ≤ di ≤ 105).
The input limits for scoring 30 points are (subproblem E1):
- It is guaranteed that n does not exceed 100, m does not exceed 10000 and there will be no queries of the 3-rd type.
The input limits for scoring 70 points are (subproblems E1+E2):
- It is guaranteed that there will be queries of the 1-st and 2-nd type only.
The input limits for scoring 100 points are (subproblems E1+E2+E3):
- No extra limitations.
Output
For each query print the calculated sum modulo 1000000000 (109).
Examples
5 5
1 3 1 2 4
2 1 4
2 1 5
2 2 4
1 3 10
2 1 5
12
32
8
50
5 4
1 3 1 2 4
3 1 4 1
2 2 4
1 2 10
2 1 5
12
45 最近好多 数学 + 数据结构 的题啊qwq,既要动脑子又要调代码qwq
斐波那契数列有一个非常好的性质: f[i] = f[i-1] + f[i-2]
这不是废话吗。。。。但是这个能推出来另一个东西 -> f[i] = f[k]*f[i-k] + f[k-1]*f[i-k-1] (这个式子是对于f[0]=f[1]=1的斐波那契数列而言的)。
有了这个,我们就可以随心所欲的通过 ∑f[i]*a[i+l] 和 ∑f[i+1]*a[i+l] 来构造任意 ∑f[i+d]*a[i+l] 啦(也就是程序中的Get函数)。 然后随便打打标机(别忘了下传维护之类的),随便合并合并子树,就可以A啦(但是要写一坨子qwq)
(最近压行成瘾qwq)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2*1e5,ha=1e9;
int f[maxn+5],F[maxn+5],a[maxn+5],le,ri,n,m,w,O;
int sum[maxn*4+5][2],tag[maxn*4+5],L[maxn*4+5],A;
inline void ADD(int &x,int y){ x+=y; if(x>=ha) x-=ha;}
inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;}
inline void init(){ f[0]=F[0]=1; for(int i=1;i<=maxn;i++) f[i]=add(f[i-1],f[i-2]),F[i]=add(f[i],F[i-1]);}
inline int Get(int o,int Derta){ return Derta<2?(Derta?sum[o][1]:sum[o][0]):add(sum[o][0]*(ll)f[Derta-2]%ha,sum[o][1]*(ll)f[Derta-1]%ha);}
inline void QADD(int o,int Derta){ ADD(tag[o],Derta),ADD(sum[o][0],Derta*(ll)F[L[o]-1]%ha),ADD(sum[o][1],Derta*(ll)add(F[L[o]],ha-1)%ha);}
inline void pushdown(int o,int lc,int rc){ if(tag[o]){ QADD(lc,tag[o]),QADD(rc,tag[o]),tag[o]=0;}}
inline void Merge(int o,int lc,int rc,int Derta){
sum[o][0]=add(sum[lc][0],Get(rc,Derta));
sum[o][1]=add(sum[lc][1],Get(rc,Derta+1));
} void build(int o,int l,int r){
L[o]=r-l+1;
if(l==r){ sum[o][0]=sum[o][1]=a[l]; return;}
int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;
build(lc,l,mid);
build(rc,mid+1,r);
Merge(o,lc,rc,mid+1-l);
} void update1(int o,int l,int r){
if(l==r){ sum[o][0]=sum[o][1]=w; return;}
int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;
pushdown(o,lc,rc);
if(le<=mid) update1(lc,l,mid);
else update1(rc,mid+1,r);
Merge(o,lc,rc,mid+1-l);
} void update2(int o,int l,int r){
if(l>=le&&r<=ri){ QADD(o,w); return;}
int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;
pushdown(o,lc,rc);
if(le<=mid) update2(lc,l,mid);
if(ri>mid) update2(rc,mid+1,r);
Merge(o,lc,rc,mid+1-l);
} void query(int o,int l,int r){
if(l>=le&&r<=ri){ ADD(A,Get(o,l-le)); return;}
int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1;
pushdown(o,lc,rc);
if(le<=mid) query(lc,l,mid);
if(ri>mid) query(rc,mid+1,r);
} inline void solve(){
while(m--){
scanf("%d",&O);
if(O==1){ scanf("%d%d",&le,&w),update1(1,1,n);}
else if(O==2){ scanf("%d%d",&le,&ri),A=0,query(1,1,n),printf("%d\n",A);}
else{ scanf("%d%d%d",&le,&ri,&w),update2(1,1,n);}
}
} int main(){
init();
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",a+i);
build(1,1,n);
solve();
return 0;
}
CodeForces - 316E3 Summer Homework的更多相关文章
- [Codeforces 316E3]Summer Homework(线段树+斐波那契数列)
[Codeforces 316E3]Summer Homework(线段树+斐波那契数列) 顺便安利一下这个博客,给了我很大启发(https://gaisaiyuno.github.io/) 题面 有 ...
- CF 316E3 Summer Homework(斐波那契矩阵+线段树)
题目链接:http://codeforces.com/problemset/problem/316/E3 题意:一个数列A三种操作:(1)1 x y将x位置的数字修改为y:(2)2 x y求[x,y] ...
- Codeforces 316E3 线段树 + 斐波那切数列 (看题解)
最关键的一点就是 f[ 0 ] * a[ 0 ] + f[ 1 ] * a[ 1 ] + ... + f[ n - 1] * a[ n - 1] f[ 1 ] * a[ 0 ] + f[ 2 ] * ...
- Magolor的数据结构作业
\(CodeForces 706E ~Working routine\) 给出一个矩阵,每次操作交换两个子矩阵,求最后状态. 使用链表存储,每次交换后,影响到的之后矩阵边缘的指针,暴力修改. \(~~ ...
- codeforces316E3
Summer Homework CodeForces - 316E3 By the age of three Smart Beaver mastered all arithmetic operatio ...
- Codeforces 437A The Child and Homework
题目链接:Codeforces 437A The Child and Homework 少看了一个条件,最后被HACK掉到203名,要不然就冲到100多一点了==.. 做这个题收获最大的是英语,A t ...
- Codeforces Round #371 (Div. 2) B. Filya and Homework 水题
B. Filya and Homework 题目连接: http://codeforces.com/contest/714/problem/B Description Today, hedgehog ...
- Codeforces Round #371 (Div. 2)B. Filya and Homework
题目链接:http://codeforces.com/problemset/problem/714/B 题目大意: 第一行输入一个n,第二行输入n个数,求是否能找出一个数x,使得n个数中的部分数加上x ...
- Codeforces Round #250 (Div. 2)—A. The Child and Homework
好题啊,被HACK了.曾经做题都是人数越来越多.这次比赛 PASS人数 从2000直掉 1000人 被HACK 1000多人! ! ! ! 没见过的科技啊 1 2 4 8 这组数 被黑的 ...
随机推荐
- linux系统下单节点hadoop2的配置
Jdk安装: jdk-7u45-linux-x64.gz cp jdk-7u45-linux-x64.gz /usr/java/ cd /usr/java/ tar -zxvf jdk-7u45-li ...
- 【SHELL】Linux下安装Oracle Client
一.新建Oracle脚本存储目录并上传文件 [root@A04-Test-172]# mkdir -p /tmp/instance_oracle #新建存储目录 [root@A04-Test-172 ...
- [转]using components in Cakephp 2+ Shell
<?php App::uses('AppShell', 'Console/Command'); App::uses('ComponentCollection', 'Controller'); A ...
- ActiveMQ初步学习
本文主要参考张丰哲大神的简书文章,链接 https://www.jianshu.com/p/ecdc6eab554c JMS,即Java Message Service,通过面向消息中间件(MOM:M ...
- loj2537 「PKUWC 2018」Minimax
pkusc 快到了--做点题涨涨 rp. 初见时 yy 了一个类似于归并的东西,\(O(n^2)\),50 分. 50 分 yy 做法 对于一个点,枚举他能到达的权值(假设这个权值在左子树,在右子树是 ...
- 【Remove Elements】cpp
题目: Given an array and a value, remove all instances of that value in place and return the new lengt ...
- [netty4][netty-common]Future与Promise分析
接口与类结构体系 -- [I]java.util.concurrent.Future<V> ---- [I]io.netty.util.concurrent.Future<V> ...
- Android之Bitmap 高效加载
一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数 图片格式(Bitmap.Config) 一张100*100的图片占用内存的大小 ALPHA_8 图片长度*图片宽度 100 ...
- 【转】超简单利用UGUI制作圆形小地图
http://sanwen.net/a/ithhtbo.html 由于UI都是Achor自己用PS做的,比较粗糙,大家见谅,不过丝毫不影响功能的实现,下面我们看看今天的笔记: 首先我们看看需要哪些组件 ...
- 编写可移植的PHP代码
1. 保持配置集中放置. 作为一个通用的准则,建议将大多数信息保存在一个位置(可能是一个文件中),这样在需要修改信息时,就能在同一个位置进行所有必要的修改. 2. 编写可重用的代码: 如果刚刚结束了其 ...