再捞:16 分求助

P4891 序列

```cpp #include <bits/stdc++.h> // 以下为缺省源 #define _cst const #define _IfD long long #define _siz 20 char buf[1<<_siz],buffer[1<<_siz],*p1=buf,*p2=buf,cH=' '; int op1=-1; _cst int op2=(1<<_siz)-1; inline char gc(){return (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<_siz,stdin)),p1==p2?EOF:*p1++);} inline void flush(){fwrite(buffer,1,op1+1,stdout),op1=-1;} inline void pc(_cst char &x){if(op1==op2)flush();buffer[++op1]=x;} template<typename T>void read(T &w){ w=0;bool f=1;char ch=gc(); for(;ch<'0' || ch>'9';ch=gc()) if(ch=='-')f=0; for(;'0'<=ch && ch<='9';ch=gc()) w=(w<<1)+(w<<3)+(ch^48); w=f?w:-w; }template<typename T,typename ...Arg>void read(T &w,Arg &...arg){ read(w); read(arg...); }template<typename T>void wrt(T x){ if(x<0) pc('-'),x=-x; if(x>9) wrt(x/10); pc(x%10|48); }template<typename T>void write(T x){ wrt(x); pc(cH); }template<typename T,typename ...Arg>void write(T x,Arg ...arg){ write(x); write(arg...); }inline _IfD pow_10(_IfD x){ _IfD base=10,ans=1; while(x) ans*=((x&1)?base:1),base*=base,x>>=1; return ans; }template<typename T>void readd(T &w){ w=0; _IfD x=0,cnt=0; bool f=1; char ch=gc(); for(;ch<'0' || ch>'9';ch=gc()); if(ch=='-')f=0; for(;'0'<=ch && ch<='9';ch=gc()) x=(x<<1)+(x<<3)+(ch^48); w=(T)(f?x:-x); if(ch!='.') return; x=0,ch=gc(); for(;'0'<=ch && ch<='9';ch=gc(),++cnt) x=(x<<1)+(x<<3)+(ch^48); T tmp=(T)(x/(T)pow_10(cnt)); w=w+(T)(f?tmp:-tmp); }template<typename T,typename ...Arg>void readd(T &w,Arg &...arg){ readd(w); readd(arg...); } template<typename T>inline T qmax(_cst T &a,_cst T &b){return a>b?a:b;} template<typename T,typename ...Arg>inline T qmax(_cst T &a,_cst T &b,_cst Arg &...arg){return qmax(a,qmax(b,arg...));} template<typename T>inline T qmin(_cst T &a,_cst T &b){return a<b?a:b;} template<typename T,typename ...Arg>inline T qmin(_cst T &a,_cst T &b,_cst Arg &...arg){return qmin(a,qmin(b,arg...));} template<typename T>inline void qswap(T &a,T &b){a+=b,b=a-b,a-=b;} // 以上为缺省源 using namespace std; const int MAXN=200005,mod=1e9+7; const int INF=INT_MAX; int a[MAXN],b[MAXN],c[MAXN]; int mulb[MAXN<<2],mulc[MAXN<<2],cntb[MAXN<<2],cntc[MAXN<<2]; int mx[MAXN<<2],mn[MAXN<<2],tag[MAXN<<2]; inline int ksm(int a,int b){ int ans=1; while(b){ if(b&1) ans=1ll*ans*a%mod; a=1ll*a*a%mod,b>>=1; } return ans; } inline int inv(int p){return ksm(p,mod-2);} void push_up(int p){ mulb[p]=1ll*mulb[p<<1]*mulb[p<<1|1]%mod; mulc[p]=1ll*mulc[p<<1]*mulc[p<<1|1]%mod; cntb[p]=cntb[p<<1]+cntb[p<<1|1]; cntc[p]=cntc[p<<1]+cntc[p<<1|1]; mx[p]=qmax(mx[p<<1],mx[p<<1|1]); mn[p]=qmin(mn[p<<1],mn[p<<1|1]); } void addtag(int p,int k){ mulc[p]=ksm(tag[p]=k,cntc[p]); } void push_down(int p,int l,int r){ if(tag[p]==-1) return; addtag(p<<1,tag[p]); addtag(p<<1|1,tag[p]); tag[p]=-1; } void build(int p,int l,int r){ if(l==r){ if(c[l]<b[l]){ mulb[p]=1,mulc[p]=c[l]; cntb[p]=0,cntc[p]=1; mn[p]=b[l]; }else{ mulb[p]=b[l],mulc[p]=1; cntb[p]=1,cntc[p]=0; mn[p]=INF; } mx[p]=a[l]; return; } int mid=(l+r)>>1; build(p<<1,l,mid); build(p<<1|1,mid+1,r); push_up(p); } void chg(int p,int l,int r,int t,int k){ if(l==r){ mx[p]=qmax(mx[p],k); return; } push_down(p,l,r); int mid=(l+r)>>1; if(t<=mid) chg(p<<1,l,mid,t,k); else chg(p<<1|1,mid+1,r,t,k); push_up(p); } void updb(int p,int l,int r,int t,int k,int pr){ if(l==r){ pr=qmax(pr,mx[p]); if(k>pr){ mulb[p]=1,mulc[p]=pr; cntb[p]=0,cntc[p]=1; mn[p]=k; }else{ mulb[p]=k,mulc[p]=1; cntb[p]=1,cntc[p]=0; mn[p]=INF; } return; } push_down(p,l,r); int mid=(l+r)>>1; if(t<=mid) updb(p<<1,l,mid,t,k,pr); else updb(p<<1|1,mid+1,r,t,k,qmax(pr,mx[p<<1])); push_up(p); } void updc(int p,int l,int r,int st,int en,int k){ if(l>en || r<st) return; if(st<=l && r<=en && mn[p]>k) return addtag(p,k),void(); if(l==r){ mulc[p]=1,mulb[p]=b[l]; cntc[p]=0,cntb[p]=1; mn[p]=INF; return; } push_down(p,l,r); int mid=(l+r)>>1; updc(p<<1,l,mid,st,en,k); updc(p<<1|1,mid+1,r,st,en,k); push_up(p); } int ser(int p,int l,int r,int x,int pre){ if(mx[p]<=x) return r+1; if(l==r) return l; int mid=(l+r)>>1; if(qmax(pre,mx[p<<1])>x) return ser(p<<1,l,mid,x,pre); else return ser(p<<1|1,mid+1,r,x,qmax(pre,mx[p<<1])); } int getc(int p,int l,int r,int t,int ans){ if(l==r) return qmax(ans,mx[p]); int mid=(l+r)>>1; if(t<=mid) return getc(p<<1,l,mid,t,ans); else return getc(p<<1|1,mid+1,r,t,qmax(ans,mx[p<<1])); } signed main(){ memset(tag,-1,sizeof(tag)); int n,q; read(n,q); c[0]=-1; for(int i=1;i<=n;i++) read(a[i]),c[i]=qmax(c[i-1],a[i]); for(int i=1;i<=n;i++) read(b[i]); build(1,1,n); while(q--){ int op,x,y; read(op,x,y); if(op==0){ chg(1,1,n,x,y); int cur=getc(1,1,n,x,-1); if(cur<y) updc(1,1,n,x,ser(1,1,n,y,-1)-1,y); }else{ b[x]=y,updb(1,1,n,x,y,-1); } wrt((int)(1ll*mulb[1]*mulc[1]%mod)),pc(10); } return flush(),0; } ```
by E1_de5truct0r @ 2023-01-27 10:58:38


祖传快读人
by RNTBW @ 2023-01-27 10:59:59


你一道题调一个月?
by zztqwq @ 2023-01-27 11:16:55


重构吧
by zztqwq @ 2023-01-27 11:18:12


6(
by E1_de5truct0r @ 2023-01-27 11:19:55


@[zztqwq](/user/125913) 刚才肉眼看了 10 遍发现有个地方忘了取等,现在过了(((
by E1_de5truct0r @ 2023-01-27 11:23:02


|