记录编号 431470 评测结果 AAAAAAAAAA
题目名称 [NOIP 2010]引水入城 最终得分 100
用户昵称 GravatarHzoi_QTY 是否通过 通过
代码语言 C++ 运行时间 0.096 s
提交时间 2017-07-31 20:13:05 内存使用 2.10 MiB
显示代码纯文本
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,a[505][505],tot=0,vis[505],v[505],ans=0,sum,hh[250005];
struct city
{
     int to[5];
} ci[250002];
struct hhh
{
    int l,r,sum;
    hhh()
    {l=1000;}
} tx[505];
int min(int a,int b){return a<b? a:b;}
void Dfs(int x,int root)
{
     hh[x]=1;
     if(x<=m*n&&x>m*(n-1))
      {
         int k=x%m;
         if(k==0)k=m;
         tx[root].l=min(tx[root].l,k);
         tx[root].r=max(tx[root].r,k);
         tx[root].sum++;
         v[k]=1;
      }
     for(int i=1;i<=ci[x].to[0];i++)
     {
          int k=ci[x].to[i];
          if(!hh[k])
          {
              Dfs(k,root);
          }
     }
}
void dfs(int x,int len,int s)
{
    if(len==m){sum=min(sum,s);return;}
    for(int i=x+1;i<=m;i++)
    {
         if(tx[i].l<=len+1&&tx[i].r>len)
            dfs(i,tx[i].r,s+1);
         if(tx[i].l>len+1)break;
    }
}
int cmp(const hhh &a,const hhh &b)
{
    if(a.l==b.l)return a.r>b.r;
    return a.l<b.l;
}
int yjn()
{
   freopen("flow.in","r",stdin);
   freopen("flow.out","w",stdout);
   scanf("%d%d",&n,&m);
   for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
         scanf("%d",&a[i][j]);
   tot=0;
   for(int i=1;i<=n;i++)
      for(int j=1;j<=m;j++)
      {
          tot++;
          if(i!=1&&a[i][j]>a[i-1][j])ci[tot].to[0]++,ci[tot].to[ci[tot].to[0]]=tot-m;
          if(i!=n&&a[i][j]>a[i+1][j])ci[tot].to[0]++,ci[tot].to[ci[tot].to[0]]=tot+m;
          if(j!=1&&a[i][j]>a[i][j-1])ci[tot].to[0]++,ci[tot].to[ci[tot].to[0]]=tot-1;
          if(j!=m&&a[i][j]>a[i][j+1])ci[tot].to[0]++,ci[tot].to[ci[tot].to[0]]=tot+1;
      }
   for(int i=1;i<=m;i++)
      if(a[1][i]>=a[1][i-1]&&a[1][i]>=a[1][i+1])
      {
          Dfs(i,i);
          memset(hh,0,sizeof(hh));
      }
  /* for(int i=0;i<m;i++)
       cout<<v[i]<<" ";*/
   for(int i=1;i<=m;i++)
      if(v[i])
        sum++;
   if(sum!=m)
   {printf("0\n%d",m-sum);exit(0);}
   sort(tx+1,tx+m+1,cmp);
   sum=0;
 /*  for(int i=1;i<=m;i++)
   {
       cout<<tx[i].l<<" "<<tx[i].r<<endl;
   }*/
   int l=1,k=1;
   while(sum<m)
   {
        ans++;
        k=sum;
        for(int i=l;i<=m;i++)
        {
            if(tx[i].l<=sum+1&&tx[i].r>k)
            {k=tx[i].r,l=i;}
        }
        sum=k;
   }
   printf("1\n%d",ans);
   //while(1);
}
int qty=yjn();
int main(){;}