记录编号 141303 评测结果 AAAAAAAAAA
题目名称 [NOIP 2010]引水入城 最终得分 100
用户昵称 Gravatar席一鸣 是否通过 通过
代码语言 C++ 运行时间 0.260 s
提交时间 2014-11-30 17:10:56 内存使用 1.52 MiB
显示代码纯文本
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
bool l[501][501],w[501];
int e[501][501],f[501],m,n;
class s
{
	public:
		int l,r;
		s()
		{
			l=0x7fffffff;
			r=0;
		}
}a[501];
bool operator<(s a,s b)
{
	return a.r<b.r;
}
void o(int s,int x,int y)
{
	int h;
	if(x==n)
	{
		w[y]=1;
		a[s].l=min(a[s].l,y);
		a[s].r=max(a[s].r,y);
	}
	l[x][y]=1;
	h=e[x][y];
	if(x<n&&e[x+1][y]<h&&!l[x+1][y])
		o(s,x+1,y);
	if(x>1&&e[x-1][y]<h&&!l[x-1][y])
		o(s,x-1,y);
	if(y<m&&e[x][y+1]<h&&!l[x][y+1])
		o(s,x,y+1);
	if(y>1&&e[x][y-1]<h&&!l[x][y-1])
		o(s,x,y-1);
}
main()
{
	freopen("flow.in","r",stdin);
	freopen("flow.out","w",stdout);
	int i,j,x=0,t=1;
	cin>>n>>m;
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
			cin>>e[i][j];
	for(i=1;i<=m;i++)
	{
		if(i>1&&e[1][i]<e[1][i-1])
			continue;
		if(i<m&&e[1][i]<e[1][i+1])
			continue;
		memset(l,0,sizeof(l));
		o(i,1,i);
	}
	for(i=1;i<=m;i++)
		if(w[i])
			x++;
	if(x<m)
	{
		cout<<"0\n"<<m-x;
		return 0;
	}
	sort(a+1,a+1+m);
	for(i=1;i<=m;i++)
		f[i]=0x7fffffff/2;
	for(i=1;i<=m;i++)
	{
		if(i<a[t].r)
			continue;
		while(t<=m&&i>a[t].r)
			t++;
		while(i==a[t].r)
			f[i]=min(f[i],f[a[t++].l-1]+1);
		for(j=1;j<i;j++)
			f[j]=min(f[j],f[i]);
	}
	cout<<"1\n"<<f[m];
}