【NOIP 模拟题】刺杀大使(二分答案+并查集)
2016-08-28 16:59
295 查看
【题解】【二分答案】
【看到最大值最小,那必然二分答案啊,考试时不知脑子干什么去了。。。】
【先找出整个矩阵中的最大值,作为二分的右边界,然后,二分答案,把符合条件的相邻的格用并查集并到一个集合中,当用小于等于当前值的格可以把1和n*m联通时,当前值合法】
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,a[1010][1010],ans,maxn; int f[1000010]; int find(int x) { if(f[x]==x) return f[x]; f[x]=find(f[x]); return f[x]; } inline void link(int x,int y) { int f1=find(x),f2=find(y); f[f1]=f2; } inline bool check(int t) { for(int i=1;i<=n*m;++i) f[i]=i; for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) if(a[i][j]<=t) { int now=(i-1)*m+j; if(i+1<=n&&a[i+1][j]<=t) link(now,i*m+j); if(j+1<=m&&a[i][j+1]<=t) link(now,now+1); } if(find(1)==find(n*m)) return 1; return 0; } inline void qsort(int l,int r) { int mid; while(l<=r) { mid=(l+r)>>1; if(check(mid)) r=mid-1,ans=mid; else l=mid+1; } } int main() { freopen("murder.in","r",stdin); freopen("murder.out","w",stdout); int i,j; scanf("%d%d",&n,&m); for(i=1;i<=n;++i) for(j=1;j<=m;++j) scanf("%d",&a[i][j]),maxn=max(a[i][j],maxn); qsort(0,maxn); printf("%d\n",ans); return 0; }
相关文章推荐
- NOIP模拟题 2016.10.18 [二分答案] [从上到下的树形DP] [链表翻转]
- 【NOIP 模拟题】[T2] 王者荣耀(二分答案+dp)
- 刺杀大使{二分答案+dfs+人工栈}
- 洛谷P1902 刺杀大使(二分答案+bfs验证)
- [NOIP2010][并查集][二分答案]关押罪犯
- P1902 刺杀大使(BFS+二分答案)
- NOIP模拟题 2016.10.5 [Trie] [数学] [二分答案] [杂题] [复杂状态DP]
- NOIP模拟题 2016.11.9 [动态规划] [数论] [二分答案] [启发式合并] [线段树] [树链剖分]
- 【noip模拟题】[dp][二分][树链剖分][hdu5029][线段树]
- 洛谷P1991无线通讯网[kruskal | 二分答案 并查集]
- noip推荐系列:遥控车[字符串+高精+二分答案]
- 【NOIP 2015】跳石头 二分答案
- 【BZOJ4326】【二分答案】【树上差分】NOIP2015 D2T3 运输计划 题解
- NOIP模拟赛 军训(二分答案+单调队列优化DP)
- 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx
- 【noip2010】codevs 1069 关押罪犯(二分+BFS染色||并查集)
- bzoj 4326: NOIP2015 运输计划 (二分答案+树链剖分+树状数组)
- 【NOIP2015】【bzoj4326】运输计划 LCA+差分+二分答案
- [BZOJ4326][NOIP2015]运输计划(二分答案+树上差分)
- NOIP模拟题 2016.10.31 [DP] [搜索] [并查集]