首页 > 代码库 > 引水入城——重新做一遍,原来真的水

引水入城——重新做一遍,原来真的水

  去年第一次做硬是做了两三天都没过,我也不记得我当时到底是用了什么傻逼做法,总之最后三个点就是超时。今年上半年,大概五个月前又做了一次,最后看了题解。刚因为打了关押罪犯,就重做了一遍这题,总算没有以前那种折磨的感觉了。

技术分享
 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int N=512,ax[]={1,-1,0,0},ay[]={0,0,1,-1}; 5 struct node{int l,r;}; 6 int n,m,cap,res=1,mxv,gr[N][N],f[N]; 7 bool vis[N][N]; 8 node seg[N][N]; 9 void dfs(int x,int y){10     if(vis[x][y])return;11     vis[x][y]=true;12     for(int i=0;i<4;i++){13         int nx=x+ax[i],ny=y+ay[i];14         if(nx>n||nx<1||ny>m||ny<1||gr[nx][ny]>=gr[x][y])continue;15         dfs(nx,ny);16         seg[x][y].l=min(seg[x][y].l,seg[nx][ny].l);17         seg[x][y].r=max(seg[x][y].r,seg[nx][ny].r);18     }19 }20 int main(){21     cin>>n>>m;22     for(int i=1;i<=n;i++)23         for(int j=1;j<=m;j++)24             scanf("%d",&gr[i][j]);25     for(int i=1;i<=n;i++)26         for(int j=1;j<=m;j++)27             if(i!=n)seg[i][j].l=N,seg[i][j].r=0;28             else seg[i][j].l=seg[i][j].r=j;29     for(int i=1;i<=m;i++)dfs(1,i);30     for(int i=1;i<=m;i++)cap+=!vis[n][i];31     if(cap){32         cout<<0<<endl<<cap<<endl;33         return 0;34     }35     for(int i=1;i<=m;i++)36         for(int j=seg[1][i].l;j<=seg[1][i].r;j++)37             if(f[j]>f[seg[1][i].l-1]||!f[j])38                 f[j]=f[seg[1][i].l-1]+1;39     cout<<1<<endl<<f[m]<<endl;40     return 0;41 }
Method_01

  Vijos 109ms 另外,同样代码同样OJ 用iostream 输入是222ms ,scanf 居然快那么多。再其它OJ(其实也就是CodeVS) 上的耗时差距也都足足有一百毫秒,这还只是二十五万的数据啊。

引水入城——重新做一遍,原来真的水