ZOJ3772_Calculate the Function

给出一些数组a[i],每次询问为li,ri,定义f[li]=a[li],f[li+1]=a[li+1],对于其他不超过ri的位置,f[x]=f[x-1]+a[x]*f[x-2] 。

题目有着浓浓的矩阵气息。

f[x]=f[x-1]+a[x]*f[x-2]

f[x-1]=f[x-1]+0

根据上面两个我们就可以知道

f[x]=========|1,a[x]|         f[x-1]

f[x-1]=======|1 ,  0|         f[x-2]

这样我们就把矩阵构造出来了,相当于每次询问某一段区间的矩阵的乘积。

由于是连续的区间,线段树即可解决问题。

注意矩阵是放在左边,所以大的位置放在左边,线段树操作的时候也需要注意了。

召唤代码君:

#include <iostream>
#include <cstring>
#include <cstdio>
#define maxn 300300
#define mod 1000000007
typedef long long ll;
using namespace std;

class Mat{
public:
    ll f[2][2];
    Mat() { f[0][0]=f[1][1]=f[0][1]=f[1][0]=0; }
    Mat(int f1,int f2,int f3,int f4){
        f[0][0]=f1,f[0][1]=f2,f[1][0]=f3,f[1][1]=f4;
    }
    Mat operator * (Mat m1) const{
        Mat m0;
        for (int i=0; i<2; i++)
            for (int j=0; j<2; j++)
                for (int k=0; k<2; k++)
                    m0.f[i][j]=(m0.f[i][j]+f[i][k]*m1.f[k][j])%mod;
        return m0;
    }
    void output(){
        cout<<f[0][0]<<‘ ‘<<f[0][1]<<‘\n‘<<f[1][0]<<‘ ‘<<f[1][1]<<‘\n‘;
    }
}tree[maxn];

int n,m,T,a[maxn];

void build(int rt,int l,int r)
{
    if (l==r){
        tree[rt]=Mat(1,a[l],1,0);
        return;
    }
    int mid=(l+r)>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    tree[rt]=tree[rt<<1|1]*tree[rt<<1];
}

Mat query(int rt,int l,int r,int L,int R)
{
    if (L<=l && R>=r) return tree[rt];
    int mid=(l+r)>>1;
    Mat tot(1,0,0,1);
    if (R> mid) tot=query(rt<<1|1,mid+1,r,L,R);
    if (L<=mid) tot=tot*query(rt<<1,l,mid,L,R);
    return tot;
}

int main()
{
    int x,y;
    scanf("%d",&T);
    while (T--)
    {
        scanf("%d%d",&n,&m);
        for (int i=1; i<=n; i++) scanf("%d",&a[i]);
        build(1,1,n);
        while (m--)
        {
            scanf("%d%d",&x,&y);
            if (y==x || y==x+1){
                if (y==x) printf("%d\n",a[x]);
                    else printf("%d\n",a[x+1]);
                continue;
            }
            Mat tmp=query(1,1,n,x+2,y);
            /*
            cout<<" ans Mat is : \n";
            tmp.output();
            cout<<" ...........   the end of Mat.";
            */
            printf("%d\n",(int)((tmp.f[0][0]*a[x+1]+tmp.f[0][1]*a[x])%mod));
        }
    }
    return 0;
}

ZOJ3772_Calculate the Function,布布扣,bubuko.com

时间: 2024-10-12 03:43:38

ZOJ3772_Calculate the Function的相关文章

通过百度echarts实现数据图表展示功能

现在我们在工作中,在开发中都会或多或少的用到图表统计数据显示给用户.通过图表可以很直观的,直接的将数据呈现出来.这里我就介绍说一下利用百度开源的echarts图表技术实现的具体功能. 1.对于不太理解echarts是个怎样技术的开发者来说,可以到echarts官网进行学习了解,官网有详细的API文档和实例供大家参考学习. 2.以下是我在工作中实现整理出来的实例源码: 公用的支持js文件 echarts.js.echarts.min.js,还有其他的图表需要支持的js文件也可以到官网下载 echa

帮同学做的大一大作业:《我的家乡—郑州》

---恢复内容开始--- 最近在上海上学的一个高中同学让我帮忙,帮她做她们的计算机课程大作业. 由于关系不错我也不好意思拒绝就帮忙做了,因为这个学期刚刚开始接触HTML5和css,所以制作过程中有很多不懂的,而且由于HTML5是选修课,一星期只有一节,所以做这个花费了比较多的时间,这个网站是我制作的第一个网站,比较有纪念意义,所以发在博客上,作为纪念. 通过去做这个作业,我了解到很多课上学不到的东西.因为没有美工,从头到尾,都是我一个人在臆想,刚开始的时候,根本无从下手,我去参考别人做的家乡网站

Adding New Functions to MySQL(User-Defined Function Interface UDF、Native Function)

catalog 1. How to Add New Functions to MySQL 2. Features of the User-Defined Function Interface 3. User-Defined Function 4. UDF Argument Processing 5. UDF Return Values and Error Handling 6. UDF Compiling and Installing 7. Adding a New Native Functio

安装python 第三方库遇到的安装问题 microsoft visual studio c++ 10.0 is required,Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed?

问题一: microsoft visual studio c++ 10.0 is required 安装scrapy时候出现需要vc c++ 10,有时安装其他也会有. 解决方法:安装vc 2010,安装过2017无效,安装过程也不一样. 问题二: 安装好,出现Could not find function xmlCheckVersion in library libxml2. Is libxml2 installed? 解决办法: 1.pip install wheel 2. 到http://

[c++] Inline Function

The inline functions are a C++ enhancement feature to increase the execution time of a program. Compiler replace the definition at compile time instead of referring function defination at runtime. NOTE - This is a suggestion to compiler to make the f

js instanceof Object Function

Object.Function是javascript中顶级的两个对象,同时也属于两个顶级的构造器,function Object(){}.function Function(){}.Object.Function为两个独立的预先创建的两个对象.new Object创建一个具有Object特性的新的一个对象,new Function创建一个具有Function特性的一个新对象. Object是一个对象,包含__proto__.prototype属性. Object.__proto__ = func

different between method and function

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Arial; color: #242729 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Arial; color: #242729; background-color: #ffffff } span.s1 { background-color: #ffffff } span.s2 { } A method is on an o

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method

最近在做一个网络音乐播放器时,由于出现qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method, 而不能播放网络歌曲. 上网搜了半天,都说要在电脑那里安装openssl,然后把C:\OpenSSL-Win64\bin下的libeay32.dll和ssleay32.dll拷贝到D:\Qt\Qt5.4.2\5.4\mingw491_32\bin, 然而并没什么卵用! 我的解决办法是: Qt的这个目

JavaScript中Function的拓展

Function 是什么东西,就是JavaScript中的顶级类,系统级别的类.我们平时写的函数方法例如下. function Animal() { } Animal就是Function的实例,但是在我们的逻辑中 Animal是类,是自定义类. Function是类,Animal是类也是实例,Animal是Function的实例,Animal是自定义类.这点大家一定要搞清楚. 我们在顶级类上定义一个method的方法,用于进行键值对的方式进行方法链式的设定, Function.prototype