R 的农场 chebnear (二分答案+最近平面点对)
题面



$ solution: $
这道题想到二分答案应该是不难的,因为题目是求平均工资的最小值,这个显然具备单调性:
我们设平均工资的最小值为ans,如果我们现在的平均工资x小于ans那么将x带入题目中必定会出现有两个守卫在吵架,如果我们现在的平均工资x大于等于ans那么将x带入题目中必定不会出现有两个守卫在吵架。
所以我们现在就要想办法知道在确定了平均工资的情况下,如何判断是否有守卫吵架。首先我们看题:如果两个守卫有共同的朋友,那么他们也会成为朋友。这样我们发现可以用并查集维护这个关系,然后通过并查集看两个守卫是否在同一个朋友圈。接下来我们就要知道在所有距离小于k的两个守卫中是否有一对不在同意朋友圈内。
考场上还不知道如何求,于是卡死在这里了,后来知道这就是平面最近点对,我们用这个方法可以求出所有不在同一朋友圈内的两个守卫的最近距离,然后看是不是小于k,是就说明会发生争吵。
$ code: $
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define ll long long
#define db double
#define inf 0x7fffffff
#define rg register int
using namespace std;
struct su{
db x,y;int z;
}a[100005],b[100005];
struct pi{
int t1,t2;db v;
}c[200005];
int n,m;
db k;
int s[100005];
inline int qr(){
char ch;
while((ch=getchar())<'0'||ch>'9');
int res=ch^48;
while((ch=getchar())>='0'&&ch<='9')
res=res*10+(ch^48);
return res;
}
inline bool cmp_x(su x,su y){return x.x<y.x;}
inline bool cmp_y(su x,su y){return x.y<y.y;}
inline bool cmp_v(pi x,pi y){return x.v<y.v;}
inline int get(int x){
if(s[x]==x)return x;
return s[x]=get(s[x]);
}
inline bool check(int l,int r){
if(l>=r)return 1;
int mid=(l+r)>>1;
if(!check(l,mid))return 0;
if(!check(mid+1,r))return 0;
while(a[l].x+k<a[mid].x)l++;
while(a[r].x-k>a[mid].x)r--;
int top=0;
for(rg i=l;i<=r;++i)b[++top]=a[i];
sort(b+1,b+top+1,cmp_y);
for(rg i=1;i<=top;++i)
for(rg j=i+1;j<=top;++j)
if(b[j].y-b[i].y>k) break;
else if(fabs(b[j].x-b[i].x)<=k&&get(b[j].z)!=get(b[i].z))return 0;
return 1;
}
inline bool yu(int x){
for(rg i=1;i<=n;++i)s[i]=i;
for(rg i=1;i<=x;++i)
s[get(c[i].t1)]=get(c[i].t2);
return check(1,n);
}
int main(){
freopen("chebnear.in","r",stdin);
freopen("chebnear.out","w",stdout);
n=qr(),m=qr();scanf("%lf",&k);
for(rg i=1;i<=n;++i)
scanf("%lf%lf",&a[i].x,&a[i].y),a[i].z=i;
sort(a+1,a+n+1,cmp_x);
for(rg i=1;i<=m;++i){
c[i].t1=qr(),c[i].t2=qr();
scanf("%lf",&c[i].v);
}sort(c+1,c+m+1,cmp_v);
int l=0,r=m-1,mid;
while(l<=r){
mid=(l+r)>>1;
if(yu(mid))r=mid-1;
else l=mid+1;
}printf("%.3lf\n",c[l].v);
return 0;
}
R 的农场 chebnear (二分答案+最近平面点对)的更多相关文章
- R的农场 chebnear
评测传送门 Description最近,R 终于获得了一片他梦寐以求的农场,但如此大的一片农场,想要做好防卫工作可不是一件容易的事.所以 R 购买了 N 个守卫,分别让他们站在一定的位置上(守卫不可移 ...
- R的农场
R的农场 题目描述 最近,R 终于获得了一片他梦寐以求的农场,但如此大的一片农场,想要做好防卫工作可不是一件容易的事.所以 R 购买了 N 个守卫,分别让他们站在一定的位置上(守卫不可移动,同一位置上 ...
- BZOJ 1639: [Usaco2007 Mar]Monthly Expense 月度开支( 二分答案 )
直接二分答案然后判断. ----------------------------------------------------------------------------- #include&l ...
- BZOJ 1738: [Usaco2005 mar]Ombrophobic Bovines 发抖的牛( floyd + 二分答案 + 最大流 )
一道水题WA了这么多次真是.... 统考终于完 ( 挂 ) 了...可以好好写题了... 先floyd跑出各个点的最短路 , 然后二分答案 m , 再建图. 每个 farm 拆成一个 cow 点和一个 ...
- 洛谷P2402 奶牛隐藏(网络流,二分答案,Floyd)
洛谷题目传送门 了解网络流和dinic算法请点这里(感谢SYCstudio) 题目 题目背景 这本是一个非常简单的问题,然而奶牛们由于下雨已经非常混乱,无法完成这一计算,于是这个任务就交给了你.(奶牛 ...
- bzoj 1614 Telephone Lines架设电话线 - 二分答案 - 最短路
Description Farmer John打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用. FJ的农场周围分布着N(1 <= N ...
- [USACO07DEC]观光奶牛Sightseeing Cows 二分答案+判断负环
题目描述 Farmer John has decided to reward his cows for their hard work by taking them on a tour of the ...
- CH Round #72树洞[二分答案 DFS&&BFS]
树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...
- [CF752E]Santa Claus and Tangerines(二分答案,dp)
题目链接:http://codeforces.com/contest/752/problem/E 题意:给n个橘子,每个橘子a(i)片,要分给k个人,问每个人最多分多少片.每个橘子每次对半分,偶数的话 ...
随机推荐
- Codeforces Round #545 (Div. 1)
本来开头两道题写得挺快的,然后第三题想了一会儿胡出一个scc计算gcd的做法,写了一发凭借信仰交了上去结果一发pp了?然后第四题沙雕了想了很久才会,于是罚时瞬间变多.结果后面两题都没时间看了,赛后感觉 ...
- BZOJ1774[USACO 2009 Dec Gold 2.Cow Toll Paths]——floyd
题目描述 跟所有人一样,农夫约翰以着宁教我负天下牛,休叫天下牛负我的伟大精神,日日夜夜苦思生 财之道.为了发财,他设置了一系列的规章制度,使得任何一只奶牛在农场中的道路行走,都 要向农夫约翰上交过路费 ...
- BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树
题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1 ],a[i+2]……a[j]中第k小的数是多少(1≤k ...
- CF-Contest339-614
614A-Link/Cut Tree 比较水,注意64位int仍然可能溢出. #include <cstdio> #include <algorithm> #include & ...
- HDU4414-DFS
给一个图,寻找十字交叉的个数,十字交叉应为两个大于3的奇数交叉与正中央.图的大小很小. 使用DFS搜八连块,之后按照规则筛选出符合条件的交叉. 我的筛选规则有点蠢,先将点排序,再通过三段for循环判断 ...
- webapi 405 method not allowed
问题的原因:创建webapi controller时,习惯创建了mvc的controller,而非api controller.导致引用包有问题. 这两天搞webapi开发的时候,遇见了405错误. ...
- (未完成...)Python3网络爬虫(2):利用urllib.urlopen向有道翻译发送数据并获得翻译结果
环境: 火狐浏览器 pycharm2017.3.3 python3.5 1.url不仅可以是一个字符串,例如:http://www.baidu.com.url也可以是一个Request对象,这就需要我 ...
- PHP 判断浏览器语言
详情请参看代码 作用:判断当前的浏览器语言.接收传入参数.拼接字符串 <?php $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2); if ...
- loj#2009.「SCOI2015」小凸玩密室
题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...
- Jenkins中使用Azure Powershell连接Service Fabric报错not recognized的原因与解决办法
一.使用背景 在涉及Azure service Fabric的自动化应用场景中,依赖于Service Fabric的Azure Powershell cmdlets,我们可以使用Jenkins能实现c ...