题目大意:

  这题不好描述,直接看原题吧……

题解:

  很无脑的题……就是卡精度+难写。代码能力还是太差了。

  其实可以直接用long double肝过去。但我的代码似乎太丑了,以至于跑得奇慢无比。

代码:

  

#include "bits/stdc++.h"

using namespace std;

inline int read() {
int s=0,k=1;char ch=getchar();
while (ch<'0'|ch>'9') ch=='-'?k=-1:0,ch=getchar();
while (ch>47&ch<='9') s=s*10+(ch^48),ch=getchar();
return s*k;
} #define double long double const double eps=1e-10; const int N=1e4+10; inline int dcmp(double a) {
if (a>eps) return 1;
if (a<-eps) return -1;
return 0;
} struct P{
P(double _x=0.0,double _y=0.0):x(_x),y(_y){}
double x,y;
double &operator [] (int k) {return k?y:x;}
friend bool operator <(P a,P b) {
return dcmp(a[0]-b[0])==-1||(dcmp(a[0]-b[0])==0&&dcmp(a[1]-b[1])==-1);
}
friend double operator *(P a,P b) {
return a[0]*b[1]-b[0]*a[1];
}
friend P operator /(P a,double b) {
return P(a[0]/b,a[1]/b);
}
friend P operator + (P a,P b) {
return P(a[0]+b[0],a[1]+b[1]);
}
friend P operator * (P a,double b) {
return P(a[0]*b,a[1]*b);
}
friend double operator /(P a,P b) {
return a[0]*b[0]+b[1]*a[1];
}
inline double leth(){
return sqrt(x*x+y*y);
}
};
P operator -(P a,P b) {
return P(a[0]-b[0],a[1]-b[1]);
} struct L{
L(){}L(P _a,P _b):a(_a),b(_b),c(_b-_a),slope(atan2((a-b)[1],(a-b)[0])){}
P a,b,c;double slope;
P &operator[] (int k) {
if(!k) return a;
if (k==1) return b;
return c;
}
friend double touying (L x,L y) {
return x[2]/y[2]/(x[2].leth());
}
friend double touying (L x,P y) {
return x[2]/(y-x[0])/(x[2].leth());
}
friend bool operator <(L x,L y) {
double pos = max (x[0][0],y[0][0]);
return dcmp(fabs(x[0][1] + x[2][1] * (pos-x[0][0]) / ( x[1][0] - x[0][0] )) -
fabs(y[0][1] + y[2][1] * (pos-y[0][0]) / ( y[1][0] - y[0][0] )) ) == -1; }
}block[N],gui; inline bool Judge(L a,L b) {
return dcmp(b[2]*(a[0]-b[0]))==1;
} inline double dis(P p,L l) {
return l[2]*(p-l[0])/l[2].leth();
} double lft[N],lth[N],rght[N],rth[N]; int n,leth,m;
int pl[N],pr[N]; struct node {
P pos;int id;
friend bool operator <(node a,node b) {
return a.pos<b.pos;
}
}np[N*6]; set<L> up,down; double res[N*6]; inline double calc (double x2,double x1,L l) { P delta=l[2]*(x2-x1)/l[2][0];
return delta.leth();
} int main(){ int T=read(); register int i,j;
while (T-- ) {
n=read();
for (i=1;i<=n;++i) {
double x1=read(),y1=read(),x2=read(),y2=read();
if (x1>x2) swap(x1,x2),swap(y1,y2);
if (x1==x2&&y1>y2) swap(y1,y2);
block[i]=L(P(x1,y1),P(x2,y2));
}
double x1=read(),y1=read(),x2=read(),y2=read();leth=read();
if (x1>x2) swap(x1,x2),swap(y1,y2);
if (x1==x2&&y1>y2) swap(y1,y2);
gui=L(P(x1,y1),P(x2,y2));
m=0;
for (i=1;i<=n;++i) {
P a=block[i][0],b=block[i][1];
P na,nb;
na[0] = touying(gui,a),na[1] = dis(a,gui);
nb[0] = touying(gui,b),nb[1] = dis(b,gui);
if (nb<na) swap(na,nb);
block[i] = L(na,nb);
np[++m] = (node){na,i} ;
np[++m] = (node){nb,-i} ;
np[++m] = (node){P (na[0]+leth,na[1]),0};
np[++m] = (node){P (nb[0]+leth,nb[1]),0};
np[++m] = (node){P (na[0]-leth,na[1]),0};
np[++m] = (node){P (nb[0]-leth,nb[1]),0};
}
sort(np+1,np+m+1);
up.clear();
down.clear();
double ans = 0.0,tmp,ret=0.0;
j=1;
while (j<=6*n) {
if (np[j].id<0) {
if (block[-np[j].id][0][1]<-eps)
down.erase(block[-np[j].id]);
else up.erase(block[-np[j].id]);
}else if (np[j].id>0){
if (block[np[j].id][0][1]<-eps)
down.insert(block[np[j].id]);
else up.insert(block[np[j].id]);
}
++j;
res[j]=0.0;
if (up.size()){
tmp = calc (np[j].pos[0],np[j-1].pos[0],*up.begin());
res[j] +=tmp;
}
if (down.size()) {
tmp = calc (np[j].pos[0],np[j-1].pos[0],*down.begin());
res[j] +=tmp;
}
}
for (i=j=1;i<=6*n&&j<=6*n;++i,ans-=res[i]) {
while (j<=6*n&&dcmp(np[j].pos[0]-np[i].pos[0]-leth)<=0) ans+=res[j++];
ret=max(ret,ans);
}
printf("%.15Lf\n",ret);
}
}

  

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

  1. loj#2565. 「SDOI2018」旧试题(反演 三元环计数)

    题意 题目链接 Sol 神仙反演题.在洛谷上疯狂被卡常 Orz shadowice #include<bits/stdc++.h> #define Pair pair<int, in ...

  2. 【LOJ】#2562. 「SDOI2018」战略游戏

    题解 圆方树建好之后点是原来的两倍,而st表求lca也要开到点的两倍,所以是四倍 我并没有开小,然而= =,我的预处理log2,写成了200000,而不是400000 我是不是折翼啊= = 很可写,我 ...

  3. LOJ2476. 「2018 集训队互测 Day 3」蒜头的奖杯 & LOJ2565. 「SDOI2018」旧试题(莫比乌斯反演)

    题目链接 LOJ2476:https://loj.ac/problem/2476 LOJ2565:https://loj.ac/problem/2565 题解 参考照搬了 wxh 的博客. 为了方便, ...

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

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

  5. 不设目标也能通关「马里奥」的AI算法,全靠好奇心学习

    在强化学习中,设计密集.定义良好的外部奖励是很困难的,并且通常不可扩展.通常增加内部奖励可以作为对此限制的补偿,OpenAI.CMU 在本研究中更近一步,提出了完全靠内部奖励即好奇心来训练智能体的方法 ...

  6. 「MoreThanJava」一文了解二进制和CPU工作原理

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  7. 「2014-2-6」TokuMX and MongoDB related materials collection

    简介参考 TokuMX 和 MongoDB 各自的官方站点.       ##  Tokutek 最重要的特点和 marketing word 是所谓 fractal tree indexing te ...

  8. Linux 小知识翻译 - 「分区」

    安装Linux的时候,需要对硬盘进行分区.那么「分区」到底是什么呢? 「分区」在日语中有区分,分割的意思.计算机术语中有时会说「对一个磁盘进行分区」,整个意思就是指定如何分割磁盘的意思. 「对磁盘进行 ...

  9. 「Python」socket指南

    开始 网络中的 Socket 和 Socket API 是用来跨网络的消息传送的,它提供了 进程间通信(IPC) 的一种形式.网络可以是逻辑的.本地的电脑网络,或者是可以物理连接到外网的网络,并且可以 ...

随机推荐

  1. Java IO学习--(四)网络

    Java中网络的内容或多或少的超出了Java IO的范畴.关于Java网络更多的是在我的Java网络教程中探讨.但是既然网络是一个常见的数据来源以及数据流目的地,并且因为你使用Java IO的API通 ...

  2. angularjs系列之轻松使用$q进行异步编程

    第一部分关于js中的异步编程 异步编程简单的说就是你写了一段代码,但他不会按照你书写代码的顺序立即执行,而是等到程序中发生了某个事件(如用户点击了某个按钮,某个ajax请求得到了响应)才去执行这段代码 ...

  3. Spring多数据源解决方案

    Figure 2 多数据源的选择逻辑渗透至客户端 解决方案 Figure 3 采用Proxy模式来封转数据源选择逻辑 通过采用Proxy模式我们在方案实现中实现一个虚拟的数据源.并且通过它来封装数据源 ...

  4. jvm栈-运行控制,jvm-堆运行存储共享单元

     JVM-栈 2012-09-17 15:43:53 分类: Java 原文转自:http://www.blogjava.net/nkjava/archive/2012/03/15/371971.ht ...

  5. 详解Lambda

    定义好委托: public delegate int FirDelegate(int a); public delegate int SecDelegate(int a,int b); public ...

  6. 详解k8s组件Ingress边缘路由器并落地到微服务 - kubernetes

    写在前面 Ingress 英文翻译 进入;进入权;进食,更准确的讲就是入口,即外部流量进入k8s集群必经之口.这到大门到底有什么作用?我们如何使用Ingress?k8s又是如何进行服务发现的呢?先看一 ...

  7. Day13 CSS的与应用

    老师博客:http://www.cnblogs.com/yuanchenqi/articles/6856399.html 1,CSS选择器的应用: CSS规则有两个主要部分构成:选择器,以及一条或多条 ...

  8. 人手一份核武器 - Hacking Team 泄露(开源)资料导览手册

    https://zhuanlan.zhihu.com/p/20102713 author:蒸米 0x00 序 事先声明本人并不是全栈安全工程师,仅仅是移动安全小菜一枚,所以对泄漏资料的分析难免会有疏忽 ...

  9. laravel 5.5 安装

    PHP要求 PHP> = 7.0.0 OpenSSL PHP扩展 PDO PHP扩展 Mbstring PHP扩展 Tokenizer PHP扩展 XML PHP扩展 通过Composer创建项 ...

  10. JavaScript和JQuery的区别

    一.本质上的区别 1.JavaScript 是通过<script></script>标签插入到HTML页面,可由所有的现代浏览器执行的一种轻量级的编程语言. 2.JQuery是 ...