首页 > 其他分享 >syoj.1827. 线段传送带题解

syoj.1827. 线段传送带题解

时间:2023-12-19 18:12:17浏览次数:27  
标签:lf% rx 传送带 题解 db syoj.1827 ly lx dis

前情提要-三分

1827. 线段传送带

P2571 [SCOI2010] 传送带

省流:三分套三分。


在二维平面上有两个传送带,一个从 A 点到 B 点,一个从 C 点到 D 点,速度分别是 p 和 q,在平面内其他点的速度为 r。求 A 点到 D 点的最小速度。

考虑从 A 到 D 的路程一定是 \(AE+EF+FD\),即通过这两个点连接这两个传送带,E 在第一个传送带上,F 同理在第二个。

所以答案求一个 \({(dis(A,E)/p+dis(E,F)/r+dis(F,D)/q)}_{min}\)。 这是个二元函数。

不妨将这个式子拆成两个函数,以确定参数 E,对于 \(f(E)\) 解出一个 F 使得 \((dis(E,F)/r+dis(F,D)/q)min\)。那这个单峰函数可以用三分求最值。

同理,上式外面再套一个求 E 的式子,解出一个 E 使得 \((dis(A,E)/p+f(E))min\)。这个单峰函数也可以用三分求解。

于是三分套三分。

#include<bits/stdc++.h>
#define db double
using namespace std;
const db eps=1e-6;
db ax,ay,bx,by,cx,cy,dx,dy,p,q,r;
db dis(db x,db y,db xx,db yy){
	return sqrt((yy-y)*(yy-y)+(xx-x)*(xx-x));
}
db f3(db x,db y,db xx,db yy){//E & F 
	return dis(x,y,xx,yy)/r+dis(xx,yy,dx,dy)/q;
}
db f2(db ex,db ey){//F
	db lx=cx,ly=cy,rx=dx,ry=dy;//CD
	while(dis(lx,ly,rx,ry)>eps){
		db x=(rx-lx)/3.0,y=(ry-ly)/3.0;
		db lmidx=lx+x,lmidy=ly+y,rmidx=rx-x,rmidy=ry-y;
		db ans1=f3(ex,ey,lmidx,lmidy);
		db ans2=f3(ex,ey,rmidx,rmidy);
		if(ans2-ans1>eps) rx=rmidx,ry=rmidy;
		else lx=lmidx,ly=lmidy;
	}
	return f3(ex,ey,lx,ly);
}
db f1(){//E
	db lx=ax,ly=ay,rx=bx,ry=by;
	while(dis(lx,ly,rx,ry)>eps){//AB
		db x=(rx-lx)/3.0,y=(ry-ly)/3.0;
		db lmidx=lx+x,lmidy=ly+y,rmidx=rx-x,rmidy=ry-y;
		db ans1=f2(lmidx,lmidy)+dis(ax,ay,lmidx,lmidy)/p;
		db ans2=f2(rmidx,rmidy)+dis(ax,ay,rmidx,rmidy)/p;
		if(ans2-ans1>eps) rx=rmidx,ry=rmidy;
		else lx=lmidx,ly=lmidy;
	}
	return f2(lx,ly)+dis(ax,ay,lx,ly)/p;
}
int main(){
	scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy,&p,&q,&r);
	printf("%.2lf",f1());
	return 0;
}

标签:lf%,rx,传送带,题解,db,syoj.1827,ly,lx,dis
From: https://www.cnblogs.com/Moyyer-suiy/p/17914384.html

相关文章

  • CF1733D1 题解
    原题传送门题目大意给定两个长度为\(n\)的二进制字符串\(a\)和\(b\),你可以进行若干次操作,对于每次操作:选两个数\(l\)和\(r\),且\(l<r\),将\(a_l\)和\(a_r\)交换。如果选取的\(l\)和\(r\)相邻,代价为\(x\),否则为\(y\)。保证\(y≤x\),求出最小代价使得\(a=......
  • CF1191B 题解
    原题传送门题目大意\(3\)块麻将,求需要换掉几张牌才能一次出完\(3\)块麻将。每块麻将,用一个长度为\(2\)的字符串给出,字符串由\((1,9)\)的一位数字和\(m\)、\(s\)或\(p\)组成。\(3\)块一模一样的麻将或第\(2\)位相同,前面是连号的\(3\)块麻将都可以一次性出完。......
  • CF175B 题解
    原题传送门题目大意如题目描述。思路分析\(1≤n≤1000\),很明显\(\mathcal{O(n^2)}\)不超时,使用结构体,暴力即可。利用双循环求出名字相同的结构体并判断最高分,再根据字典序排序,再双循环求出比自己优秀人数,输出即可。代码:/*Writtenbysmx*/#include<bits/stdc++.h>usin......
  • Atcoder ABC 333 题解(A - F)
    ABC不讲D待更E待更F设$f(i,j)$为有$i$个人时,第$j$个人活到最后的概率,显然:\[f(i,j)=\begin{cases}1,&i=1,j=1\\\frac{1}{2}f(i,i),&i\neq1,j=1\\\frac{1}{2}f(i,j-1)+\frac{1}{2}f(i-1,j-1),&i\neq1,2\lej......
  • Queries for the Array 题解
    前言这场CF是我赛后打的,vp赛时没做出来,后来发现是有个地方理解错了,有一些细节没有考虑到。现在换了一种思路来写,感觉更清晰了。做法首先需要动态维护三个变量,\(cnt\)和\(finishsort\)和\(unfinishsort\)。这三个变量分别表示当前数字的个数,已经排好序的最后一个位置,和没......
  • poker 题解
    原题链接:poker赛时只有\(40\)分,改完之后感觉是一道好题,于是就来写篇题解。题意有\(k\)张扑克牌,\(n\)种数字,每张牌都有两面,每一面分别写了一个数字,你可以选择打出这张牌的任意一面,但是不能两面同时打,也可以选择不打这张牌。有\(q\)个询问,每个询问给定\(l\)和\(r\),判断......
  • P3694 邦邦的大合唱站队 题解
    原题链接:P3694思路状态设计因为这道题\(m\)的范围非常小,所以可以用\(m\)来作为状态。设\(dp_{i}\)表示\(m\)支队伍的状态为\(i\)时最少让多少偶像出列。预处理在转移之前,我们先要预处理出序列的前缀和\(sum_{i,j}\)表示第\(i\)个数之前有多少个值为\(j\)......
  • [AGC054C] Roughly Sorted 题解
    题意定义一种操作为交换\(a_{i}\)和\(a_{i-1}\)。对于一个长度为\(n\)的排列,你需要操作若干次,使这个序列变合法,一个序列合法指:满足对于每一个\(1\lei\len\),都满足包含\(a_i\)的逆序对的个数不超过\(k\),并且要求最小化操作次数。现在给定一个操作后的序列,询问原序列可......
  • P2391 白雪皑皑 题解
    原题链接:P2391。并查集好题。首先我们知道,并查集在一个无向图中可以维护两点之间的连通性,判断条件为:\(find(u)==find(v)\)。而对于这道题来说,我们可以用并查集来维护一个序列区间的重叠性或者说区间的连通性。因为题目上说了后面的操作会覆盖前面的操作,所以我们可以考虑倒序进行......
  • [ABC239Ex] Dice Product 2 题解
    原题链接:ABC239Ex。题意不多赘述。看到求期望值,我们想到可以用期望DP。设\(dp_{i}\)表示最终结果大于等于\(i\)时的操作次数的期望值。那么我们可以得到一个基本的状态转移方程:\(dp_{i}=\frac{1}{n}\times\sum_{j=1}^{n}dp_{\left\lceil\frac{i}{j}\right\rceil}+......