75pts 求助!
查看原帖
75pts 求助!
362239
Cloudmata楼主2021/7/24 15:47

RT 背包思路,细节也判了,可能是背包写的不对...

#include<bits/stdc++.h>
#define cn getchar
#define pt putchar
inline void in(int &x){
	x=0;int f1=1;char ch=cn();
	while(ch<'0'||ch>'9'){if(ch=='-')f1=-1;ch=cn();}
	while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-48;ch=cn();}
	x*=f1;
}
inline void out(int x){
	if(x<0){x=~(x-1);pt('-');}if(x>9)out(x/10);pt(x%10+48);
}
using namespace std;
int n,m,k;
int x[10001],y[10001];
struct line{
	int p,l,h;
}t[10001];
int f[2][1011];
inline bool cmp(const line &a,const line &b){
	return a.p<b.p;
}
int main(){in(n);in(m);in(k);
	for(int i=1;i<=n;i++)in(x[i]),in(y[i]);
	for(int i=1;i<=k;i++)in(t[i].p),in(t[i].l),in(t[i].h);
	sort(t+1,t+1+k,cmp);
	for(int i=1;i<=m;i++)f[0&1][i]=0;int now=1,res=0;
	for(int i=1;i<=n;i++){for(int j=1;j<=m;j++)f[i&1][j]=1e9;
		for(int j=x[i]+1;j<=m;j++)if(f[(i-1)&1][j-x[i]]!=1e9)f[i&1][j]=min(f[i&1][j],f[(i-1)&1][j-x[i]]+1);
		for(int j=x[i]+1;j<=m;j++){
			if(f[i&1][j-x[i]]!=1e9&&f[i&1][j-x[i]]+1<f[i&1][j])f[i&1][j]=f[i&1][j-x[i]]+1;
		}
		for(int j=1;j<=m-y[i];j++)if(f[(i-1)&1][j+y[i]]!=1e9)f[i&1][j]=min(f[i&1][j],f[(i-1)&1][j+y[i]]);
		for(int j=m;j>=m-x[i];j--){
			if(f[(i-1)&1][j]!=1e9&&f[(i-1)&1][j]+1<f[i&1][m])f[i&1][m]=f[(i-1)&1][j]+1;
		}
		if(i==t[now].p&&now<=k){bool bk=false;
			for(int j=t[now].l+1;j<t[now].h;j++){
				if(f[i&1][j]!=1e9){bk=true;++res;break;}
			}
			if(!bk){
				puts("0");out(res);return 0;
			}
			for(int j=1;j<=t[now].l;j++)f[i&1][j]=1e9;
			for(int j=t[now].h;j<=m;j++)f[i&1][j]=1e9;
			now++;
		}bool bk=false;
		for(int j=1;j<=m;j++){
			if(f[i&1][j]!=1e9)bk=true;
		}if(!bk){
			puts("0");out(res);return 0;
		}
//		for(int j=1;j<=m;j++){
//			printf("%d ",f[i&1][j]);
//		}puts("");
	}puts("1");int minn=1e9;
	for(int i=1;i<=m;i++)if(f[n&1][i]!=1e9)minn=min(minn,f[n&1][i]);out(minn);
	return 0;
}
2021/7/24 15:47
加载中...