[51Nod2558] 选址
考虑二分答案 $F$ ,那么现在的问题变成是否对于覆盖并有交集。
考虑边 $(u,v)$ ,若覆盖并在 $(u,v,w)$ 线段中,设点 $i$ 走到 $u$ 号后还能走 $F1$ , 走到 $v$ 还能走 $F2$ ,则现在要求的是一个子问题:求在 $n$ 个 $(0,F1),(w-F2+1,w)$ 中判断是否有交集,若存在点 $x$ 使得 $n$ 个线段都能被覆盖时,$x$ 肯定为 $F1$ 或 $w-F2+1$ ,所以直接暴力枚举即可,时间复杂度 $O(n^4\log 值域)$。
而如何优化时间复杂度,考虑如何快速计算贡献,直接离散化后差分计算即可。
时间复杂度 $O(n^3\log 值域)$。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
using namespace std;
inline int read(){
int f=,ans=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
return f*ans;
}
const int MAXN=;
struct Edge{
int u,v,w;
}x[MAXN*MAXN];
int n,m,dis[MAXN][MAXN];
double f1[MAXN][MAXN*MAXN],f2[MAXN][MAXN*MAXN],l,r,minn=LLONG_MAX,eps=1e-,num[MAXN<<],tmp[MAXN<<];
int M;
int G1[MAXN<<][MAXN<<],G2[MAXN<<][MAXN<<];
int NU[MAXN<<],cnt[MAXN],Cnt;
inline int Q(double res){return lower_bound(tmp+,tmp+M+,res)-tmp;}
inline bool Query(int id,double G){
memset(NU,,sizeof(NU));memset(cnt,,sizeof(cnt));
int Num=;
num[++Num]=;tmp[Num]=num[Num];
num[++Num]=x[id].w;tmp[Num]=num[Num];
for(register int i=;i<=n;i++){
double t1=f1[i][id],t2=x[id].w-f2[i][id];
Cnt++;
if(t1>=) num[++Num]=min(t1,(double)x[id].w),tmp[Num]=num[Num];
if(f2[i][id]>=) num[++Num]=max((double),t2),tmp[Num]=num[Num];
}
sort(tmp+,tmp+Num+);
M=unique(tmp+,tmp+Num+)-tmp-;
for(register int i=;i<=Num;i++) Cnt++,num[i]=lower_bound(tmp+,tmp+M+,num[i])-tmp;
for(register int i=;i<=n;i++){
Cnt++;
double t1=f1[i][id],t2=x[id].w-f2[i][id];
if(t1>=){
int l=,r=Q(min(t1,(double)x[id].w))+;
G1[l][++NU[l]]=i;G2[l][NU[l]]=;
G1[r][++NU[r]]=i;G2[r][NU[r]]=-;
}
if(f2[i][id]>=){
int l=Q(max((double),t2));
G1[l][++NU[l]]=i;G2[l][NU[l]]=;
}
}
int Sum=;
for(register int i=;i<=M;i++){
for(register int j=;j<=NU[i];j++){
Cnt++;
int f=G1[i][j],opt=G2[i][j];
if(opt==){
if(cnt[f]==) Sum++;
cnt[f]++;
}else{
if(cnt[f]==) Sum--;
cnt[f]--;
}
}if(Sum==n) return ;
}return ;
}
inline bool check(double G){
for(register int u=;u<=n;u++){
for(register int i=;i<=m;i++){
f1[u][i]=G-dis[u][x[i].u];
f2[u][i]=G-dis[u][x[i].v];
}
}
for(register int i=;i<=m;i++)
if(Query(i,G)) return ;
return ;
}
int main(){
// freopen("make.in","r",stdin);
n=read(),m=read();
memset(dis,/,sizeof(dis));
for(int i=;i<=m;i++){
int u=read(),v=read(),w=read();
r+=w;
x[i].u=u,x[i].v=v,x[i].w=w;
dis[u][v]=dis[v][u]=w;
}
for(int i=;i<=n;i++) dis[i][i]=;
for(int p=;p<=n;p++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][p]+dis[p][j]);
while(l<=r){
double mid=(l+r)/2.0;
if(check(mid)) minn=min(minn,mid),r=mid-eps;
else l=mid+eps;
}printf("%.9lf\n",minn);
}
[51Nod2558] 选址的更多相关文章
- [NOIP2014] 提高组 洛谷P2038 无线网络发射器选址
题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...
- 基于K2 BPM的大型连锁企业开关店选址管理解决方案
业内有句名言:“门店最重要的是什么?第一是选址,第二是选址,第三还是选址” 选址是一个很复杂的综合性商业决策过程,需要定性考虑和定向分析.K2开关店&选址管理方案重点关注:如何开出更好的店?在 ...
- NOIP2014 无线网络发射器选址
1.无线网络发射器选址 (wireless.cpp/c/pas) [问题描述] 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平 ...
- Codevs 1507 酒厂选址
1507 酒厂选址 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description Abstinence(戒酒)岛的居民们酷爱一种无酒精啤酒 ...
- BZOJ 1835: [ZJOI2010]base 基站选址 [序列DP 线段树]
1835: [ZJOI2010]base 基站选址 题目描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立 ...
- 动态规划(斜率优化):[CEOI2004]锯木厂选址
锯木场选址(CEOI2004) 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运.山脚下有 ...
- Floyd算法应用-医院选址问题
1)问题描述 n个村庄之间的交通图可以用有向网图来表示,图中边<vi, vj>上的权值表示从村庄i到村庄j的道路长度.现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄 ...
- NOIP2014_day2:无线网络发射器选址
#include<stdio.h>//NOIP2014 day2 :无线网络发射器选址 ,max=; ][]; void wifi(int a,int b,int c) { int i,j ...
- 关于NOIP2014“无线网络发射器选址”一题的衍生题目的思考及思维方向
无线网络发射器选址 题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形 ...
随机推荐
- ubuntu16.04 开启FTP服务
配置ftp 1.安装 vsftpd服务器 sudo apt install vsftpd 2.创建一个ftp文件夹 (可以跳过) sudo mkdir /home/ftp 3.新建ftp用户,并指向它 ...
- CSS3——制作正在加载页面loading...
今天做了好多小东西,还挺开心的~ <!DOCTYPE html> <html lang="en"> <head> <meta charse ...
- slick轮播图使用大全
let oSlick = { dom: null, isMobile: false, slickInited: false, barInterval:null, currentSlide:, last ...
- B/S大文件下载+断点续传
1.先将 webuploader-0.1.5.zip 这个文件下载下来:https://github.com/fex-team/webuploader/releases 根据个人的需求放置自己需要的 ...
- POJ 3181 Dollar Dayz ( 完全背包 && 大数高精度 )
题意 : 给出目标金额 N ,问你用面额 1~K 拼成 N 的方案有多少种 分析 : 完全背包的裸题,完全背包在 DP 的过程中实际就是列举不同的装填方案数来获取最值的 故状态转移方程为 dp[i] ...
- 舞蹈课(dancingLessons)
有n个人参加一个舞蹈课.每个人的舞蹈技术由整数ai来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞.如果相差最小的不止一对,那么 ...
- kohana 语言资源国际化、本地化
语言配置开关: root@DESKTOP-I4OIMJC /cygdrive/e/html/tproject/framebota/platform # grep -n2 'I18n::lang' bo ...
- IIS发布mvc网站需操作的内容
VS2010 WEB部署,先在IIS中创建站点,站点创建需注意以下的内容,创建完成后点击[发布]---[WEB部署]--[发布]. 在IIS7下部署MVC已经简化了许多,基本按照一般的项目部署即可,下 ...
- CentOS 6 修改时间和时区及设置修改及时间同步
一.时区 date -R; date ; hwclock --show ; ps -ef|grep ntpd 显示时区 date --help 获取帮助 date -R date +%z 上面两个命令 ...
- 转:SpringMVC常见面试题总结(超详细回答)
原文:https://blog.csdn.net/a745233700/article/details/80963758 我略微修改了下某些地方 1.什么是Spring MVC ?简单介绍下你对sp ...