「SDOI2018」物理实验

题目大意:

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

题解:

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

  其实可以直接用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);
    }
}

  

原文地址:https://www.cnblogs.com/Troywar/p/9061613.html

时间: 2024-08-06 01:22:47

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

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

[SDOI2018]物理实验 set,扫描线,旋转坐标系 链接 loj 思路 先将导轨移到原点,然后旋转坐标系,参考博客. 然后分线段,每段的贡献(三角函数值)求出来,用自己喜欢的平衡树,我选set. 显然答案的一端是小线段的端点. 然后扫描线求出最大的ans. 代码 #include <bits/stdc++.h> using namespace std; const int N=1e5+7; int n,op[N]; long double X[N][2],Y[N][2],x[2],y[2

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

在强化学习中,设计密集.定义良好的外部奖励是很困难的,并且通常不可扩展.通常增加内部奖励可以作为对此限制的补偿,OpenAI.CMU 在本研究中更近一步,提出了完全靠内部奖励即好奇心来训练智能体的方法.在 54 个环境上的大规模实验结果表明:内在好奇心目标函数和手工设计的外在奖励高度一致:随机特征也能作为强大的基线. 通过与任务匹配的奖励函数最大化来训练智能体策略.对于智能体来说,奖励是外在的,并特定于它们定义的环境.只有奖励函数密集且定义良好时,多数的 RL 才得以成功实现,例如在电子游戏中的

前端工程师需要明白的「像素」

场景: 人物:前端实习生「阿树」与 切图工程师「玉凤」 事件:设计师出设计稿,前端实现页面 玉凤:树,设计稿发给你啦,差那么点像素,就叼死你┏(  ̄へ ̄)=? 阿树:~(>_<)~毛问题噶啦~ 阿树:哇靠,为啥你给的设计稿是640px宽 ,iPhone 5不是320px宽吗??? 玉凤:A pixel is not a pixel is not a pixel, you know ? 阿树:(#‵′),I know Google... 为什么会出现以上的情况,难道他们当中一位出错了,摆了这样的

恶梦还是现实?智能机器人真的上演「逃亡」

科学家的恶梦终于成真了:俄罗斯一个人工智能机械人,在研究人员一不留神下,竟自行逃出了实验室,走进人类的世界!据俄罗斯当地报章报道,事发当日科学家正在教导机械人如何独自行走,避开障碍物.但在实验完结后,一名工程师却忘记关上闸门,令机械人逃出了实验室.机械人共走了一段 50 米的路,跑到一条大街后电池耗尽,停在街上. 一名目击者把事发的片段拍下,正在网络流传.片中只看到一个人形的机械人毫无动静地站在一条繁忙的大街中央,被交通警看守着.之后,一名相信是实验室员工的男子到场把机械人推走.俄罗斯电视第五台

看,物流与 5G 碰撞出的那些「火花」

在前一期栏目中,我们分享了 5G 将带来哪些变革的话题,发现大家对 5G 与行业变革的内容兴趣浓厚.今天,SAP 数字梦想家就邀请 SAP 物流行业首席专家何晓东与大家详细聊聊,除了无人机送货外,5G 将给整个物流行业带来哪些变革. 通过上一期内容的物理课堂小科普,相信大家已经了解到许多 5G 的基本知识.5G 网络以其广覆盖.低时延.高安全性.高行业赋能等特性,在企业的运营过程中具有显著优势.让我们一图了解 5G 与 4G 的主要区别: 在 5G 技术中,同一基站下的两个用户,如果相互间进行通

AC日记——「HNOI2017」单旋 LiBreOJ 2018

#2018. 「HNOI2017」单旋 思路: set+线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define maxtree maxn<<2 int val[maxtree],tag[maxtree],L[maxtree],R[maxtree],mid[maxtree]; int op[maxn],ki[maxn],bi[maxn],cnt,size,n,ch[maxn]

腾讯课堂的物理实验(2017计蒜客初赛第三场)

A题 在腾讯课堂的物理课上,进行了一个有趣的物理实验. 在一个长度为 LL 米的光滑轨道上,小车 A 在 00 时刻以 1\mathrm{m/s}1m/s 的速度从左端出发向右运动,小车 B 在 tt 时刻以 1\mathrm{m/s}1m/s 的速度从右端出发向左运动,两个小车的质量相等.假设所有碰撞都是弹性碰撞,也就是当两个小车相向碰撞时,他们各自会以原来的速度向相反的方向运动:小车和轨道两端发生碰撞时,小车会以原速度向反方向运动. 试求出 TT 时刻的时候,两个小车相距多远. 输入格式 输

「随笔」基于当下的思考

马德,说好的技术blog,变成日记本了... 下午的时候莫名其妙的感到很颓废,因为自己的不够强大感到忧虑和危机感十足.现在每每行走在技术的道路上,常觉得如履薄冰,如芒在背. 上大学之前和现在的心态其实差别挺大的,视野的开阔远远不止局限于自己的脚下.不过,这里的「上大学之前」只是一个时间描述词,并不觉得大学是最适合学习的地方,我很失望. 世界上的人无论性别,区域,宗教,兴趣爱好,总可以在互联网上找到志趣相同的人,总是可以不断打破自己的常识与惯性思维.总是有在相同领域比自己更强的人,挺好的. 关于知

「Unity」与iOS、Android平台的整合:3、导出的Android-Studio工程

本文属于「Unity与iOS.Android平台的整合」系列文章之一,转载请注明出处. Unity默认导出的是Android-Eclipse工程,毕竟Eclipse for Android开发在近一两年才开始没落,用户量还是非常巨大的. 个人认为AndroidStudio非常好用,能轻易解决很多Eclipse解决不了或者很难解决的问题. 所以我将Unity导出的Andoid工程分为Eclipse和AndroidStudio两部分. 不过我之后的相关内容都会使用AndroidStudio,希望依然