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. Uploadify_THINKPHP配置说明
  3. 二叉树 —— 中序遍历结点的后继
  4. core sync是什么软件_什么是Quick Sync Video
  5. .net core 文件流保存图片_Java--利用TCP实现文件上传
  6. [PE格式分析] 3.IMAGE_NT_HEADER
  7. Timus1430(裴蜀定理应用)
  8. java给图片坐标描点,记录一下, canvas实现获取图片每个坐标点,以描点方式渲染图片...
  9. ES6_symbol和generator_note
  10. 知识付费与内容付费的区别
  11. mysql安装版与mysql解压版议论
  12. ffmpeg js转换音频_linux下使用ffmpeg将amr转成mp3
  13. Spring源码分析(二):底层架构核心概念解析
  14. 从51信用卡到OAuth2协议
  15. Python数据分析 第一章 数据分析的概述
  16. 北大2019年计算机学院保研名单,北大2019年保研名单出炉!哪所学校成最大赢家?...
  17. Vista SP1 无法建立PPOE连接解决方法
  18. 我的大学专业-信息与计算科学
  19. 电脑城特别加强工具盘【2008年春季版】
  20. 关于深度学习在生物学领域的应用分析Applications of Deep Learning in Biomedicine

热门文章

  1. 浏览器窗口可视区域大小相关方法
  2. Android多媒体开发(3)————使用Android NKD编译havlenapetr-FFMpeg-7c27aa2
  3. Javascript闭包简单理解
  4. iPhone NavigationBar和UIToolbar基础
  5. Java后端避坑——如何使用注解忽略掉JavaBean的属性值
  6. PIE SDK 坐标系创建、定义、对比
  7. c#等待所有子线程执行完毕方法
  8. dom操作节点之常用方法
  9. Yahoo! Screwdriver:可扩展的持续集成工具
  10. 让CubieBoard说话