bzoj5328: [Sdoi2018]物理实验

果然我还是太菜了,爆了一天才过。。。。隔壁肉丝都不知道喊了多少句哎╮(╯▽╰)╭我又A了什么傻逼题(然鹅就是wf和国集的题QWQ)

其实这个题就是个裸题,但是我就是不会。。。

这个题第一步就是明显的旋转坐标系(不会的百度),注意要先平移坐标系再旋转

然后问题就变成x轴上下有一些线段,考虑覆盖长度为L的一段区间,看看区间内最接近x轴的线段的长度和(也可以直接按题意理解,好像更好懂)

线段是斜着的很难搞,但是假如覆盖了l~r的区间,那么也可以通过三角函数搞出线段长度

可以先弄一个类似离散化的东西,我的意思是每个线段的左右端点的x坐标为断点,相邻x坐标之间可以看成一段(大概就是这样不懂评论我)

主要问题在处理出每一段最接近x轴的线段是那一条,假如搞定了这个东西,我们可以正反枚举每个段,然后能要段就要,再加上下一个段的一部分更新答案,这个双指针扫一下就好

考虑按端点的x坐标上扫描线,对于线段有一个关键的性质,就是线段不相交,这里隐含着这么一个东西:假如线段u的左端点的x坐标较小,线段v的左端点在线段u的上方/下方,直到u被删除线段的上下关系都是不变的,否则线段就相交了

换句话说,不相交满足对于在任意一条线段的左右端点x坐标框住的区间中,任意一条线段和这一条线段的上下关系不变

那么有这个东西就可以做了,用set维护一下上方最下的线段和下方最上的线段即可

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;
typedef long double LD;
const int _=1e2;
const int maxn=1e4+_;
const LD eps=1e-12;
LD sqr(LD x){return x*x;}
int n;struct point{LD x,y; point(){} point(LD X,LD Y){x=X,y=Y;}};
LD getdis(point p1,point p2){return sqrt(sqr(p1.x-p2.x)+sqr(p1.y-p2.y));}
LD slope(point p1,point p2){return (p2.y-p1.y)/(p2.x-p1.x);}
LD multi(point p1,point p2,point p0)
{LD x1,y1,x2,y2;x1=p1.x-p0.x;y1=p1.y-p0.y;x2=p2.x-p0.x;y2=p2.y-p0.y;return x1*y2-x2*y1;
}//------------------------------------------------def-----------------------------------------------------struct board
{point A,B;LD g;//长度变化的比值 1/cosvoid getg(){g=getdis(A,B)/fabs(A.x-B.x);}
}b[maxn];bool cmp(board b1,board b2){return b1.A.y<b2.A.y;}
bool bbbbcmp(board b1,board b2){return b1.A.x<b2.A.x;}LD co,si;
point rot(point p){return point(p.x*co-p.y*si,p.y*co+p.x*si);}
void rotate()
{LD d=getdis(b[n+1].A,b[n+1].B);co=fabs(b[n+1].A.x-b[n+1].B.x)/d;si=fabs(b[n+1].A.y-b[n+1].B.y)/d;if(b[n+1].A.x<b[n+1].B.x&&b[n+1].A.y<b[n+1].B.y)si=-si;for(int i=1;i<=n;i++){b[i].A.x-=b[n+1].A.x,b[i].A.y-=b[n+1].A.y;b[i].B.x-=b[n+1].A.x,b[i].B.y-=b[n+1].A.y;b[i].A=rot(b[i].A);b[i].B=rot(b[i].B);if(b[i].A.x>b[i].B.x)swap(b[i].A,b[i].B);b[i].getg();//        printf("%.10Lf %.10Lf %.10Lf %.10Lf\n",b[i].A.x,b[i].A.y,b[i].B.x,b[i].B.y);
    }
}//---------------------------------------------------rotate-------------------------------------------------

LD xx[2*maxn];int xlen;
bool xx_cmp(LD x1,LD x2){return x1<x2;}
int up[2*maxn],dp[2*maxn];//xx[i]~xx[i-1]这一段被那条线段覆盖着 struct seg
{int id;seg(){} seg(int ID){id=ID;}friend bool operator <(seg s1,seg s2){int x=s1.id,y=s2.id;if(x<y)return multi(b[x].B,b[y].A,b[x].A)>0;else   return multi(b[y].B,b[x].A,b[y].A)<0;}friend bool operator >(seg s1,seg s2){int x=s1.id,y=s2.id;if(x<y)return multi(b[x].B,b[y].A,b[x].A)<0;else   return multi(b[y].B,b[x].A,b[y].A)>0;}
};set< seg,less<seg> >us;set< seg,greater<seg> >ds;struct qq{int op,p;seg s; qq(){} qq(int OP,int P,seg S){op=OP,p=P,s=S;}}uq[2*maxn],dq[2*maxn];int uqlen,dqlen;
bool qqqqcmp(qq q1,qq q2){return q1.p==q2.p?q1.op>q2.op:q1.p<q2.p;}int lb(LD d)
{int l=1,r=xlen;while(l<=r){int mid=(l+r)/2;if(fabs(xx[mid]-d)<=eps)return mid;if(xx[mid]>d)r=mid-1;else l=mid+1;}
}
void cover(int l1,int r1,int l2,int r2)
{sort(b+l1,b+r1+1,bbbbcmp);sort(b+l2,b+r2+1,bbbbcmp);uqlen=dqlen=0;for(int i=l1;i<=r1;i++){uq[++uqlen]=qq( 1,lb(b[i].A.x)+1,seg(i));uq[++uqlen]=qq(-1,lb(b[i].B.x),seg(i));}for(int i=l2;i<=r2;i++){dq[++dqlen]=qq( 1,lb(b[i].A.x)+1,seg(i));dq[++dqlen]=qq(-1,lb(b[i].B.x),seg(i));}us.clear(),ds.clear();sort(uq+1,uq+uqlen+1,qqqqcmp);sort(dq+1,dq+dqlen+1,qqqqcmp);int utp=1,dtp=1;for(int i=1;i<=xlen;i++){while(utp<=uqlen&&uq[utp].p==i&&uq[utp].op==1)us.insert(uq[utp].s),utp++;while(dtp<=dqlen&&dq[dtp].p==i&&dq[dtp].op==1)ds.insert(dq[dtp].s),dtp++;if(!us.empty())up[i]=(*us.begin()).id; else up[i]=-1;if(!ds.empty())dp[i]=(*ds.begin()).id; else dp[i]=-1;while(utp<=uqlen&&uq[utp].p==i&&uq[utp].op==-1)us.erase(uq[utp].s),utp++;while(dtp<=dqlen&&dq[dtp].p==i&&dq[dtp].op==-1)ds.erase(dq[dtp].s),dtp++;}
}//-----------------------------------------------cover------------------------------------------------------int main()
{freopen("a.in","r",stdin);freopen("a.out","w",stdout);int T;scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=1;i<=n+1;i++)scanf("%Lf%Lf%Lf%Lf",&b[i].A.x,&b[i].A.y,&b[i].B.x,&b[i].B.y);scanf("%Lf",&b[n+1].g);if(b[n+1].A.x>b[n+1].B.x)swap(b[n+1].A,b[n+1].B);rotate();//....step1.......int pp=n+1; sort(b+1,b+n+1,cmp);xlen=0;for(int i=1;i<=n;i++){if(b[i].A.y>0&&pp==n+1)pp=i;xx[++xlen]=b[i].A.x;xx[++xlen]=b[i].B.x;}sort(xx+1,xx+xlen+1);int tp=1;for(int j=2;j<=xlen;j++)if(fabs(xx[j]-xx[tp])>eps)xx[++tp]=xx[j];xlen=tp;cover(pp,n,1,pp-1);//....step2.......
        LD ans=0,sum=0;int j=1;for(int i=2;i<=xlen;i++){while(j<xlen&&(xx[j+1]-xx[i-1])<=b[n+1].g){j++;if(up[j]!=-1)sum+=(xx[j]-xx[j-1])*b[up[j]].g;if(dp[j]!=-1)sum+=(xx[j]-xx[j-1])*b[dp[j]].g;}LD num=0;if(j<xlen){if(up[j+1]!=-1)num+=min(xx[j+1]-xx[j],b[n+1].g-(xx[j]-xx[i-1]))*b[up[j+1]].g;if(dp[j+1]!=-1)num+=min(xx[j+1]-xx[j],b[n+1].g-(xx[j]-xx[i-1]))*b[dp[j+1]].g;}ans=max(ans,sum+num);if(up[i]!=-1)sum-=(xx[i]-xx[i-1])*b[up[i]].g;if(dp[i]!=-1)sum-=(xx[i]-xx[i-1])*b[dp[i]].g;//            printf("%.10Lf %.10Lf %.10Lf\n",xx[i]-xx[i-1],b[up[i]].g,b[dp[i]].g);
        }j=xlen;sum=0;for(int i=xlen;i>1;i--){while(j>1&&(xx[i]-xx[j-1])<=b[n+1].g){if(up[j]!=-1)sum+=(xx[j]-xx[j-1])*b[up[j]].g;if(dp[j]!=-1)sum+=(xx[j]-xx[j-1])*b[dp[j]].g;j--;}LD num=0;if(j>1){if(up[j]!=-1)num+=min(xx[j]-xx[j-1],b[n+1].g-(xx[i]-xx[j]))*b[up[j]].g;if(dp[j]!=-1)num+=min(xx[j]-xx[j-1],b[n+1].g-(xx[i]-xx[j]))*b[dp[j]].g;}ans=max(ans,sum+num);if(up[i]!=-1)sum-=(xx[i]-xx[i-1])*b[up[i]].g;if(dp[i]!=-1)sum-=(xx[i]-xx[i-1])*b[dp[i]].g;}printf("%.10Lf\n",ans);
//        break;//....step3.......
    }return 0;
}

 

转载于:https://www.cnblogs.com/AKCqhzdy/p/10561320.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/363417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是Windows RT

Windows RT(WinRT) 是 Windows 8 家族的一个新成员&#xff0c;而这也是此前 Windows on ARM(WOA) 的官方名称。Windows RT 专注于 ARM 平台&#xff0c;并不会单独零售&#xff0c;仅采用预装的方式发行。Windows RT 中将包含针对触摸操作进行优化的微软 Word、Excel、PowerPo…

Spring MVC和Thymeleaf:如何从模板访问数据

在典型的Spring MVC应用程序中&#xff0c; Controller类负责使用数据准备模型映射并选择要呈现的视图。 该model map允许视图技术的完整抽象&#xff0c;对于Thymeleaf而言&#xff0c;它被转换为Thymeleaf VariablesMap对象&#xff0c;该对象使所有定义的变量可用于模板中执…

JQ css3 导航栏到底部上移

导航栏 .navigation {position: fixed;bottom: 100px;right: 100px;z-index: 100; } .navigation {transition: bottom 2s;-webkit-transition: bottom 2s; } JQ代码 var nav eval($(.navigation).offset().top - $(window).scrollTop()); $(window).on(scroll, function() {v…

SQL2005-使用openrowset 里读取excel文件

很多时候我们都知道使用.net代码去读取word,excel文档&#xff0c;但是我们如何使用sql句语里读取excel文件呢&#xff1a;SQL2005为我们提供了OPENROWSET来访问各种数据源&#xff1a;,当然我还是建议使用.net代码来读取这些文件。这里就不多说了。 我们先看一下官方的解释&am…

@RequestBody ajax 415 400

使用springmvc和Ajax进行数据交互时使用标签RequestBody时我报了这两个错&#xff0c;刚开始对springmvc的使用和注解有点迷&#xff0c;然后踩坑上了。 先说下怎么才会踩上去。首先RequestBody在一个Controller的一个方法中只能用一次&#xff0c;所以如果你使用了两次意图在一…

C#中用WebClient.UploadData 方法上载文件数据

假如某网站有个表单&#xff0c;例如(url: http://localhost/login.aspx)&#xff1a;帐号密码我们需要在程序中提交数据到这个表单&#xff0c;对于这种表单&#xff0c;我们可以使用 WebClient.UploadData 方法来实现&#xff0c;将所要上传的数据拼成字符即可&#xff0c;程…

Java中的SynchronousQueue示例–生产者使用者解决方案

SynchronousQueue是BlockingQueue的一种特殊类型&#xff0c;其中每个插入操作必须等待另一个线程进行相应的删除操作&#xff0c;反之亦然。 当您在SynchronousQueue上调用put&#xff08;&#xff09;方法时&#xff0c;它将阻塞&#xff0c;直到有另一个线程将该元素从Queue…

OnSen UI结合AngularJs打造”美团APP我的”页面 --Hybrid App

1、页面效果图&#xff1a; 演示地址&#xff1a;http://www.nxl123.cn/bokeyuan/meiTuanDemo_mine/ 2、核心代码 mine.html&#xff1a; <ons-page id"mine" ng-controller"MineController"> <!--toolbar开始--> <ons-toolbar>…

[MOSS开发]:通过简单BUG跟踪Demo阐述用户控件对列表的操作

下面的文章我想以一个具体的BUG跟踪Demo来说明MOSS的具体应用,这里面会应用到下面的知识点: 1:用户组,用户的创建,权限分配&#xff1b; 2:列表的概念以及创建&#xff1b; 3:利用用户控件来完成表单的增加加功能&#xff1b; 4:当前域用户查看自己BUG。 BUG跟踪软件在一些…

Maven的课堂笔记4

9.Maven与MyEclipse2014结合 MyEclipse10以上的版本,对Maven支持的就比较好 9.2 Myeclipse配置 本地文件夹的C盘的.m2文件夹下必须得有这个settings.xml文件 不配置这个settings.xml文件的话,myeclipse会从互联网上下载需要的jar包. 9.3 修改pom文件 添加jar包 <project xml…

vue动画

vue 提供了一些显示、隐藏一些不同的过渡&#xff0c;效果主要跟 v-if v-show 动态组件 1. vue 给动画分了 6 个过程&#xff0c;在 css 中扮演 6 个类 .v-enter  定义动画的开始状态 .v-enter-active  定义动画生效时的状态 .v-enter-to  定义动画结束是的状态 .v-leave…

基于AngularJS的Onsen UI --Onsen UI学习笔记

AngularJS与Onsen UI的结合&#xff0c;Onsen UI应用程序实际上是一个AngularJS 1应用程序。 <!doctype html><html lang"en"><head> <meta charset"utf-8"> <link rel"stylesheet" href"lib/onsen/css/…

图数据库的知识表示与推理

图形数据库及其技术生态系统可以为知识表示和推理问题提供优雅&#xff0c;有效的解决方案。 要了解这种说法&#xff0c;我们必须首先了解什么是图形。 图是一种数据结构。 图数据结构的类型很多&#xff0c;但出于本文的目的&#xff0c;我们将重点介绍一种已被称为属性图的类…

解决win2003安装exchangeServer后关机慢的方法

在windows2003上安装exchange2003&#xff08;或者是exchange2000&#xff09;后&#xff0c;很多用户发现服务器关闭变得非常之慢……很不幸的是&#xff0c;我也遇到了这个问题。从日志中的错误信息来分析&#xff0c;和目录服务先于某些服务终止有关。在微软的KB上查了一下&…

vegas 为盖斯

vegas 为盖斯 S键 分割素材U键 分开视频和音频I键渲染开始O渲染结束 默认布局 为盖斯新建项目的参数 剪好后渲染 插入字幕 转载于:https://www.cnblogs.com/GaoNa/p/10562504.html

简单配置 docker swarm

简单配置 docker swarm #准备三台CentOS7 #IP划分 192.168.1.201 virtualBox1 192168.1.202 virtualBox2 192168.1.204 virtualBox3 #三台机器上分别安装docker docker安装 #三台机器上分别配置加速器 vim /etc/docker/daemon.json #该文…

css图片的全屏显示代码-css3

<!DOCTYPE html><html lang"en">  <head>     <meta charset"UTF-8">     <title>Title</title>     <style type"text/css" rel"stylesheet">       *{margin: 0;pad…

COMET彗星(三)构建自己的COMET核心

主题列表&#xff1a; COMET彗星&#xff08;一&#xff09;SERVER PUSH介绍 COMET彗星&#xff08;二&#xff09;基于SERVER PUSH的消息传输 引言&#xff1a; 在上一篇随笔中&#xff0c;对COMET使用的类和作用进行了简短的介绍&#xff0c;从本篇随笔开始&#xff0c;将从实…

如何在JavaServer Pages中使用Salesforce REST API

摘要&#xff1a;本教程提供了一个JSP示例以及如何将其与Salesforce REST API集成。 我们将逐步完成创建外部客户端以使用Force.com &#xff08;同时使用HTTP&#xff08;S&#xff09;和JSON&#xff09;管理您的数据的分步过程。 在此示例中&#xff0c;我将Mac OS X 10.9.…

写在08年“愚人节”

从博客园学了很多东西&#xff0c;是时候该回馈了。谢谢博客园给我们提供这么好的平台交流技术。 刚发了文章习惯性的看了下自己博客的首页代码&#xff0c;感觉日历不够精良。 我做过的一个ajax日历&#xff0c;可以参考解放日报 艺术家具版的日期直达功能的日历&#xff0c;用…