/*
向量运算不会呐
抄了一个长度几百行的模板 一直过不了编译 醉了
还是抄了大佬的代码 首先把所有的线段投影到 导轨上 然后用set 分上和下分别维护一下 距离导轨最近的线段 是能够照射到的 可以证明 我们的最优答案有一端肯定是在线段的分界点上的 所以我们可以用扫描线思想
从一端扫到另一端 端点为各个分界点 这样正这反着处理两遍即可 long double 怎么输出啊 在线等挺急的
*/ #include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<set>
#define sqr(x) (x) * (x)
#define ld long double
#define ll long long
#define M 20010
using namespace std; int read() {
int nm = , f = ;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -;
for(; isdigit(c); c =getchar() ) nm = nm * + c - '';
return nm * f;
}
const ld eps = 1e-, zz = ;
ld x[M][], y[M][], len[M] ,ver[M], z[M], x0;
int p[M] , n,m; bool cmp(int a, int b) {
return (a > ? x[a][] : x[-a][]) < (b > ? x[b][]: x[-b][]);
} struct L {
int t;
bool operator <( const L &b) const {
ld w1 = (y[t][] - y[t][]) / (x[t][] - x[t][]) * (x0 - x[t][])+y[t][];
ld w2 = (y[b.t][] - y[b.t][]) / (x[b.t][] - x[b.t][]) * (x0 - x[b.t][]) + y[b.t][];
return fabs(w1) < fabs(w2);
}
};
set<L>up, down;
int main() {
int t = read();
while(t--) {
n = read();
for(int i = ; i <= n; i++) {
x[i][] = read(), y[i][] = read(), x[i][] = read(), y[i][] = read();
len[i] = sqrt(sqr(x[i][] - x[i][]) + sqr(y[i][] - y[i][]));
}
ld xn0 = read(), yn0 = read(), xn1 = read(), yn1 = read(), lenx = read();
if(xn0 > xn1) swap(xn0, xn1), swap(yn0, yn1);
ld dx = xn1 - xn0, dy = yn1 - yn0, le = sqrt(sqr(dx) + sqr(dy)),Sin = dy / le, Cos = dx / le;
for(int i = ; i <= n; i++) {
x[i][] -= xn0, x[i][] -= xn0, y[i][] -= yn0, y[i][] -= yn0;
ld a,b,c,d;
a = x[i][] * Cos + y[i][] * Sin;
b = x[i][] * Sin - y[i][] * Cos;
c = x[i][] * Cos + y[i][] * Sin;
d = x[i][] * Sin - y[i][] * Cos;
x[i][] = a, y[i][] = -b, x[i][] = c, y[i][] = -d;
}
for(int i = ; i <= n; i++) {
if(x[i][] > x[i][]) swap(x[i][], x[i][]), swap(y[i][], y[i][]);
len[i] = len[i] /(x[i][] - x[i][]);
}
m = ;
for(int i = ; i <= n; i++) p[++m] = i, p[++m] = -i;
sort(p + , p + m + , cmp);
for(int i = ; i <= m ; i++) ver[i] = ;
for(int i = , a; i <= m; i++) {
if(p[i] > ) {
a = p[i], z[i] = x0 = x[a][];
if(y[a][] > ) up.insert((L){a});
else down.insert((L){a});
}
else{
a = -p[i], z[i] = x0 = x[a][];
if(y[a][] > ) up.erase((L){a});
else down.erase((L){a});
}
if(!up.empty()) ver[i] += len[(*up.begin()).t];
if(!down.empty()) ver[i] += len[(*down.begin()).t];
}
ld ans = , sum = ; z[m + ] = 1e16;
for(int i = , l = ; i <= m; i++){
sum += (z[i] - z[i - ]) * ver[i - ];
while(z[i] - z[l + ] > lenx) l++, sum -= (z[l] - z[l - ]) * ver[l - ];
ans = max(ans, sum - max(zz, (z[i] - z[l] - lenx) * ver[l]));
}
sum = ;
for(int i = m, r = m; i >= ; i--)
{
sum += (z[i + ] - z[i]) * ver[i];
while(z[r - ] - z[i] > lenx) --r, sum -= (z[r + ] - z[r]) * ver[r];
ans = max(ans, sum - max(zz, (z[r] - z[i] - lenx) * ver[r - ]));
}
//cout << ans << "\n";
double as = ans;
printf("%.15lf\n", as);
}
return ;
}

SDOI2018物理实验的更多相关文章

  1. [SDOI2018]物理实验 set,扫描线,旋转坐标系

    [SDOI2018]物理实验 set,扫描线,旋转坐标系 链接 loj 思路 先将导轨移到原点,然后旋转坐标系,参考博客. 然后分线段,每段的贡献(三角函数值)求出来,用自己喜欢的平衡树,我选set. ...

  2. bzoj5328: [Sdoi2018]物理实验

    果然我还是太菜了,爆了一天才过....隔壁肉丝都不知道喊了多少句哎╮(╯▽╰)╭我又A了什么傻逼题(然鹅就是wf和国集的题QWQ) 其实这个题就是个裸题,但是我就是不会... 这个题第一步就是明显的旋 ...

  3. 「SDOI2018」物理实验

    题目大意: 这题不好描述,直接看原题吧…… 题解: 很无脑的题……就是卡精度+难写.代码能力还是太差了. 其实可以直接用long double肝过去.但我的代码似乎太丑了,以至于跑得奇慢无比. 代码: ...

  4. [JZOJ 5885] [NOIP2018模拟9.27] 物理实验 解题报告 (思维)

    题目链接: https://jzoj.net/senior/#main/show/5885 题目: 题解: 把$a$数组按升序排序 我们可以枚举$x$,发现对于任意$x$,最优情况下$y$一定等于$x ...

  5. 【大学物理实验】01 单摆测重力加速度 的 g 计算代码

    单摆测重力加速度 传统摆 (代码没保存,就截了个图) 研究单摆周期与摆长之间的关系 (依旧是g的计算) 我还不太会数据拟合

  6. SDOI2018

    SD的题有点反人类啊... d1t1[SDOI2018]物理实验 感觉比较好想但不太好写,写了一半弃了 d1t2[SDOI2018]战略游戏 建出圆方树,每次建虚树,答案就是虚树上的原点个数减去询问的 ...

  7. 【转】AB实验设计思路及实验落地

    这篇文章会讨论: 在什么情况下需要做 AB 实验 从产品/交互角度,如何设计一个实验 前端工程师如何打点 如何统计数据,并保证数据准确可信 如何分析实验数据,有哪些数据需要重点关注 附:如何搭建前端实 ...

  8. 计组CPU设计实验关键材料和关键设计

    我记得这是2016春季学期搞得,参考和学习了很多别人的东西,这里小小的总结一下,逻辑性还不是太强,还需要好好整理 首先是指令集 CPU架构 外部接线架构 指令格式 机器状态自动机 这部分忘了,汗 这部 ...

  9. PBR(基于物理的渲染)学习笔记2

    相关资料 https://www.cnblogs.com/dojo-lzz/p/13237686.html 文档:PBR学习笔记.note 链接:http://note.youdao.com/note ...

随机推荐

  1. SQL Server 2005无法远程连接的解决方法 (转帖)

    方法如下:  一.为 SQL Server 2005 启用远程连接1. 单击"开始",依次选择"程序"."Microsoft SQL Server 2 ...

  2. 阅读<All Digital VCXO Replacement for Gigabit Transceiver Applications>笔记---XAPP589

    阅读<All Digital VCXO Replacement for Gigabit Transceiver Applications>笔记---XAPP589 1. 2. 外部设备能为 ...

  3. 阅读<AXI4-Stream Infrastructure IP Suite v2.2>笔记

    阅读<AXI4-Stream Infrastructure IP Suite v2.2>笔记 为了配合tpg和video_out IP核的使用,我们需要使用此组件中的AXI4-stream ...

  4. 转:区块链开发(一)搭建基于以太坊go-ethereum的私有链环境

    区块链开发(一)搭建基于以太坊go-ethereum的私有链环境 wo541075754 · 2016-11-07 13:00:03 · 3730 次点击 · 预计阅读时间 3 分钟 · 约1小时前  ...

  5. jQuery实现点赞动态效果

    实现动态效果基本上都是用到定时器,修改标签的位置大小颜色属性 <!DOCTYPE html> <html lang="en"> <head> & ...

  6. 安装包制作工具 SetupFactory 详解

    Setup Factory 是一个强大的安装程序制作工具.提供了安装制作向导界面,即使你对安装制作不了解,也可以生成专业性质的安装程序.可建立快捷方式,也可直接在 Windows 系统的注册表加入内容 ...

  7. ==和is

    is是比较两个引用是否指向了同一个对象(引用比较) ==是比较两个对象是否相等 数字在:-5~256之间的时候用来赋值的内存地址是不变的

  8. .NET数据请求序列化

    这是一个.ner框架中经常用到的数据映射类,此类主要承接业务应用做数据的增删查改操作.通过序列化将查询数据映射为需要的类. 由于经常会用到,这里收藏一下. data用作SQL数据库链接操作: Repo ...

  9. 《Java并发编程实战》笔记-非阻塞算法

    如果在某种算法中,一个线程的失败或挂起不会导致其他线程也失败和挂起,那么这种算法就被称为非阻塞算法.如果在算法的每个步骤中都存在某个线程能够执行下去,那么这种算法也被称为无锁(Lock-Free)算法 ...

  10. PAT 乙级 1070 结绳(25) C++版

    1070. 结绳(25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一段一段的绳子,你需要把它们串成一条 ...