jzoj4724
DJL为了避免成为一只咸鱼,来找czgj学习Fibonacci数列。
通过czgj的谆谆教导,DJL明白了Fibonacci数列是这样定义的:
F(1)=1;F(2)=1;F(n)=F(n-1)+F(n-2)(n>2)
Czgj深谙熟能生巧的道理,于是他给了DJL一个数列,并安排了如下的训练计划:
1、“1 L r”,表示给ai 加上F(i-L+1) ,其中L<=i<=r ;
2、“2 L r”,表示询问 的值。
DJL经过长时间的学习,感觉身体被掏空,他希望你能帮他解决这个问题。
暴力每一次操作都要O(n),我們考慮一下怎麼可以讓修改複雜度降低為O(1)
我們可以維護一個差分數組d,這個數組可以維護增量
每次修改操作可以將d[l]+1,d[r+1]-f[l-r+2],d[r+2]-f[l-r+1]
然後做一遍前綴和,d[i]=d[i-1]+d[i-2],一直做到d[r+2]為止
所以,d[l]+=1,d[l+1]+=1,d[l+r]+=2……d[r+1]+=f[l-r+1]+f[l-r]-f[l-r+2]==0 d[r+2]+=f[l-r+1]-f[l-r+1]==0
我們可以繼續將原數組和d數組做一遍前綴和,累加一遍,再做一下前綴和就是答案
但是,做完修改以後再做一遍查詢,需要每次重算一遍數組。還是很慢
可以考慮維護一個修改棧f,記錄需要處理的修改操作
可以每k次操作以後重算一遍d數組
在重算d數組時,按照上面的規則計算d數組
最終,求一遍前綴和,將f數組清空,這樣我們就得到了增量數組d
增量數組d可以與a相加,得到增量和,然後這個前綴和就是處理完f數組前的詢問的情況
對於後面的詢問,我們可以暴力算出f數組的詢問對其的影響,最後在計算d數組的增量和即可
這樣,我們需要O(k*m)的時間計算數組,也要重算數組m/k次,需要O(m/k*n)
總時間複雜度為O(k*m+m*n/k)
事實證明,當k=400時速度較快
#include<bits/stdc++.h>
#define mo 1000000009
using namespace std;
typedef long long ll;
struct no{
ll l,r;
}f[100010];
ll ct,n,m,a[100010],f1[100010],f2[100010],d[100010],s[100010];
int main(){
scanf("%lld%lld",&n,&m);
f1[1]=1;f2[1]=1;
for(ll i=2;i<=n;i++){
f1[i]=(f1[i-1]+f1[i-2])%mo;
f2[i]=(f2[i-1]+f1[i])%mo;
}
for(ll i=1;i<=n;i++){
scanf("%lld",&a[i]);
s[i]=(s[i-1]+a[i])%mo;
}
for(ll j=1;j<=m;j++){
ll op,l,r;
scanf("%lld%lld%lld",&op,&l,&r);
if(op==1)f[++ct]=(no){l,r};
if(op==2){
ll v=0;
for(ll i=1;i<=ct;i++){
if(r<f[i].l||f[i].r<l)continue;
v=(v-f2[max(l,f[i].l)-f[i].l]+f2[min(r,f[i].r)-f[i].l+1]+mo)%mo;
}
printf("%lld\n",(v+s[r]-s[l-1]+mo)%mo);
}
if(ct==400){
memset(d,0,sizeof(d));
for(ll i=1;i<=ct;i++){
int a=f[i].l,b=f[i].r;
d[a]=(d[a]+1)%mo;
d[b+1]=(d[b+1]-f1[b-a+2]+mo)%mo;
d[b+2]=(d[b+2]-f1[b-a+1]+mo)%mo;
}
for(ll i=1;i<=n;i++)
d[i]=(d[i]+d[i-1]+d[i-2])%mo;
for(ll i=1;i<=n;i++){
a[i]=(a[i]+d[i])%mo;
s[i]=(s[i-1]+a[i])%mo;
}
ct=0;
}
}
}
jzoj4724的更多相关文章
随机推荐
- windows常用的cmd网络命令
一.ping 它是用来检查网络是否通畅或者网络连接速度的命令.作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的IP ...
- 有关gitlab的神秘操作.....version&&domain设置...
在使用gitlab的时候,如果服务器IP变动,之前的domain写入了配置文件了,如下路径: [root@gitlab-server ~]# vim /var/opt/gitlab/gitlab-ra ...
- 2017年值得一看的7个APP设计
新媒体时代蓬勃发展,各类APP如雨后春笋般出现.下载到合适的APP,不仅衣食住行一键搞定,甚至健身.社交.阅读等需求也能足不出户地满足.对于广大“吃瓜群众”来说,选择APP是个人需求以及跟随潮流的选择 ...
- wpf 进度条 下拉
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsof ...
- /^\s+|\s+$/g 技术 内容
alert(" aa dd ".replace(/^\s+|\s+$/g,'')+"方式的"); //正则表达式解释:分成两部分,^\s+ 以空格开头,\s+$ ...
- MySQL 组合查询 concat
concat( pms_user.f_pu_name, '(' , pms_user.f_pu_realName,')') as userIds
- Winpython环境下mayavi配置
Winpython环境下mayavi配置 在pythonxy中会直接有mayavi软件包,但是所附带的杂包实在太多.本人一直用的是window下的winpython或者linux下的anaconda来 ...
- $.fn.extend 和$.extend函数
区别和详解:jQuery extend()和jQuery.fn.extend() 首先是简单的概述区别:$.extend()是类方法 $.fn.extend()是原型方法 对象方法和原 ...
- 【Java】Eclipse在线安装SVN插件
安装环境 系统:win7系统 软件:eclipse(Mars.2 Release (4.5.2)) 安装步骤 1. 打开eclipse软件,点击菜单栏的help——>Install New So ...
- nginx怎么与tomcat完美结合
nginx怎么与tomcat完美结合 现在公司一个服务器上需要部署两个项目,其中一个项目已经正式上线,并且已经占用了80端口,另外一个项目 部署上去后,访问必须要加端口号,这样的用户体验非常不好,那么 ...