[USACO13FEB]Tractor【二分 + BFS】
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】相关推荐
- hiho_1139_二分+bfs搜索
题目 给定N个点和M条边,从点1出发,到达点T.寻找路径上边的个数小于等于K的路径,求出所有满足条件的路径中最长边长度的最小值. 题目链接:二分 最小化最大值,考虑采用二分搜索.对所有的边 ...
- HDU 5652 India and China Origins(二分 + BFS)
本文链接:http://www.cnblogs.com/Ash-ly/p/5398867.html 题意: 中国和印度之间有一片地方,把这片地方抽象化,于是就可以看成一个N * M矩阵,其中黑色的代表 ...
- 二分+BFS——刺杀大使(洛谷 P1902)
题目选自洛谷P1902 我们在题面中看到了最大值最小 这五个字. 很容易就想到了二分答案. 同时题目涉及图,以及只能从四个方向,所以想到了BFS的解法 将这两种方法一起使用,就得到了答案! 题目描述 ...
- codeforces 553D Nudist Beach 二分+bfs
題意: 給你n个点,然后让你选出一些点,使得每个点的比率最小值尽量大,让你输出你所选的点. 其中有m个点是不能选的.k条无向边,连接着点与点,保证只有一个连通块). 点x的比率= (点x的邻居,且在你 ...
- Codeforces Round #309 (Div. 1)D. Nudist Beach 二分+bfs
题目:http://codeforces.com/contest/553/problem/D 在一个无向图中,有若干坏点,选择一个不包含坏点的集合,使得集合中p值最小的点的p值最大.一个点的p值=集合 ...
- 3、防御迷阵(二分+bfs)
一队士兵来到了敌军城外,准备进攻敌城.敌人在城外布置一个防御迷阵,要进入城池首先必须通过城池外的防御迷阵. 迷阵由n*m个相同的小房间组成,每个房间与相邻四个房间之间有门可通行.而第1行的m个房间有m ...
- 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 ...
- P3073 [USACO13FEB]Tractor S
知识点:二分,深度优先搜索 难度:4 这个题是最小化的二分,我们把求最优解问题转化为判定问题,那么就是当前拖拉机价钱能否走一半的地图,这里一半的地图就是把地图划分连通块,有没有连通块的个数达到一半,也 ...
- codeforces #309 D D. Nudist Beach(浮点数二分+bfs)
题目链接: 点击打开链接 题目大意: 给出一个连通图选取一个子图,给出不能被选中点,每个点的值为(子图的度数/总度数),求一个最小值最大的子图 题目分析: 很显然这是一个二分图,因为如果存在x能选出子 ...
最新文章
- 基于SSM实现宠物商城系统
- 如何应对一直变化的搜索引擎算法?
- golang常用技巧
- 云原生系列「三」容器网络
- 11_CollapsingMergeTree,(State行和Cancel行匹配示例),聚合查询,Cancel状态行取反的聚合查询
- 新一代需求管理工具Trufun Bacon X正式发布!
- 数据库高级知识——MySql锁机制
- 服务器虚拟化 需求,虚拟化的优势与需求分析
- Linux20180502 六周第四次课(5月2日)
- 谁需要这件礼物?每一个爱学习的人!
- 【Java从0到架构师】基本概念 + 环境搭建
- Sikuli -- 创新的图形化编程技术
- Wannafly挑战赛28: B. msc和mcc(思维)
- 章节十五、6-log4 2-用默认的配置
- OpenWRT上如何让 ss 设置指定域名dst bypass
- PROSOFT模块MVI56E-MNETC、MVI56-PDPMV1、PTQ-PDPMV1、AN-X2-AB-DHRIO、MVI56-MBP、MVI56-MNETR、MVI56-MNET
- 我的数据分析师转型之路,从零到阿里数据分析师
- 2019年税务师进行继续教育?
- Python OpenCV:利用滚动条移动图片,利用鼠标缩放图片
- 解决:HotSeat短信图标提醒有误