[CERC2016]凸轮廓线
题意
https://www.luogu.org/problem/P3680
思考
拆点即可。
注意精度。
代码
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
typedef long double ld;
const ld eps=1E-;
const ld pi=acos(-);
const ld inf=1E9;
inline bool equal(ld x,ld y)
{
return abs(x-y)<=eps;
}
struct pt
{
ld x,y;
pt(ld a=,ld b=){x=a,y=b;}
pt operator+(const pt&A){return pt(x+A.x,y+A.y);}
pt operator-(const pt&A){return pt(x-A.x,y-A.y);}
pt operator*(ld d){return pt(x*d,y*d);}
pt operator/(ld d){return pt(x/d,y/d);}
ld operator*(const pt&A){return x*A.y-y*A.x;}
void out(){cout<<"("<<x<<","<<y<<")";}
};
struct line
{
pt A,B;
line(pt a=pt(),pt b=pt())
{
A=a,B=b;
}
};
inline int cross(pt A,pt B)
{
ld d=A*B;
if(equal(d,))
return ;
return d>?:-;
}
inline ld dis(pt A,pt B)
{
return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
}
inline pt intersection(line a,line b)
{
pt A=b.B-b.A,B=a.B-a.A,C=b.A-a.A;
if(cross(A,B)==)
return pt(inf,inf);
ld d=-(B*C)/(B*A);
return b.A+A*d;
}
inline pt foot(pt A,line a)
{
return intersection(line(A,A+pt(a.B.y-a.A.y,a.A.x-a.B.x)),a);
}
inline bool seg(line a,line b)
{
return cross(a.A-b.A,b.B-b.A)*cross(a.B-b.A,b.B-b.A)==-&&
cross(b.A-a.A,a.B-a.A)*cross(b.B-a.A,a.B-a.A)==-;
}
pt O(,);
bool cmp(pt A,pt B)
{
ld x=atan2(A.y-O.y,A.x-O.x),y=atan2(B.y-O.y,B.x-O.x);
if(equal(x,y))
return dis(A,O)<dis(B,O);
return x<y;
}
vector<pt>convex(vector<pt>P)
{
int pos=;
for(int i=;i<P.size();++i)
if(P[i].x<P[pos].x)
pos=i;
swap(P[pos],P[]);
O=P[];
sort(P.begin()+,P.end(),cmp);
vector<pt>ans;
int now=;
for(int i=;i<P.size();++i)
{
while(now>&&cross(P[i]-ans[now-],ans[now-]-ans[now-])!=-)
ans.pop_back(),--now;
ans.push_back(P[i]);
++now;
}
return ans;
}
inline bool cmpLine(line a,line b)
{
return atan2(a.A.y-a.B.y,a.A.x-a.B.x)<atan2(b.A.y-b.B.y,b.A.x-b.B.x);
}
inline bool onClockwise(line a,line b,line c)//b,c的交点在a顺时针方向
{
return cross(intersection(b,c)-a.A,a.B-a.A)==;
}
inline bool isSame(line a,line b)
{
return cross(a.A-b.B,b.A-b.B)==;
}
line wait[];
vector<line>halfPlane(vector<line>A)
{
vector<line>ans;
sort(A.begin(),A.end(),cmpLine);
int l=,r=;
for(int i=;i<A.size();++i)
{
while(l<r&&!isSame(A[i],wait[r])&&onClockwise(A[i],wait[r-],wait[r]))
--r;
while(l<r&&!isSame(A[i],wait[l])&&onClockwise(A[i],wait[l],wait[l+]))
++l;
if(!isSame(A[i],wait[r])||r==)
wait[++r]=A[i];
else if(!onClockwise(wait[r],wait[r-],A[i]))
wait[r]=A[i];
}
while(l<r&&onClockwise(wait[l],wait[r],wait[r-]))
--r;
while(l<r&&onClockwise(wait[r],wait[l],wait[l+]))
++l;
for(int i=l;i<=r;++i)
ans.push_back(wait[i]);
return ans;
}
inline ld length(vector<pt>P)
{
ld sum=;
for(int i=;i<P.size();++i)
sum+=dis(P[i-],P[i]);
sum+=dis(P[P.size()-],P[]);
return sum;
}
const ld base=;
int main()
{
ios::sync_with_stdio(false);
int n;
cin>>n;
vector<pt>P;
for(int i=;i<=n;++i)
{
char ch;
cin>>ch;
ld x=i;
if(ch=='S')
{
P.push_back(pt(x,));
P.push_back(pt(x+,));
P.push_back(pt(x+,));
P.push_back(pt(x,));
}
else if(ch=='T')
{
P.push_back(pt(x,));
P.push_back(pt(x+,));
P.push_back(pt(x+0.5,sqrt()/));
}
else
{
for(ld j=;j<base;j+=)
{
ld ra=*pi/base*j;
P.push_back(pt(x+0.5+cos(ra)/,0.5+sin(ra)/));
}
}
}
ld ans=length(convex(P));
cout<<fixed<<setprecision()<<ans<<endl;
return ;
}
[CERC2016]凸轮廓线的更多相关文章
- [CERC2016]:凸轮廓线Convex Contour(模拟+数学)
题目描述 一些几何图形整齐地在一个网格图上从左往右排成一列.它们占据了连续的一段横行,每个位置恰好一个几何图形.每个图形是以下的三种之一:$1.$一个恰好充满单个格子的正方形.$2.$一个内切于单个格 ...
- [bzoj4796][CERC2016]Key Knocking_乱搞
Key Knocking bzoj-4796 CERC-2016 题目大意:描述没有题面短系列..题目链接 注释:$1\le n\le 10^5$. 想法: 乱搞稳AC.考试的时候调试信息又一次杀死了 ...
- 【CERC2016】【BZOJ4792】村庄 搜索
题目大意 有一个 \(2^n\times 2^n\) 的网格,左下角坐标为 \((0,0)\),右上角坐标为 \((2^n,2^n)\). 定义格点 \((x,y)\) 为坐标系中坐标为 \((x,y ...
- [CERC2016]机棚障碍 Hangar Hurdles(kruskal重构树+树上倍增)
题面 \(solution:\) 某蒟蒻的心路历程: 这一题第一眼感觉很奇怪 带障碍物的图,最大的集装箱? 首先想到的就是限制我集装箱大小条件的是什么: 如果我要在某一个点上放一个集装箱且使它最大, ...
- BZOJ.4793.[CERC2016]Hangar Hurdles(Kruskal重构树 BFS)
题目链接 \(Description\) 有一个\(n\times n\)的正方形网格,上面有若干障碍点.\(q\)次询问,每次询问把一个正方形箱子从\((x1,y1)\)推到\((x2,y2)\) ...
- 洛谷 P3684 机棚障碍Hangar Hurdles [CERC2016] 图论
正解: 解题报告: 传送门! 首先不难想到这题主要有两个问题需要解决,一个是预处理出各个点的箱子半径最大值,一个是求ans 然后分别港下QwQ 首先关于预处理要说下昂 预处理有三种方法,分别港下 第一 ...
- LG3684 [CERC2016]机棚障碍 Hangar Hurdles
题意 题目描述 你正在评估一些关于一个巨型飞机仓库的建设计划.飞机仓库的地面可以表示为n行n列的网格图,其中每个格子要么是空的,要么有障碍物.行从上到下依次被编号为1到n,列从左到右依次被编号为1到n ...
- CERC2016 爵士之旅 Jazz Journey
传送门(洛谷) 题目大意 给定$n$个位置,和一个长为$m$的序列$A$,你需要经过一条直接的边从第$A_i$个位置到第$A_{i+1}$个位置. 每条有向边$(u,v)$分为两种,第一种可以花费$C ...
- bzoj 4788: [CERC2016]Bipartite Blanket【hall定理+状压】
考虑当前合法的一个点集s,如果他合法,那么一定有一个完备匹配的点集包含这个点集,也就是两边都满足hall定理的话这两边拼起来的点集也满足要求 所以分别状压两边点集用hall定理转移判断当前点集是否合法 ...
随机推荐
- keil中使用_at_绝对地址定位问题
最近在做51单片机的时候,看到程序中某头文件有这样一段: 其中,_at_的作用就是将变量限定存放在指定的RAM空间.比如在这个单片机头文件中,就是将变量P00F,P01F分别存到Addr(0x8000 ...
- 博客同步到CSDN客户端
同步本人博客到CSDN客户端 http://blog.csdn.net/johnnyz1234
- OPEN GL
https://blog.csdn.net/cdut100/article/details/45753227 https://www.jianshu.com/p/d22cf555de47 https: ...
- 记一次linux磁盘清理 - 已经删除的文件占用了大量磁盘空间
今天开发环境磁盘占满了,导致开发环境上的 nginx .redis 等组件总是报异常. 跳到系统根目录下 cd / 检查磁盘占用情况 df -h 哇,40G硬盘全用完了.看看是哪些文件占了那么多内存. ...
- $Poj2376\ Poj3171\ Luogu4644\ Cleaning\ Shifts$ 数据结构优化$DP$
$Poj$ $AcWing$ $Luogu$ $ps:$洛谷题目与$Poj$略有不同,以下$Description$是$Poj$版.题目的不同之处在于洛谷中雇用奶牛的费用不相同,所以不可以 ...
- 计算机组成原理(下)第8章 CPU的结构和功能测试
1.单选(1分) 以下关于指令周期的描述正确的是___ A.CPU保存一条指令的时间 B.CPU执行一条指令的时间 C.CPU取出并执行一条指令所需的全部时间 D.CPU从主存取出一条指令的时间 正确 ...
- yarn详细入门教程(转载)
简介Yarn 是 Facebook, Google, Exponent 和 Tilde 开发的一款新的 JavaScript 包管理工具.就像我们可以从官方文档了解那样,它的目的是解决这些团队使用 n ...
- C# WPF 嵌入网页版WebGL油田三维可视化监控
0x00 楔子 最近做的一个项目,是一个油田三维可视化监控的场景编辑和监控的系统,和三维组态有些类似,不过主要用于油田上. 效果如下图所示: 首先当然是上模型,设计人员跟进. 有了相关的模型,使用我们 ...
- js中排序方法sort() 和 reverse()
reverse() 作用:反转原数组. 用法: array.reverse(); 图解: sort() 作用:对原数组进行排序.默认将每个数组项 先 转换为字符串 再 进行字符串对比后升序排序. 用法 ...
- acmPush模块示例demo
感谢论坛版主 马浩川 的分享. 模块介绍: 阿里移动推送(Alibaba Cloud Mobile Push)是基于大数据的移动智能推送服务,帮助App快速集成移动推送的功能,在实现高效.精确.实时 ...