提问:我是什么品种的傻逼?

哇看到积水兴高采烈啊。然后就走上了一条不归路。

为什么不归呢,因为我这个法子就是不对的,我总是在想很多很多点围成的一块区域,然后求这一块区域的面积。

然后尝试了各种扫描方法,递增序列,找最低,找最高啊什么的。

自闭。

搜题解:考虑所有相邻的两个点,和他们两边的制高点。那么面积可能是 梯形(制高点高),直角三角形(相交),0.

然后就完了。。。

哇小学数学题难死了啊。

我是智障啊。

 #include <bits/stdc++.h>
using namespace std;
typedef double db;
const int N = 1e5+;
const db eps=1e-;
const db pi=acos(-);
int sign(db k){
if (k>eps) return ; else if (k<-eps) return -; return ;
}
int cmp(db k1,db k2){ return sign(k1-k2);}
struct point {
db x,y;
point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}
point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}
point operator * (db k1) const{return (point){x*k1,y*k1};}
point operator / (db k1) const{return (point){x/k1,y/k1};}
db abs(){ return sqrt(x*x+y*y);}
db dis(point k1){ return (*this-k1).abs();}
};
db cross(point k1,point k2){ return k1.x*k2.y-k1.y*k2.x;}
db dot(point k1,point k2){ return k1.x*k2.x+k1.y*k2.y;}
point proj(point k1,point k2,point q){
point k=k2-k1;return k1+k*(dot(q-k1,k)/k.abs());
}
point getLL(point k1,point k2,point k3,point k4){
db w1=cross(k1-k3,k4-k3),w2=cross(k4-k3,k2-k3); return (k1*w2+k2*w1)/(w1+w2);
}
db area(vector<point> A){ //
db ans=;
for (int i=;i<A.size()-;i++)
ans+=cross(A[i]-A[],A[i+]-A[]);
return ans/;
}
int t,n;
point a[N];
db pre[N],las[N];//
vector<point> v;
int main(){
//freopen("awsl.in","r",stdin);
scanf("%d",&t);
while (t--){
memset(pre,, sizeof(pre));
memset(las,, sizeof(las));
memset(a,, sizeof(a));
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lf%lf",&a[i].x,&a[i].y);
}
for(int i=;i<=n;i++){
pre[i]=max(pre[i-],a[i].y);
}
for(int i=n;i>=;i--){
las[i]=max(las[i+],a[i].y);
}
db ans = ;
for(int i=;i<n;i++){
if(a[i].y>a[i+].y){
db cut = min(min(las[i+],pre[i+]),min(las[i],pre[i]));
if(cut>=a[i].y){
ans+=(cut-a[i].y+cut-a[i+].y)*(a[i+].x-a[i].x)/;
} else if(cut>a[i+].y){
point p1 = point{1.0,cut};
point p2 = point{2.0,cut};
point xxx = getLL(p1,p2,a[i],a[i+]);
ans+=(xxx.y-a[i+].y)*(a[i+].x-xxx.x)/;
}
} else{
db cut = min(min(las[i+],pre[i+]),min(las[i],pre[i]));
if(cut>=a[i+].y){
ans+=(cut-a[i].y+cut-a[i+].y)*(a[i+].x-a[i].x)/;
} else if(cut>a[i].y){
point p1 = point{1.0,cut};
point p2 = point{2.0,cut};
point xxx = getLL(p1,p2,a[i],a[i+]);
ans+=(xxx.y-a[i].y)*(xxx.x-a[i].x)/;
}
}
}
printf("%.10f\n",ans);
}
}

gym101808 E的更多相关文章

随机推荐

  1. 问题7:JavaScript 常用正则示例

    1. trim功能(清除字符串两端空格) String.prototype.trim = function() { return this.replace(/(^\s+)|(\s+$)/g, ''); ...

  2. MySQL性能调优的10个方法 - mysql数据库栏目

    摘要: https://edu.aliyun.com/a/29036?spm=5176.11182482.related_article.1.hbeZbF 摘要: MYSQL 应该是最流行了 WEB ...

  3. git stash命令详解

    git stash命令用于将更改储藏在脏工作目录中. 使用语法 git stash list [<options>] git stash show [<stash>] git ...

  4. Android 解压zip文件你知道多少?

    对于Android常用的压缩格式ZIP,你了解多少? Android的有两种解压ZIP的方法,你知道吗? ZipFile和ZipInputStream的解压效率,你对比过吗? 带着以上问题,现在就开始 ...

  5. wpf 控件添加背景图片

    方法一,xaml中: <控件> <控件.Background> <ImageBrush ImageSource="/WpfApplication1;compon ...

  6. 【原】Linux环境下Shell调用MySQL并实现定时任务

    对于一些周期性事务,我们可以在Linux下,使用shell脚本调用mysql数据库存储过程,并设置定时任务. 本来是要mysql数据库中创建事件任务来,定时执行存储过程,做数据传输的...使用cron ...

  7. Docker 管理工具 Portainer部署

    Docker 管理工具 Portainer部署 一.官网 官网:http://www.portainer.io 演示地址:http://demo.portainer.io 用户名:admin 密码:t ...

  8. 【推荐】Hutool 的通用工具类库

    摘自3.1.1版本作者发布原话,当时看到有点说不上的情绪,为作者的坚持.热爱点个赞. 已经想不起来是怎样结识 Hutool 的,但 Hutool 伴随几个项目的推进,获得了同事一致好评. 没经过实践和 ...

  9. SQL Server里如何处理死锁

    在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL ...

  10. 【算法】解析IEEE 754 标准

    目录结构: contents structure [-] 浮点数的存储过程 次正规数(Denormalized Number) 零(zero) 非数值(NaN) 无穷大(infinity) 除数为0. ...