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个人,问每个人最多分多少片.每个橘子每次对半分,偶数的话 ...
随机推荐
- LoadRunner12 Java Vuser API语法举例
// 检查点 web.reg_find("Text=\"retCode\":\"0000\"",new String[]{"FAI ...
- Nginx PREACCESS阶段 如何限制每个客户端的并发连接数
L:55 nginx.conf配置文件列子 limit_conn_zone $binary_remote_addr zone=addr:10m; #这里根据用户IP地址作为key做限制 并且名称为ad ...
- android studio marvin 配置
buildscript { repositories { maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'} } } ...
- BZOJ4408&4299[Fjoi 2016]神秘数——主席树
题目描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = 4+1 6 = ...
- BZOJ5317 JSOI2018部落战争(凸包)
即询问凸包是否有交.这显然可以直接求半平面交,但是复杂度O(q(n+m)),且没有什么优化空间. 更直接地表示,即相当于询问是否存在点a∈A,b∈B,使得a+d=b.移项,得到d=b-a.可以发现等式 ...
- BZOJ4942 NOI2017整数(线段树)
首先把每32位压成一个unsigned int(当然只要压起来能过就行).如果不考虑进/退位的话,每次只要将加/减上去的数拆成两部分直接单点修改就好了.那么考虑如何维护进/退位.可以发现进位的过程其实 ...
- ajax跨域,携带cookie
解决方案很简单. 直接上代码: web.xml中: 添加了 cors来解决跨域 (奇怪的是,credentials设置为false.反正这个是照搬的...) <filter> ...
- Dumb Bones UVA - 10529(概率dp)
题意: 你试图把一些多米诺骨牌排成直线,然后推倒它们.但是如果你在放骨牌的时候不小心把刚放的骨牌碰倒了,它就会把相临的一串骨牌全都碰倒, 而你的工作也被部分的破坏了. 比如你已经把骨牌摆成了DD__D ...
- 【刷题】BZOJ 1132 [POI2008]Tro
Description 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Input 第一行给出数字N,N在[3,3000] 下面N行给出N个点的坐标,其值在[0,10 ...
- 自学Aruba2.2-Aruba Web UI --Monitoring面板介绍
点击返回:自学Aruba之路 自学Aruba2.2-Aruba Web UI --Monitoring面板介绍 1. Monitoring面板-NETWORK Network Summary ...