4597: [Shoi2016]随机序列
Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 327 Solved: 192
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
9384 887 2778 6916 7794
2 8336
5 493
3 1422
1 28
4 60
Sample Output
252923708
942282590
228728040
608998099
HINT
Source
/************************************************************** Problem: 4597 User: JYYHH Language: C++ Result: Accepted Time:584 ms Memory:6372 kb ****************************************************************/ #include<bits/stdc++.h> #define ll long long using namespace std; const int ha=1000000007; const int maxn=100005; int a[maxn],f[maxn],hz,pos,qz[maxn]; int c[maxn],n,Q,val,ans,b[maxn],w; int tag[maxn*4],sum[maxn*4],le,ri; inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x; } inline int ksm(int x,int y){ int an=1; for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha; return an; } inline void maintain(int o,int lc,int rc){ sum[o]=add(sum[lc],sum[rc]); } inline void change(int o,int MUL){ tag[o]=tag[o]*(ll)MUL%ha; sum[o]=sum[o]*(ll)MUL%ha; } inline void pushdown(int o,int lc,int rc){ if(tag[o]>1){ change(lc,tag[o]),change(rc,tag[o]); tag[o]=1; } } void build(int o,int l,int r){ tag[o]=1; if(l==r){ sum[o]=(l==n?qz[l]:qz[l]*2ll*(ll)c[n-l-1]%ha); return; } int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1; build(lc,l,mid),build(rc,mid+1,r); maintain(o,lc,rc); } void update(int o,int l,int r){ if(l>=le&&r<=ri){ change(o,w); return; } int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1; pushdown(o,lc,rc); if(le<=mid) update(lc,l,mid); if(ri>mid) update(rc,mid+1,r); maintain(o,lc,rc); } inline void solve(){ build(1,1,n); while(Q--){ scanf("%d%d",&pos,&val); le=pos,ri=n,w=val*(ll)ksm(a[pos],ha-2)%ha; a[pos]=val; update(1,1,n); printf("%d\n",sum[1]); } } int main(){ scanf("%d%d",&n,&Q),c[0]=qz[0]=1; for(int i=1;i<=n;i++) c[i]=add(c[i-1],add(c[i-1],c[i-1])); for(int i=1;i<=n;i++){ scanf("%d",a+i); qz[i]=qz[i-1]*(ll)a[i]%ha; } solve(); return 0; }
然后标记永久化的
/************************************************************** Problem: 4597 User: JYYHH Language: C++ Result: Accepted Time:460 ms Memory:6372 kb ****************************************************************/ #include<bits/stdc++.h> #define ll long long using namespace std; const int ha=1000000007; const int maxn=100005; int a[maxn],f[maxn],hz,pos,qz[maxn]; int c[maxn],n,Q,val,ans,b[maxn],w; int tag[maxn*4],sum[maxn*4],le,ri; inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x; } inline int ksm(int x,int y){ int an=1; for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha; return an; } inline void maintain(int o,int lc,int rc){ sum[o]=tag[o]*(ll)add(sum[lc],sum[rc])%ha; } inline void change(int o,int MUL){ tag[o]=tag[o]*(ll)MUL%ha; sum[o]=sum[o]*(ll)MUL%ha; } void build(int o,int l,int r){ tag[o]=1; if(l==r){ sum[o]=(l==n?qz[l]:qz[l]*2ll*(ll)c[n-l-1]%ha); return; } int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1; build(lc,l,mid),build(rc,mid+1,r); maintain(o,lc,rc); } void update(int o,int l,int r){ if(l>=le&&r<=ri){ change(o,w); return; } int mid=l+r>>1,lc=o<<1,rc=(o<<1)|1; if(le<=mid) update(lc,l,mid); if(ri>mid) update(rc,mid+1,r); maintain(o,lc,rc); } inline void solve(){ build(1,1,n); while(Q--){ scanf("%d%d",&pos,&val); le=pos,ri=n,w=val*(ll)ksm(a[pos],ha-2)%ha; a[pos]=val; update(1,1,n); printf("%d\n",sum[1]); } } int main(){ scanf("%d%d",&n,&Q),c[0]=qz[0]=1; for(int i=1;i<=n;i++) c[i]=add(c[i-1],add(c[i-1],c[i-1])); for(int i=1;i<=n;i++){ scanf("%d",a+i); qz[i]=qz[i-1]*(ll)a[i]%ha; } solve(); return 0; }