Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
28286 | LYLAKIOI | 【BJ】T3 | C++ | 解答错误 | 61 | 3017 MS | 52952 KB | 3086 | 2024-04-09 20:39:05 |
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define p_b push_back #define m_p make_pair #define p1 first #define p2 second #define pi pair<int,int> using namespace std; typedef long long ll; const int maxn=1e6+10,mod=1e9+7; const int inf=1e9; inline ll read(){ ll x=0;short t=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')t=-1;ch=getchar(); }while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,a[maxn],b[maxn],f[maxn],g[maxn],pre[maxn],Q[maxn]; void upd(int a,int b,int &c,int &d){ if(a>c)c=a,d=b; else if(a==c)(d+=b)%=mod; } void getpre(){ int j=1,l=1,r=0; up(i,1,n){ while(l<=r&&b[Q[r]]>=b[i])r--; Q[++r]=i; while(j<=n){ while(l<=r&&Q[l]<j)l++; if(b[Q[l]]>=i-j+1)break;j++; }pre[i]=j-1; } } struct SegTree { struct node { int lzf,lzg,f,g; }d[maxn<<2]; #define ls(p) (p<<1) #define rs(p) (p<<1|1) #define lzf(p) d[p].lzf #define lzg(p) d[p].lzg #define f(p) d[p].f #define g(p) d[p].g void pu(int p){ f(p)=-1,g(p)=0; upd(f(ls(p)),g(ls(p)),f(p),g(p)); upd(f(rs(p)),g(rs(p)),f(p),g(p)); }void cl(int p,int x,int y){ upd(x,y,lzf(p),lzg(p)),upd(x,y,f(p),g(p)); }void pd(int p){ cl(ls(p),lzf(p),lzg(p)),cl(rs(p),lzf(p),lzg(p)),lzf(p)=-1,lzg(p)=0; }void bd(int l,int r,int p){ lzf(p)=-1,lzg(p)=0; if(l==r){ f(p)=-1,g(p)=0;return; }int mid=l+r>>1; bd(l,mid,ls(p)),bd(mid+1,r,rs(p));pu(p); }void modify(int l,int r,int s,int t,int p,int x,int y){ if(l>r)return; if(l<=s&&t<=r){ cl(p,x,y);return; }pd(p);int mid=s+t>>1; if(l<=mid)modify(l,r,s,mid,ls(p),x,y);if(r>=mid+1)modify(l,r,mid+1,t,rs(p),x,y);pu(p); }void qry(int l,int r,int s,int t,int p,int &x,int &y){ if(l>r)return; if(l<=s&&t<=r){ upd(f(p),g(p),x,y);return; }pd(p);int mid=s+t>>1; if(l<=mid)qry(l,r,s,mid,ls(p),x,y);if(r>=mid+1)qry(l,r,mid+1,t,rs(p),x,y); } }T; void cal(int l,int r,int k){ int L=max(l+a[k],k),R=min(r,k+a[k]-1),i=L; int ff=-1,gg=0; while(i<=R){ if(pre[i]>=k)return; if(pre[i]>=l)break; if(i==L)T.qry(l,i-a[k],0,n,1,ff,gg); else upd(f[i-a[k]],g[i-a[k]],ff,gg); if(ff!=-1)upd(ff+1,gg,f[i],g[i]); i++; }if(pre[i]<l&&i<=r){ int x=lower_bound(pre+i,pre+r+1,l)-pre; int ff=-1,gg=0; T.qry(l,k-1,0,n,1,ff,gg); if(ff!=-1)T.modify(i,x-1,0,n,1,ff+1,gg); i=x; } while(i<=r){ if(pre[i]>=k)return; int ff=-1,gg=0; T.qry(pre[i],min(k-1,i-a[k]),0,n,1,ff,gg); if(ff!=-1)upd(ff+1,gg,f[i],g[i]); i++; } } void sol(int l,int r){ if(l>r)return; if(l==r){ if(l)T.qry(l,l,0,n,1,f[l],g[l]); T.modify(l,l,0,n,1,f[l],g[l]);return; } int k=l+1; up(i,l+1,r)if(a[i]>a[k])k=i; sol(l,k-1);cal(l,r,k);sol(k,r); } void slv(){ memset(f,-1,sizeof(f));f[0]=0,g[0]=1; n=read();up(i,1,n)a[i]=read(),b[i]=read(); getpre(),T.bd(0,n,1),sol(0,n); //up(i,1,n)printf("%d %d\n",i,f[i]); if(f[n]==-1)printf("-1\n"); else printf("%d %d\n",f[n],g[n]); } signed main(){ slv(); return 0; }