标签: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 }
Vijos 109ms 另外,同样代码同样OJ 用iostream 输入是222ms ,scanf 居然快那么多。再其它OJ(其实也就是CodeVS) 上的耗时差距也都足足有一百毫秒,这还只是二十五万的数据啊。
标签:vijos dev 技术分享 class min include amp 差距 one
原文地址:http://www.cnblogs.com/duskfire/p/7257664.html