【NOIP 模拟题】刺杀大使(二分答案+并查集)

原创 2016年08月28日 16:59:22

                                                        

                                           

                                                         


【题解】【二分答案】

【看到最大值最小,那必然二分答案啊,考试时不知脑子干什么去了。。。】

【先找出整个矩阵中的最大值,作为二分的右边界,然后,二分答案,把符合条件的相邻的格用并查集并到一个集合中,当用小于等于当前值的格可以把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;
 } 


版权声明:本文为博主原创文章,转载请注明出处:http://blog.csdn.net/reverie_mjp

洛谷 p1993 小K的农场(差分约束系统)

题目描述小 K 在 Minecraft 里面建立很多很多的农场,总共 n 个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共 m 个),以下列三种形式描述:农场 a 比...

NOIP提高组历年试题狂做

看着还有半个月就NOIP了,然而历年的NOIP题还很少做,赶紧补一补啊。在网络上找到历年NOIP的全套题+评测真的不容易呀,强烈推荐Vijos!因为我比较懒,就不贴代码了,主要讲一下做法。...

NOIP模拟题 by天津南开中学 莫凡[tarjan][树剖][并查集]

考试总结: 解题报告: 一. 图的连通性: 题意:给定一图,动态删边,动态求是否连通,且查询中输入的变量需xor当前边数才为最终输入数据; 分析:只删边则可以逆向建边用并查集查询是否连通,并...

NOIP模拟题 2016.11.18 [数论] [计数] [并查集]

第一题:信(believe.cpp/c/pas) 背景描述: 一切死亡都有冗长的回声 —— 《一切》北岛 给定一个N个元素的序列A, 定义Bi = (Ai and A1) + (Ai and...

NOIP模拟题 2016.10.31 [DP] [搜索] [并查集]

**NOIP模拟赛 【题目** 【问题描述】 Mushroom手中有n个数排成一排,现在Mushroom想取一个连续的子序列,使得这个子序列满足:最多只改变一个数,使得这个连续的子序列是严格上升...

NOIP模拟题[递推][并查集][DP]

不能换考试策略。 数组大的那一维定义在前面可以减小常数(我用的时候有4倍)。T1: 题意: 求一个数列在可以修改一个数的情况下最长连续上升子序列。 分析: 用第二维标记一下改没改过,乱搞一下...

[NOIP模拟题][位运算][建模][并查集]

T1 第一题:信(believe.cpp/c/pas) 背景描述: 一切死亡都有冗长的回声 —— 《一切》北岛 给定一个N个元素的序列A, 定义Bi = (Ai an...

NOIP模拟题 2016.11.9 [动态规划] [数论] [二分答案] [启发式合并] [线段树] [树链剖分]

子序列 描述 给定3 个字符串,求它们的最长公共子序列。 输入 第一行一个整数n,表示三个字符串的长度 接下来三行,每行是一个长度为n 只包含小写字母的字符串。 输出 输出最长公共子序列...

NOIP模拟题 2016.10.5 [Trie] [数学] [二分答案] [杂题] [复杂状态DP]

T1: 题意:求序列中两两取& | ^的最大值。。这道题相当于三道题。。XOR就是Trie树上贪心即可,注意一开始不可以加入0这个串,并且插入a[1]后从i=2开始匹配。 另外,匹配的时候两种写法...

【模拟题】【集训系列1】【dp】【并查集】一套神奇的题

T1: Mushroom的序列 【问题描述】 Mushroom手中有n个数排成一排,现在Mushroom想取一个连续的子序列,使得这个子序列满足:最多只改变一个数,使得这个连续的子序列...
  • Sue2333
  • Sue2333
  • 2016年10月31日 20:16
  • 265
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【NOIP 模拟题】刺杀大使(二分答案+并查集)
举报原因:
原因补充:

(最多只允许输入30个字)