A,B,C傻逼题,就不说了。

E题:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=,mod=;
typedef long long int64;
int n,m,fuck[maxn<<];
int64 a[maxn],s1[maxn<<],s2[maxn<<];
struct Matrix{
int n,m;
int64 a[][];
void clear(){for (int i=;i<;i++)for (int j=;j<;j++)a[i][j]=;}
}wn,lazy[maxn<<],a0,t1,t2,b;
Matrix operator *(Matrix x,Matrix y){
Matrix ans; ans.n=x.n,ans.m=y.m;
ans.clear(); int N=ans.n,M=ans.m;
for (int i=;i<N;i++){
for (int j=;j<M;j++){
for (int k=;k<x.m;k++){
ans.a[i][j]=(ans.a[i][j]+x.a[i][k]*y.a[k][j]%mod)%mod;
}
}
}
return ans;
}
Matrix qpow(Matrix x,int64 y){
if (y==) return wn;
if (y==) return x;
Matrix d=qpow(x,y/); d=d*d;
if (y&) return d*x;
else return d;
}
void build(int k,int l,int r){
lazy[k]=wn; fuck[k]=-;
if (l==r) return;
int mid=(l+r)>>;
build(k*,l,mid),build(k*+,mid+,r);
}
void pushdown(int k,Matrix x){
Matrix y=x;
int64 oy=s1[k],zx=s2[k],A,B,C;
t1=a0*x; A=t1.a[][]; x=x*b;
t1=a0*x; B=t1.a[][]; x=x*b;
t1=a0*x; C=t1.a[][];
s1[k]=(oy*A%mod+zx*B%mod)%mod;
s2[k]=(oy*B%mod+zx*C%mod)%mod;
if (fuck[k]!=-){lazy[k]=lazy[k]*y,lazy[k]=lazy[k]*b;}
else lazy[k]=y;
fuck[k]=;
}
void insert(int k,int l,int r,int x,int64 y1,int64 y2){
if (l==r&&r==x){s1[k]=y1%mod,s2[k]=y2%mod;return;}
int mid=(l+r)>>;
if (x<=mid) insert(k*,l,mid,x,y1,y2);
else insert(k*+,mid+,r,x,y1,y2);
s1[k]=(s1[k*]+s1[k*+])%mod,s2[k]=(s2[k*]+s2[k*+])%mod;
}
void change(int k,int l,int r,int x,int y,Matrix t){
if (fuck[k]!=-){
if (l!=r){pushdown(k*,lazy[k]),pushdown(k*+,lazy[k]);}
lazy[k]=wn; fuck[k]=-;
}
if (l>=x&&r<=y){pushdown(k,t);return;}
int mid=(l+r)>>;
if (x<=mid) change(k*,l,mid,x,y,t);
if (y>mid) change(k*+,mid+,r,x,y,t);
s1[k]=(s1[k*]+s1[k*+])%mod,s2[k]=(s2[k*]+s2[k*+])%mod;
}
int64 query(int k,int l,int r,int x,int y){
if (fuck[k]!=-){
if (l!=r){pushdown(k*,lazy[k]),pushdown(k*+,lazy[k]);}
lazy[k]=wn; fuck[k]=-;
}
if (l>=x&&r<=y) return s2[k]%mod;
int mid=(l+r)>>; int64 temp=;
if (x<=mid) temp=(temp+query(k*,l,mid,x,y))%mod;
if (y>mid) temp=(temp+query(k*+,mid+,r,x,y))%mod;
return temp;
}
int main(){
scanf("%d%d",&n,&m); a0.clear(),t1.clear(),b.clear(),wn.clear();
a0.n=,a0.m=; a0.a[][]=,a0.a[][]=;
wn.n=,wn.m=;
for (int i=;i<;i++)
for (int j=;j<;j++){
if (i==j) wn.a[i][j]=;
else wn.a[i][j]=;
}
build(,,n);
b.n=b.m=;
for (int i=;i<;i++){
for (int j=;j<;j++){
if (!i&&!j) b.a[i][j]=;
else b.a[i][j]=;
}
}
memset(s1,,sizeof(s1));
memset(s2,,sizeof(s2));
for (int i=;i<=n;i++){
scanf("%I64d",&a[i]);
t1=a0*qpow(b,a[i]);
t2=a0*qpow(b,a[i]-);
insert(,,n,i,t2.a[][],t1.a[][]);
}
for (int type,l,r,x;m;m--){
scanf("%d%d%d",&type,&l,&r);
if (type==){
scanf("%d",&x);
t1=qpow(b,x-);
change(,,n,l,r,t1);
}else{printf("%I64d\n",query(,,n,l,r)%mod);}
}
return ;
}

链接:http://codeforces.com/contest/719/problem/E

题目大意:给定一个长度为n的序列ai,m个操作,有以下两种操作,1种是把l~r这一段数加上一个数x,另1种是询问l~r的f[ai]之和,f[i]为斐波那契数列的第i项,令f[1]=f[2]=1,f[i]=f[i-2]+f[i-1](i>2). n,m<=10^5  ,  1<=ai,x<=10^9;

做法:这题显然是要用线段树和矩阵快速幂,但是是区间修改不好维护,但是对于斐波那契数列有个结论就是f[n+m]=f[n-1]*f[m]+f[n]*f[m+1],有了这个就很好做了,如下:

f(a+x) = f(x+1)f(a) + f(x)f(a-1)
f(a-1+x) = f(x-1)f(a-1) + f(x)f(a)
令s1(l,r)为区间内所有f(a[i])的和
令s2(l,r)为区间内所有f(a[i]-1)的和
然后线段树维护这两个就行了,每次计算某个f(x)的值就拿矩阵快速幂(8*logn)。

这样的做法是nlogn^2的,加上线段树的常数是过不了的,我们得考虑矩阵乘法那一部分,我们真的需要在每次传标记的时候都用logn的时间来计算f(x)吗,显然是不需要的,我们只要把lazy标记设为一个矩阵即可,为b^x(令b为用矩阵乘法求斐波那契数列时候的矩阵),合并标记的时候就把这个矩阵乘一下即可,总时间复杂度降为了nlogn,能过。这题首先用结论把问题转化为了支持区间修改,再利用了每次计算的重复,巧妙地把lazy标记定为矩阵,进一步降低时间复杂度,一个好题。

Codeforces Round #373 (Div. 2)的更多相关文章

  1. Codeforces Round #373 (Div. 1)

    Codeforces Round #373 (Div. 1) A. Efim and Strange Grade 题意 给一个长为\(n(n \le 2 \times 10^5)\)的小数,每次可以选 ...

  2. Codeforces Round #373 (Div. 2)A B

    Codeforces Round #373 (Div. 2) A. Vitya in the Countryside 这回做的好差啊,a想不到被hack的数据,b又没有想到正确的思维 = = [题目链 ...

  3. Codeforces Round #373 (Div. 2) C. Efim and Strange Grade 水题

    C. Efim and Strange Grade 题目连接: http://codeforces.com/contest/719/problem/C Description Efim just re ...

  4. Codeforces Round #373 (Div. 2) C. Efim and Strange Grade —— 贪心 + 字符串处理

    题目链接:http://codeforces.com/problemset/problem/719/C C. Efim and Strange Grade time limit per test 1 ...

  5. Codeforces Round #373 (Div. 2) A B C 水 贪心 模拟(四舍五入进位)

    A. Vitya in the Countryside time limit per test 1 second memory limit per test 256 megabytes input s ...

  6. Codeforces Round #373 (Div. 2) E. Sasha and Array 线段树维护矩阵

    E. Sasha and Array 题目连接: http://codeforces.com/contest/719/problem/E Description Sasha has an array ...

  7. Codeforces Round #373 (Div. 2) B. Anatoly and Cockroaches 水题

    B. Anatoly and Cockroaches 题目连接: http://codeforces.com/contest/719/problem/B Description Anatoly liv ...

  8. Codeforces Round #373 (Div. 2) A. Vitya in the Countryside 水题

    A. Vitya in the Countryside 题目连接: http://codeforces.com/contest/719/problem/A Description Every summ ...

  9. 线段树+矩阵快速幂 Codeforces Round #373 (Div. 2) E

    http://codeforces.com/contest/719/problem/E 题目大意:给你一串数组a,a[i]表示第i个斐波那契数列,有如下操作 ①对[l,r]区间+一个val ②求出[l ...

随机推荐

  1. js(javascript)与OC(Objective-C)交互

    实质上oc与js的通信交互就是发送消息,也即函数调用,iOS7以后官方公布JavaScriptCore framework中很方便我们对他们之间的相互调用.在以前我们只能通过UIWebView的UIW ...

  2. CSS3-01 简介

    概述 HTML 文档由包含 HTML 标签的 HTML 元素组成,HTML 标签被用于定义文档的内容.HTML 文档内容没有额外的样式,以纯文本流的方式渲染到浏览器页面.需要借助层叠样式表(CSS)来 ...

  3. iOS开发之功能模块--长方形UIImage截取中间最大正方形区域

    这里直接用CoreGraphics的一些处理图片的方法,本身不难,但是有些时候用的不多,就会遗忘掉使用方法的细节.下面就直接展示关键源码,以便下次重复需求,就可以立马找回. 该方法中在UIImage的 ...

  4. jquery本地上传预览扩展(隐藏上传控件单击图片上传支持ie!!)

    我用到的原材料地址:http://www.cnblogs.com/leejersey/p/3660202.html 修改后: /// <reference path="../../Js ...

  5. 从零自学Hadoop(16):Hive数据导入导出,集群数据迁移上

    阅读目录 序 导入文件到Hive 将其他表的查询结果导入表 动态分区插入 将SQL语句的值插入到表中 模拟数据文件下载 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并 ...

  6. Hibernate注解----类级别注解以及属性注解详解----图片版本

    这篇文章是我在慕课网上学习Hibernate注解的时候进行手机以及整理的笔记. 今天把它分享给大家,希望对大家有用.可以进行收藏,然后需要的时候进行对照一下即可.这样能起到一个查阅的作用. 本文主要讲 ...

  7. 多点触摸(MT)协议(翻译)

    参考: http://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt 转自:http://www.arm9home.ne ...

  8. register_shutdown_function AND fastcgi_finish_request

    在php中又两个方法都是在请求快结束的时候执行.方法名分别是 register_shutdown_function和fastcgi_finish_request.虽然执行的时机差不多,但是功能和应用场 ...

  9. 利用keepalived和haproxy配置mysql的高可用负载均衡

    实验系统:CentOS 6.6_x86_64(2.6.32-504.30.3.el6.x86_64) 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:k ...

  10. ubuntu 下安装 texlive 并设置 ctex 中文套装

    1 安装 texlive2013 1.1 下载 texlive2013 下载地址:http://ftp.ctex.org/mirrors/CTAN/systems/texlive/Images/tex ...