记录编号 192214 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2014]飞扬的小鸟 最终得分 100
用户昵称 Gravatar0 是否通过 通过
代码语言 C++ 运行时间 0.375 s
提交时间 2015-10-10 06:19:47 内存使用 10.03 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<vector>

#define inf 1000000000
#define MAXN 10010
#define MAXM 1010
#define MAX(a,b) ((a)>(b)?(a):(b))
#define MIN(a,b) ((a)<(b)?(a):(b))

using namespace std;

void read(int & x)
{
	x=0;
	char c=getchar();
	while(c<'!')	c=getchar();
	while(c>'!')	x=x*10+c-'0',c=getchar();
}

int n,m,g,f[2][MAXM],x[MAXN],y[MAXN];
bool flag[MAXN][MAXM],fla[MAXN];

int main()
{
	
	freopen("birda.in","r",stdin);
	freopen("birda.out","w",stdout);
	//memset(f,0x3f,sizeof(f));
	read(n);read(m);read(g);
	for(int i=1;i<=n;i++)
		read(x[i]),read(y[i]);
	for(int i=1;i<=g;i++){
		int a,x,y;
		read(a);read(x);read(y);
		fla[a]=1;
		for(int j=1;j<=x;j++)
			flag[a][j]=1;
		for(int j=y;j<=m;j++)
			flag[a][j]=1;
	}
	for(int i=1;i<=m;i++)
		f[0][i]=0;
	int now=1,last=0,ans=0;
	for(int i=1;i<=n;i++,now^=1,last^=1){
		for(int j=1;j<m;j++){
			f[now][j]=inf;
			if(j-x[i]>0){
				f[now][j]=MIN(f[now][j],f[last][j-x[i]]+1);
				f[now][j]=MIN(f[now][j],f[now][j-x[i]]+1);
			}	
		}
		f[now][m]=inf;
		for(int j=1;j<=m;j++){
			if(j+y[i]<=m)	f[now][j]=MIN(f[now][j],f[last][j+y[i]]);
			int k;
			if(j==m)	k=1;	
			else		k=(m-j-1)/x[i]+1;
			f[now][m]=MIN(f[now][m],f[last][j]+k);
		}
		for(int j=1;j<=m;j++){
			if(flag[i][j]==1)	f[now][j]=inf;
			else {
				if(f[now][j]<inf-10000)	ans=i;
				//printf("%d %d %d %d\n",i,j,f[now][j],ans);
			}
		}
	}
	if(ans==n){
		ans=0x3fffffff;
		for(int i=1;i<=m;i++)
			ans=MIN(ans,f[last][i]);
		printf("1\n%d",ans);
	}else{
		int t=0;
		for(int i=1;i<=ans;i++){
			if(fla[i])
				t++;
		}
		printf("0\n%d",t);
	}
	getchar();getchar();
	return 0;
}