码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-07-29 23:22:03      阅读:362      评论:0      收藏:0      [点我收藏+]

标签:vijos   dev   技术分享   class   min   include   amp   差距   one   

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

技术分享
 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) 上的耗时差距也都足足有一百毫秒,这还只是二十五万的数据啊。

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

标签:vijos   dev   技术分享   class   min   include   amp   差距   one   

原文地址:http://www.cnblogs.com/duskfire/p/7257664.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!