ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

loj2512 [BJOI2018]链上二次求和

2019-02-15 10:52:46  阅读:297  来源: 互联网

标签:BJOI2018 le int loj2512 mid 链上 include ri mod


传送门

分析

咕咕咕

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define int long long
const int mod = 1e9+7;
const int t = 5e8+4;
int n,m,p[200100],pp[200100],d[20000100],Ans,f1[200100],f2[200100];
int cola[20000100],colb[20000100],colc[20000100];
inline void build(int le,int ri,int wh){
    if(le==ri){
      d[wh]=pp[le]*2%mod;
      return;
    }
    int mid=(le+ri)>>1;
    build(le,mid,wh<<1);
    build(mid+1,ri,wh<<1|1);
    d[wh]=(d[wh<<1]+d[wh<<1|1])%mod;
}
inline int S(int le,int ri,int a,int b,int c){
    int res=c*(ri-le+1)%mod+b*((f1[ri]-(le?f1[le-1]:0)+mod)%mod)%mod
              +a*((f2[ri]-(le?f2[le-1]:0)+mod)%mod)%mod;
    return res%mod;
}
inline void pd(int wh,int le,int mid,int ri){
    int a=cola[wh],b=colb[wh],c=colc[wh];
    if(!a&&!b&&!c)return;
    cola[wh<<1]+=a,colb[wh<<1]+=b,colc[wh<<1]+=c;
    cola[wh<<1]%=mod,colb[wh<<1]%=mod,colc[wh<<1]%=mod;
    d[wh<<1]+=S(le,mid,a,b,c);
    d[wh<<1]%=mod;
    cola[wh<<1|1]+=a,colb[wh<<1|1]+=b,colc[wh<<1|1]+=c;
    cola[wh<<1|1]%=mod,colb[wh<<1|1]%=mod,colc[wh<<1|1]%=mod;
    d[wh<<1|1]+=S(mid+1,ri,a,b,c);
    d[wh<<1|1]%=mod;
    cola[wh]=colb[wh]=colc[wh]=0;
}
inline void update(int le,int ri,int wh,int x,int y,int a,int b,int c){
    if(le>=x&&ri<=y){
      cola[wh]+=a,colb[wh]+=b,colc[wh]+=c;
      cola[wh]%=mod,colb[wh]%=mod,colc[wh]%=mod;
      d[wh]+=S(le,ri,a,b,c);
      d[wh]%=mod;
      return;
    }
    int mid=(le+ri)>>1;
    pd(wh,le,mid,ri);
    if(mid>=x)update(le,mid,wh<<1,x,y,a,b,c);
    if(mid<y)update(mid+1,ri,wh<<1|1,x,y,a,b,c);
    d[wh]=(d[wh<<1]+d[wh<<1|1])%mod;
}
inline int q(int le,int ri,int wh,int x,int y){
    if(le>=x&&ri<=y)return d[wh];
    int mid=(le+ri)>>1,ans=0;
    pd(wh,le,mid,ri);
    if(mid>=x)ans=(ans+q(le,mid,wh<<1,x,y))%mod;
    if(mid<y)ans=(ans+q(mid+1,ri,wh<<1|1,x,y))%mod;
    d[wh]=(d[wh<<1]+d[wh<<1|1])%mod;
    return ans;
}
signed main(){
    int i,j,k;
    scanf("%lld%lld",&n,&m);
    for(i=1;i<=n;i++)scanf("%lld",&p[i]),p[i]=(p[i]+p[i-1])%mod;
    for(i=1;i<=n;i++)pp[i]=(pp[i-1]+p[i])%mod;
    for(i=1;i<=n;i++)f1[i]=(f1[i-1]+i)%mod,f2[i]=(f2[i-1]+i*i)%mod;
    build(0,n,1);
    for(i=1;i<=m;i++){
      scanf("%lld",&k);
      int le,ri,len,D;
      if(k==1){
          scanf("%lld%lld%lld",&le,&ri,&D);
          if(le>ri)swap(le,ri);
          len=ri-le+1;
          int a=D,b=(3-2*le%mod+mod)%mod*D%mod;
        int c=(le*le%mod-3*le%mod+2+mod)%mod*D%mod;
          update(0,n,1,le,ri,a,b,c);
          if(ri==n)continue;
          a=0,b=2*len*D%mod,c=(len*(len+1-2*ri)%mod+mod)%mod*D%mod;
        update(0,n,1,ri+1,n,a,b,c);
      }else {
          scanf("%lld%lld",&le,&ri);
          len=ri-le+1;
          Ans=len*q(0,n,1,n,n)%mod;
          Ans=(Ans-q(0,n,1,le-1,ri-1)+mod)%mod;
        Ans=(Ans-q(0,n,1,n-ri,n-le)+mod)%mod;
          printf("%lld\n",Ans*t%mod);
      }
    }
    return 0;
}

标签:BJOI2018,le,int,loj2512,mid,链上,include,ri,mod
来源: https://www.cnblogs.com/yzxverygood/p/10382268.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有