题目大意:

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

题解:

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

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

代码:

  

  1. #include "bits/stdc++.h"
  2.  
  3. using namespace std;
  4.  
  5. inline int read() {
  6. int s=0,k=1;char ch=getchar();
  7. while (ch<'0'|ch>'9') ch=='-'?k=-1:0,ch=getchar();
  8. while (ch>47&ch<='9') s=s*10+(ch^48),ch=getchar();
  9. return s*k;
  10. }
  11.  
  12. #define double long double
  13.  
  14. const double eps=1e-10;
  15.  
  16. const int N=1e4+10;
  17.  
  18. inline int dcmp(double a) {
  19. if (a>eps) return 1;
  20. if (a<-eps) return -1;
  21. return 0;
  22. }
  23.  
  24. struct P{
  25. P(double _x=0.0,double _y=0.0):x(_x),y(_y){}
  26. double x,y;
  27. double &operator [] (int k) {return k?y:x;}
  28. friend bool operator <(P a,P b) {
  29. return dcmp(a[0]-b[0])==-1||(dcmp(a[0]-b[0])==0&&dcmp(a[1]-b[1])==-1);
  30. }
  31. friend double operator *(P a,P b) {
  32. return a[0]*b[1]-b[0]*a[1];
  33. }
  34. friend P operator /(P a,double b) {
  35. return P(a[0]/b,a[1]/b);
  36. }
  37. friend P operator + (P a,P b) {
  38. return P(a[0]+b[0],a[1]+b[1]);
  39. }
  40. friend P operator * (P a,double b) {
  41. return P(a[0]*b,a[1]*b);
  42. }
  43. friend double operator /(P a,P b) {
  44. return a[0]*b[0]+b[1]*a[1];
  45. }
  46. inline double leth(){
  47. return sqrt(x*x+y*y);
  48. }
  49. };
  50. P operator -(P a,P b) {
  51. return P(a[0]-b[0],a[1]-b[1]);
  52. }
  53.  
  54. struct L{
  55. L(){}L(P _a,P _b):a(_a),b(_b),c(_b-_a),slope(atan2((a-b)[1],(a-b)[0])){}
  56. P a,b,c;double slope;
  57. P &operator[] (int k) {
  58. if(!k) return a;
  59. if (k==1) return b;
  60. return c;
  61. }
  62. friend double touying (L x,L y) {
  63. return x[2]/y[2]/(x[2].leth());
  64. }
  65. friend double touying (L x,P y) {
  66. return x[2]/(y-x[0])/(x[2].leth());
  67. }
  68. friend bool operator <(L x,L y) {
  69. double pos = max (x[0][0],y[0][0]);
  70. return dcmp(fabs(x[0][1] + x[2][1] * (pos-x[0][0]) / ( x[1][0] - x[0][0] )) -
  71. fabs(y[0][1] + y[2][1] * (pos-y[0][0]) / ( y[1][0] - y[0][0] )) ) == -1;
  72.  
  73. }
  74. }block[N],gui;
  75.  
  76. inline bool Judge(L a,L b) {
  77. return dcmp(b[2]*(a[0]-b[0]))==1;
  78. }
  79.  
  80. inline double dis(P p,L l) {
  81. return l[2]*(p-l[0])/l[2].leth();
  82. }
  83.  
  84. double lft[N],lth[N],rght[N],rth[N];
  85.  
  86. int n,leth,m;
  87. int pl[N],pr[N];
  88.  
  89. struct node {
  90. P pos;int id;
  91. friend bool operator <(node a,node b) {
  92. return a.pos<b.pos;
  93. }
  94. }np[N*6];
  95.  
  96. set<L> up,down;
  97.  
  98. double res[N*6];
  99.  
  100. inline double calc (double x2,double x1,L l) {
  101.  
  102. P delta=l[2]*(x2-x1)/l[2][0];
  103. return delta.leth();
  104. }
  105.  
  106. int main(){
  107.  
  108. int T=read();
  109.  
  110. register int i,j;
  111. while (T-- ) {
  112. n=read();
  113. for (i=1;i<=n;++i) {
  114. double x1=read(),y1=read(),x2=read(),y2=read();
  115. if (x1>x2) swap(x1,x2),swap(y1,y2);
  116. if (x1==x2&&y1>y2) swap(y1,y2);
  117. block[i]=L(P(x1,y1),P(x2,y2));
  118. }
  119. double x1=read(),y1=read(),x2=read(),y2=read();leth=read();
  120. if (x1>x2) swap(x1,x2),swap(y1,y2);
  121. if (x1==x2&&y1>y2) swap(y1,y2);
  122. gui=L(P(x1,y1),P(x2,y2));
  123. m=0;
  124. for (i=1;i<=n;++i) {
  125. P a=block[i][0],b=block[i][1];
  126. P na,nb;
  127. na[0] = touying(gui,a),na[1] = dis(a,gui);
  128. nb[0] = touying(gui,b),nb[1] = dis(b,gui);
  129. if (nb<na) swap(na,nb);
  130. block[i] = L(na,nb);
  131. np[++m] = (node){na,i} ;
  132. np[++m] = (node){nb,-i} ;
  133. np[++m] = (node){P (na[0]+leth,na[1]),0};
  134. np[++m] = (node){P (nb[0]+leth,nb[1]),0};
  135. np[++m] = (node){P (na[0]-leth,na[1]),0};
  136. np[++m] = (node){P (nb[0]-leth,nb[1]),0};
  137. }
  138. sort(np+1,np+m+1);
  139. up.clear();
  140. down.clear();
  141. double ans = 0.0,tmp,ret=0.0;
  142. j=1;
  143. while (j<=6*n) {
  144. if (np[j].id<0) {
  145. if (block[-np[j].id][0][1]<-eps)
  146. down.erase(block[-np[j].id]);
  147. else up.erase(block[-np[j].id]);
  148. }else if (np[j].id>0){
  149. if (block[np[j].id][0][1]<-eps)
  150. down.insert(block[np[j].id]);
  151. else up.insert(block[np[j].id]);
  152. }
  153. ++j;
  154. res[j]=0.0;
  155. if (up.size()){
  156. tmp = calc (np[j].pos[0],np[j-1].pos[0],*up.begin());
  157. res[j] +=tmp;
  158. }
  159. if (down.size()) {
  160. tmp = calc (np[j].pos[0],np[j-1].pos[0],*down.begin());
  161. res[j] +=tmp;
  162. }
  163. }
  164. for (i=j=1;i<=6*n&&j<=6*n;++i,ans-=res[i]) {
  165. while (j<=6*n&&dcmp(np[j].pos[0]-np[i].pos[0]-leth)<=0) ans+=res[j++];
  166. ret=max(ret,ans);
  167. }
  168. printf("%.15Lf\n",ret);
  169. }
  170. }

  

「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. PyCharm命令行输入

    PyCharm命令行输入 写作原因 网上资料比较杂,版本较老,与现在的版本有区别,所以根据网上资料和自己亲手实验撰写此文. 设置方法 在菜单中按此路径设置: Run->Edit Configur ...

  2. 自定义UICollectionViewLayout 布局实现瀑布流

    自定义 UICollectionViewLayout 布局,实现瀑布流:UICollectionView和UICollectionViewCell 另行创建,这只是布局文件, 外界控制器只要遵守协议并 ...

  3. Docker 单主机网络

    PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 当容器逐步向容器集群,容器云技术演进的时候,一个不得不面对的问题就是各 ...

  4. JVM笔记8-虚拟机性能监控与故障处理工具

    1.JDK命令行工具 Java开发人员肯定都知道JDK的bin目录有“java.exe”,"javac.exe"这两个命令行工具,但并非所有程序员都了解过JDK的bin目录之中其他 ...

  5. JAVA代码设置selector不同状态下的背景颜色

    代码实现Shape 代码实现Selector StateListDrawable与GradientDrawable 的运用 在Android开发中,我们时常会用到自定义drawable样式,在draw ...

  6. CAN数据格式-ASC

    Vector工具录制的数据,一般有ASC和BLF两种格式,本文介绍ASC. 1. ASC定义 ASC(ASCII)即文本文件,数据已可视化的文本存储. 2.ASC查看 通常情况下,用记事本就可以打开. ...

  7. SharePoint2013 功能区的配置

    遇到了很多次对网站功能区个性化定义的任务,包括标签按钮之类的修改,每次都要重新翻书,这次总结一下,留作备用. 添加内容 下面的XML我认为主要的内容是四部分,一个是CommandUIDefinitio ...

  8. Redis的安装及学习

    最近因为做Chatbot项目需要对于NoSQL数据库进行研究,调研范围包括MongoDB和Redis.本文将介绍Redis在Windows环境的安装及如何利用python来操作Redis数据库. Re ...

  9. Spring框架碰壁日常更新

    关于Spring环境搭建遇到的问题:

  10. mac下安装Python3.*(最新版本)

    前言:mac系统自带python,不过以当前mac系统的最新版本为例,自带的python版本都是2.*版本,虽然不影响老版本项目的运行,但是python最新的3.*版本的一些语法与2.*版本并不相同, ...