Pro

Luogu3073

Sol

好水的一道题啊……直接二分答案就可以过,不需要并查集的,二分加广搜,时间复杂度是O(n^2 logM),能过的。

读完题,我们很容易的就能知道,答案满足单调性,也就是说,如果mid能够到达一半以上,那么>mid的所有的数都可以达到一半以上,于是就会有一个临界值是达到和达不到之间的,这个值就是我们最终的答案。经分析得,本题满足二分条件,可以二分。二分出来,我们正着做广搜,搜索的路上就能求出最大的联通块,如果最大的联通块比一半要多,右端点移动,反之左端点移动。

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;void read(int &x)
{char c = getchar(); x = 0;while(c < '0' || c > '9') c = getchar();while(c <= '9' && c >= '0') x = x*10+c-48, c = getchar();
}void put(int x)
{  int num = 0; char c[15];while(x) c[++num] = (x%10)+48, x /= 10;while(num) putchar(c[num--]);putchar('\n');
}struct Node {int x , y;Node(){}Node (int xx , int yy) {x = xx , y = yy;}
};
int n , map[505][505] , minn = 1e8 , maxx = -1 , vis[505][505] , K;inline int mymax(int a , int b) { return a>b?a:b; }
inline int mymin(int a , int b) { return a<b?a:b; }
inline int myabs(int a) { return a>0?a:(-a); }
inline int mypow(int a , int b) { if(b == 1) return a; int t = mypow(a , b/2); if(b % 2 == 0) return t*t; return t*t*a; }int bfs(int x , int y , int k) {int res = 1;vis[x][y] = 1;queue<Node>q; q.push(Node(x , y));while(!q.empty()) {Node u = q.front();q.pop();if(u.x-1>=1 && !vis[u.x-1][u.y] && myabs(map[u.x-1][u.y]-map[u.x][u.y])<=k) {vis[u.x-1][u.y] = 1;res++;q.push(Node(u.x-1,u.y));}if(u.x+1<=n && !vis[u.x+1][u.y] && myabs(map[u.x+1][u.y]-map[u.x][u.y])<=k) {vis[u.x+1][u.y] = 1;res++;q.push(Node(u.x+1,u.y));}if(u.y-1>=1 && !vis[u.x][u.y-1] && myabs(map[u.x][u.y-1]-map[u.x][u.y])<=k) {vis[u.x][u.y-1] = 1;res++;q.push(Node(u.x,u.y-1));}if(u.y+1<=n && !vis[u.x][u.y+1] && myabs(map[u.x][u.y+1]-map[u.x][u.y])<=k) {vis[u.x][u.y+1] = 1;res++;q.push(Node(u.x,u.y+1));}}return res;
}int jud(int x) {int ans = 0;for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)if(!vis[i][j])ans = mymax(ans , bfs(i,j,x));if(ans >= K)return 1;return 0;
} int main() {read(n);K = mypow(n , 2) / 2;for(int i=1; i<=n; i++)for(int j=1; j<=n; j++) {read(map[i][j]);minn = mymin(minn , map[i][j]);maxx = mymax(maxx , map[i][j]);     }int l = 0 , r = maxx - minn; while(l <= r) {memset(vis , 0 , sizeof(vis)); int mid = (l+r)>>1;if(jud(mid))r = mid - 1;elsel = mid + 1;} put(l);return 0;
}

[USACO13FEB]Tractor【二分 + BFS】相关推荐

  1. hiho_1139_二分+bfs搜索

    题目 给定N个点和M条边,从点1出发,到达点T.寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值.  题目链接:二分      最小化最大值,考虑采用二分搜索.对所有的边 ...

  2. HDU 5652 India and China Origins(二分 + BFS)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5398867.html 题意: 中国和印度之间有一片地方,把这片地方抽象化,于是就可以看成一个N * M矩阵,其中黑色的代表 ...

  3. 二分+BFS——刺杀大使(洛谷 P1902)

    题目选自洛谷P1902 我们在题面中看到了最大值最小 这五个字. 很容易就想到了二分答案. 同时题目涉及图,以及只能从四个方向,所以想到了BFS的解法 将这两种方法一起使用,就得到了答案! 题目描述 ...

  4. codeforces 553D Nudist Beach 二分+bfs

    題意: 給你n个点,然后让你选出一些点,使得每个点的比率最小值尽量大,让你输出你所选的点. 其中有m个点是不能选的.k条无向边,连接着点与点,保证只有一个连通块). 点x的比率= (点x的邻居,且在你 ...

  5. Codeforces Round #309 (Div. 1)D. Nudist Beach 二分+bfs

    题目:http://codeforces.com/contest/553/problem/D 在一个无向图中,有若干坏点,选择一个不包含坏点的集合,使得集合中p值最小的点的p值最大.一个点的p值=集合 ...

  6. 3、防御迷阵(二分+bfs)

    一队士兵来到了敌军城外,准备进攻敌城.敌人在城外布置一个防御迷阵,要进入城池首先必须通过城池外的防御迷阵. 迷阵由n*m个相同的小房间组成,每个房间与相邻四个房间之间有门可通行.而第1行的m个房间有m ...

  7. 2019长沙学院新生赛(A水,B水,C(整除分块),D水,E(巧数学),F(二分+bfs),H(换根dp),I(线段树)J(dp+倍增+lca))

    A-XOR SUM 通过简单观察得知连续四个数的异或值就是等于0,暴力找出左区间和右区间就可以了,最多跑四个单位 0^1^2^3==0   4^5^6^7=0 #include<bits/std ...

  8. P3073 [USACO13FEB]Tractor S

    知识点:二分,深度优先搜索 难度:4 这个题是最小化的二分,我们把求最优解问题转化为判定问题,那么就是当前拖拉机价钱能否走一半的地图,这里一半的地图就是把地图划分连通块,有没有连通块的个数达到一半,也 ...

  9. codeforces #309 D D. Nudist Beach(浮点数二分+bfs)

    题目链接: 点击打开链接 题目大意: 给出一个连通图选取一个子图,给出不能被选中点,每个点的值为(子图的度数/总度数),求一个最小值最大的子图 题目分析: 很显然这是一个二分图,因为如果存在x能选出子 ...

最新文章

  1. 临平职高计算机专业高职考大学,临平职高高考再传捷报 本科连续四年蝉联杭州市第一...
  2. 又一个智商税产品“路由器防辐射笼”,信号都没了,还能火爆全网...
  3. Oracle 序列和触发器
  4. go中如何使用easyjson_如何在 Go 中编写无 Bug 的 Goroutines?
  5. 强化学习核心文章一百篇
  6. 【Android 修炼手册】Gradle 篇 -- Gradle 源码分析
  7. C++ vector类详解
  8. printf函数源码linux,再来一版简易的printf函数实现
  9. 分享一个在线vim网站
  10. python ctypes 回调函数_如何用Python中的ctypes创建回调函数?
  11. 央视曝光!朋友圈八大骗局正在瞄准你的个人信息 看看你中招没?
  12. JSON 之 SuperObject(8): 关于乱码的几种情况 - 向 Henri Gourvest 大师报告
  13. 红米Note8手机图纸-电路原理图+主板元件位号图
  14. pe修改服务器2003密码,PE修改Windows密码
  15. 2021高考成绩查询怎么查小分,2021微信哪个小程序可以查成绩 高考成绩怎么查
  16. HTML5中制作彩色圆环的代码,HTML5 五彩圆环Loading加载动画实现教程
  17. zabbix Trapper 监控项配置(39)
  18. Liunx学习笔记 - 07 - 02 正则表达式与文件格式化处理
  19. springboot丽江市旅游服务网站的设计与实现.rar(论文+项目源码)
  20. 【推荐架构day5】今日头条算法的基本原理

热门文章

  1. 2016级算法第四次上机-C.AlvinZH的1021实验
  2. 给内联元素设置宽高的几种方式
  3. Linux安装之Linux mint
  4. 可视化理解卷积神经网络 - 反卷积网络 - 没看懂
  5. iOS通知的整理笔记
  6. delphi OleVariant转换RecordSet
  7. 使用RPM安装Mysql5.5找不到配置文件My.cnf
  8. Java RMI远程方法调用学习总结
  9. 简单的路由封装ppp
  10. asp.net应用程序级别跟踪