75分求助
查看原帖
75分求助
77615
OIerAlbedo楼主2021/3/11 10:45
#include<bits/stdc++.h>
using namespace std;
struct hxz{
	int p1,p2,p3;
};
hxz e[200000];
long long a[200000],b[200000];
int f[20010][3010],h[100000],g[100000];
bool u[200000];
int z,ans,n,m,k,i,xx,yy,x,y,j;
int main()
{
	freopen("bird.in","r",stdin);
	freopen("bird.out","w",stdout);
	ios::sync_with_stdio(0);cin.tie();cout.tie();
	cin>>n>>m>>k;
	for (i=1;i<=n;i++)  
	      {
		  cin>>a[i]>>b[i];
	}
	for (i=0;i<=n+1;i++)
	   for (j=0;j<=2*m;j++)
	       f[i][j]=100000000;
	for (i=1;i<=k;i++) { cin>>x>>y>>z;e[x].p2=y;e[x].p3=z;}
	for (i=1;i<=m;i++) f[0][i]=0;
	for (i=1;i<=n;i++)
	    {
	    	if (e[i].p3==0)
	    	    {
	    	    	x=a[i];y=b[i];
		     	for (j=1;j<=m;j++) h[j]=100000000;
	    	    	for (j=y+1;j<=m;j++) h[j-y]=f[i-1][j];
				 for (j=x+1;j<=2*m;j++)
				     f[i][j]=min(f[i][j],f[i-1][j-x]+1);
				for (j=x+1;j<=2*m;j++)
				     f[i][j]=min(f[i][j],f[i][j-x]+1);
				for (j=m+1;j<=2*m;j++)
				     {
				     f[i][m]=min(f[i][m],f[i][j]);
				     }
				//cout<<f[2][m]<<endl;
				for (j=y+1;j<=m;j++) f[i][j-y]=min(f[i][j-y],h[j-y]);
				}
		else
		     {
		     	xx=e[i].p2+1;yy=e[i].p3-1;
		     	x=a[i];y=b[i];
		     	for (j=xx;j<=yy;j++) h[j]=100000000;
		     	for (j=xx;j<=yy;j++)
		     	    if (j+y<=m) h[j]=f[i-1][j+y];
				for (j=xx;j<=yy;j++)
                      if (j>x)
				    f[i][j]=min(f[i][j],f[i-1][j-x]+1);
				for (j=xx;j<=yy;j++)
				   if ((j-x>=xx)&(j-x<=yy)) 
				       f[i][j]=min(f[i][j],f[i][j-x]+1);
				for (j=xx;j<=yy;j++)
		     	    f[i][j]=min(f[i][j],h[j]);
			 }
		 } 
	ans=100000000;
	for (i=1;i<=m;i++)
	   if (f[n][i]!=100000000)
	       ans=min(ans,f[n][i]);
	if (ans!=100000000)
	    {
	cout<<1<<endl;
	cout<<ans<<endl;
}
else
    {
    	cout<<0<<endl;ans=0;bool flag;
    	for (i=1;i<=n;i++)
    	   if (e[i].p3!=0)
    	     {
    	     	xx=e[i].p2+1;yy=e[i].p3-1;flag=false;
    	     	for (j=xx;j<=yy;j++)
    	     	    if (f[i][j]!=100000000) {
    	     	    	flag=true;break;
					 }
				if (flag) ans++;
				else break;
			 }
		cout<<ans<<endl;
	}
	return 0;
}
2021/3/11 10:45
加载中...