ABBYY Cup 3.0 E3. Summer Homework(线段树+思维+斐波那契)

 

题目就是要求完成上述操作,每次操作 2,都要输出结果

 

const ll mod=1e9;
const int N=2e5+5;

    int n,m;
    int i,j,k;
    int a[N];
    ll f[N],sum[N];
    struct Node
    {
        int l,r,len;
        ll s1,s2,lazy;
        void init(int l,int r){
            this->l=l,this->r=r;
            len=r-l+1;
            lazy=0;
        }
        void update(ll x)
        {
            s1=(s1+sum[len]*x%mod)%mod;
            s2=(s2+(sum[len+1]-1)*x%mod)%mod;
            lazy+=x;
        }
        #define lson id<<1
        #define rson id<<1|1
    }t[N<<2];

void init()
{
    f[1]=f[2]=1;
    forn(i,3,N-1) f[i]=(f[i-1]+f[i-2])%mod;
    forn(i,1,N-1) sum[i]=(sum[i-1]+f[i])%mod;
}

ll S(int x,int id)
{
    if(x==1) return t[id].s1;
    if(x==2) return t[id].s2;
    return (f[x-1]*t[id].s2%mod+f[x-2]*t[id].s1%mod)%mod;
}

void push_up(int id)
{
    int len=t[lson].len;
    t[id].s1=(t[lson].s1+S(len+1,rson))%mod;
    t[id].s2=(t[lson].s2+S(len+2,rson))%mod;
}

void push_down(int id)
{
    ll x=t[id].lazy;
    if(x){
        t[lson].update(x);
        t[rson].update(x);
        t[id].lazy=0;
    }
}

void build(int l,int r,int id)
{
    t[id].init(l,r);
    if(l==r) return void(t[id].s1=t[id].s2=a[l]) ;
    else{
        int mid=l+r>>1;
        build(l,mid,lson);
        build(mid+1,r,rson);
        push_up(id);
    }
}

void update(int pos,int val,int id)
{
    int L=t[id].l,R=t[id].r;
    if(L==R) t[id].s1=t[id].s2=val;
    else{
        int mid=L+R>>1;
        push_down(id);
        if(mid>=pos) update(pos,val,lson);
        if(pos>=mid+1) update(pos,val,rson);
        push_up(id);
    }
}

void modify(int l,int r,int c,int id)
{
    int L=t[id].l,R=t[id].r;
    if(L>=l && r>=R) t[id].update(c);
    else{
        int mid=L+R>>1;
        push_down(id);
        if(mid>=l) modify(l,r,c,lson);
        if(r>=mid+1) modify(l,r,c,rson);
        push_up(id);
    }
}

ll query(int l,int r,int id)
{
    int L=t[id].l,R=t[id].r;
    if(L>=l && r>=R) return S(L-l+1,id);
    else{
        int mid=L+R>>1;
        push_down(id);
        ll ans=0;
        if(mid>=l) ans=(ans+query(l,r,lson))%mod;
        if(r>=mid+1) ans=(ans+query(l,r,rson))%mod;
        return ans;
    }
}

int main()
{
    while(~sdd(n,m)){
        init();
        forn(i,1,n) sd(a[i]);
        build(1,n,1);
       // forn(i,1,n-1) dbg(query(i,i+1,1));
        forn(i,1,m){
            int opt,x,y,z;
            sddd(opt,x,y);
            if(opt==1) update(x,y,1);
            else if(opt==2) pll(query(x,y,1));
            else sd(z),modify(x,y,z,1);
        }
    }
    //PAUSE;
    return 0;
}

 

已标记关键词 清除标记
相关推荐
Navicat是一套快速、可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降低系统管理成本而设。它的设计符合数据库管理员、开发人员及中小企业的需要。Navicat 是以直觉化的图形用户界面而建的,让你可以以安全并且简单的方式创建、组织、访问并共用信息。 安装教程: 本教程在Win10下安装64位软件测试通过。 1、断网,直到破解成功后才能联网 2、卸载原有Navicat 3、删除"C:\Program Files\PremiumSoft"文件夹 4、Win+R,输入regedit,删除"计算机\HKEY_CURRENT_USER\Software\PremiumSoft"文件夹 5、清空回收站,重启电脑 6、安装Navicat(全部点下一步),安装成功后不要打开软件 7、把Keygen Patch复制到安装目录"C:\Program Files\PremiumSoft\Navicat Premium 15"下,运行Keygen Patch 8、在最顶部选择版本,点右边Patch。 9、不要关闭Keygen Patch,打开桌面上Navicat快捷方式,点注册 10、返回Keygen Patch,点中部最右边的Generate 11、返回Navicat,此时激活码已自动填入,点激活,再点手动激活(会卡一下) 12、复制Navicat上方的请求码(一长串)到Keygen Patch的白色大框中,点击左下角的Generate 13、返回Keygen Patch,此时激活码已自动填入,点激活,点确定 14、然后软件会自动打开,打开左上角栏的工具—选项,取消自动检查更新,取消共享数据,点确定 15、关闭Navicat和Keygen Patch,电脑联网,打开Navicat,打开左上角栏的帮助—关于,如果仍然显示区域许可证,那么才是真正地激活成功 16、若出现各种错误,请按此教程重新走一遍
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页