1 条题解
-
1
#include <iostream> #include <algorithm> using namespace std; int const N=401,M=101,INF=1e6; int n,t,a[N],b[N],u[N],v[N],p[N],q[N],inter[N][N], f[N][N],g[N][N],ans[N]; int main(){ cin>>n; for (int i=1;i<=n;i++){ cin>>a[i]>>b[i]; b[i]+=a[i]; p[++t]=a[i]; p[++t]=b[i]; } sort(p+1,p+1+t); q[1]=1; for (int i=2;i<=t;i++) if (p[i]==p[i-1]) q[i]=q[i-1]; else q[i]=q[i-1]+1; for (int i=1;i<=n;i++) for (int j=1;j<=t;j++) { if (a[i]==p[j]) u[i]=q[j]; if (b[i]==p[j]) v[i]=q[j]; } t=q[t]; for (int i=1;i<=t;i++) for (int j=i+1;j<=t;j++) for (int k=1;k<=n;k++) if (u[k]>=i && v[k]<=j) inter[i][j]++; for (int i=1;i<=t;i++) for (int j=0;j<=n/2;j++){ f[i][j]=-INF; if (j==0) f[i][j]=inter[1][i]; for (int k=1;k<=i-1;k++){ f[i][j]=max(f[i][j],f[k][j]+inter[k][i]); f[i][j]=max(f[i][j],f[k][max(0,j-inter[k][i])]); } } for (int i=t;i>=1;i--) for (int j=0;j<=n/2;j++){ g[i][j]=-INF; if (j==0) g[i][j]=inter[i][t]; for (int k=i+1;k<=t;k++){ g[i][j]=max(g[i][j],g[k][j]+inter[i][k]); g[i][j]=max(g[i][j],g[k][max(0,j-inter[i][k])]); } } for (int k=1;k<=n;k++){ for (int i=u[k];i>=1;i--) for (int j=v[k];j<=t;j++){ for (int l=0;l<=inter[1][i];l++){ for (int r=0;r<=inter[j][t];r++){ ans[k]=max(ans[k],min(l+r+inter[i][j],f[i][l]+g[j][r])); if (g[j][r]<r) break; } if (f[i][l]<l) break; } if (inter[1][i]+inter[j][t]<ans[k]) break; if (inter[i][j]>inter[1][i]+inter[j][t]) break; } ans[0]=max(ans[0],ans[k]); } for (int k=0;k<=n;k++) cout<<ans[k]<<endl; return 0; }
- 1
信息
- ID
- 936
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- 递交数
- 17
- 已通过
- 2
- 上传者