提交时间:2024-04-04 17:52:21
运行 ID: 28176
#include<bits/stdc++.h> using namespace std; #define int long long #define inx int i=h[u],v=(~i)?edge[i].v:0,w=(~i)?edge[i].w:0;~i;i=edge[i].nx,v=(~i)?edge[i].v:0,w=(~i)?edge[i].w:0 const int MAXN=100010,N=25,inf=100000000000000000,Mod=1000000007; int n,m,a[MAXN],b[MAXN]; inline int lb(int x){return x&(-x);} struct treearray{ int C[MAXN]; int qry(int x){ int res=0; for(int i=x;i>=1;i-=lb(i)){ res+=C[i]; } return res; } void update(int l,int r,int x){ for(int i=r+1;i<=n;i+=lb(i))C[i]-=x; for(int i=l;i<=n;i+=lb(i))C[i]+=x; } }; int lg2[MAXN],stn[N][MAXN],stm[N][MAXN]; int qrym(int l,int r){ int g=lg2[r-l+1]; return max(stm[g][l],stm[g][r-(1<<g)+1]); } int qryn(int l,int r){ int g=lg2[r-l+1]; return min(stn[g][l],stn[g][r-(1<<g)+1]); } int f[MAXN],g[MAXN]; void slv(){ scanf("%lld",&n); for(int i=2;i<=MAXN-5;i++)lg2[i]=lg2[i>>1]+1; memset(stn,0x3f,sizeof(stn)); for(int i=1;i<=n;i++){f[i]=inf; scanf("%lld%lld",&a[i],&b[i]); stn[0][i]=b[i];stm[0][i]=a[i]; }f[i+1]=inf; for(int i=1;1<<i<=n;i++){ for(int j=1;j+(1<<(i-1))<=n;j++){ stn[i][j]=min(stn[i-1][j],stn[i-1][j+(1<<i-1)]); stm[i][j]=max(stm[i-1][j],stm[i-1][j+(1<<i-1)]); } } f[1]=0;g[1]=1; for(int i=1;i<=n;i++){ for(int j=i;j<=n;j++){ if(qrym(i,j)<=j-i+1&&qryn(i,j)>=j-i+1){ if(f[j+1]>f[i]+1){ f[j+1]=f[i]+1; g[j+1]=g[i]; } else if(f[j+1]==f[i]+1){ g[j+1]+=g[i];g[j+1]%=Mod; } } } } if(f[n+1]!=inf){ printf("-1"); return; } printf("%lld %lld",f[n+1],g[n+1]); } signed main(){ slv(); return 0; }