1 条题解

  • 1
    @ 2022-8-27 9:11:35
    #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
    上传者