gym101808 E
提问:我是什么品种的傻逼?
哇看到积水兴高采烈啊。然后就走上了一条不归路。
为什么不归呢,因为我这个法子就是不对的,我总是在想很多很多点围成的一块区域,然后求这一块区域的面积。
然后尝试了各种扫描方法,递增序列,找最低,找最高啊什么的。
自闭。
搜题解:考虑所有相邻的两个点,和他们两边的制高点。那么面积可能是 梯形(制高点高),直角三角形(相交),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的更多相关文章
随机推荐
- pygame 笔记-3 角色动画及背景的使用
上二节,已经知道如何控制基本的运动了,但是只有一个很单调的方块,不太美观,本节学习如何加载背景图,以及角色的动画. 素材准备:(原自github) 角色动画的原理:动画都是一帧帧渲染的,比如向左走的动 ...
- JS如何判断浏览器类型和详细区分IE各版本浏览器
/* * 描述:判断浏览器信息 * 编写:LittleQiang_w * 日期:2016.1.5 * 版本:V1.1 */ //判断当前浏览类型 function BrowserType() { va ...
- HEVC与VP9之间的对比
在streamingmedia上看到的一篇对比HEVC与VP9的文章,挺不错.另外这边文章的几个comment也是不错的. 下面是全文. The Great UHD Codec Debate: G ...
- Android的Databinding-数据、Map绑定
本节主要说Collection的字符串数组.List.SparseArray.Map的绑定.先看看xml的布局. <layout xmlns:android="http://schem ...
- mysql select into 不支持
不支持的 select * into order_new from orders 改为 Create table order_new(select * from orders)
- 机械臂——arduino、marlin固件、printrun软件【转】
最近了解到,在市面上大多数机械臂控制都采用的arduino这个开源硬件来控制的,而我发现既然会单片机,就没有必要采用arduino来控制了,arduino只是一种为了简化编程而开发一种软硬件控制平台, ...
- js-重写jquery的ajax中的内容
/** * 测试 * 2018/1/8 13:40 lee.wangel */ (function($){ //备份jquery的ajax方法 var _ajax=$.ajax; //重写jquery ...
- maven scope 范围讲解
解决办法: <dependency> <groupId>javax.servlet</groupId> <artifactId>java ...
- 目前流行前端几大UI框架
title: "Windows照片查看器-召回大法" categories: windows tags: windows author: LIUREN --- Windows照片查 ...
- Linux: Linux C 获取当前系统时间的时间戳(精确到秒、毫秒、微秒) gettimeofday
说明 获取当前的时间的秒数和微秒数本方法需要用到 gettimeofday() 函数,该函数需要引入的头文件是 <sys/time.h> . 函数说明 int gettimeofday ...