题意

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]凸轮廓线的更多相关文章

  1. [CERC2016]:凸轮廓线Convex Contour(模拟+数学)

    题目描述 一些几何图形整齐地在一个网格图上从左往右排成一列.它们占据了连续的一段横行,每个位置恰好一个几何图形.每个图形是以下的三种之一:$1.$一个恰好充满单个格子的正方形.$2.$一个内切于单个格 ...

  2. [bzoj4796][CERC2016]Key Knocking_乱搞

    Key Knocking bzoj-4796 CERC-2016 题目大意:描述没有题面短系列..题目链接 注释:$1\le n\le 10^5$. 想法: 乱搞稳AC.考试的时候调试信息又一次杀死了 ...

  3. 【CERC2016】【BZOJ4792】村庄 搜索

    题目大意 有一个 \(2^n\times 2^n\) 的网格,左下角坐标为 \((0,0)\),右上角坐标为 \((2^n,2^n)\). 定义格点 \((x,y)\) 为坐标系中坐标为 \((x,y ...

  4. [CERC2016]机棚障碍 Hangar Hurdles(kruskal重构树+树上倍增)

    题面 \(solution:\) 某蒟蒻的心路历程: 这一题第一眼感觉很奇怪 带障碍物的图,最大的集装箱? 首先想到的就是限制我集装箱大小条件的是什么: 如果我要在某一个点上放一个集装箱且使它最大, ...

  5. BZOJ.4793.[CERC2016]Hangar Hurdles(Kruskal重构树 BFS)

    题目链接 \(Description\) 有一个\(n\times n\)的正方形网格,上面有若干障碍点.\(q\)次询问,每次询问把一个正方形箱子从\((x1,y1)\)推到\((x2,y2)\) ...

  6. 洛谷 P3684 机棚障碍Hangar Hurdles [CERC2016] 图论

    正解: 解题报告: 传送门! 首先不难想到这题主要有两个问题需要解决,一个是预处理出各个点的箱子半径最大值,一个是求ans 然后分别港下QwQ 首先关于预处理要说下昂 预处理有三种方法,分别港下 第一 ...

  7. LG3684 [CERC2016]机棚障碍 Hangar Hurdles

    题意 题目描述 你正在评估一些关于一个巨型飞机仓库的建设计划.飞机仓库的地面可以表示为n行n列的网格图,其中每个格子要么是空的,要么有障碍物.行从上到下依次被编号为1到n,列从左到右依次被编号为1到n ...

  8. CERC2016 爵士之旅 Jazz Journey

    传送门(洛谷) 题目大意 给定$n$个位置,和一个长为$m$的序列$A$,你需要经过一条直接的边从第$A_i$个位置到第$A_{i+1}$个位置. 每条有向边$(u,v)$分为两种,第一种可以花费$C ...

  9. bzoj 4788: [CERC2016]Bipartite Blanket【hall定理+状压】

    考虑当前合法的一个点集s,如果他合法,那么一定有一个完备匹配的点集包含这个点集,也就是两边都满足hall定理的话这两边拼起来的点集也满足要求 所以分别状压两边点集用hall定理转移判断当前点集是否合法 ...

随机推荐

  1. jdbc的URL配置

    Microsoft SQL ServerMicrosoft SQL Server JDBC Driver (一般用来连接 SQLServer 2000)驱动程序包名:msbase.jar mssqls ...

  2. struts2中的数据类型自动转换

    参考:https://blog.csdn.net/qq_35326718/article/details/72453042 https://www.cnblogs.com/aigeileshei/p/ ...

  3. 洛谷$P4040\ [AHOI2014/JSOI2014]$宅男计划 贪心

    正解:三分+贪心 解题报告: 传送门$QwQ$ 其实很久以前的寒假就考过了,,,但那时候$gql$没有好好落实,就只写了个二分,并没有二分套三分,就只拿到了$70pts$ #include <b ...

  4. php strcmp函数漏洞

    strcmp函数漏洞 适用5.3版本以前的php 函数作用:字符串比较 要求传入字符串.如果传入非字符串呢? 结果函数报错!但是函数返回“0”  . 虽然报错了但函数的判断却是“相等” 如何传入非字符 ...

  5. 「洛谷P3931」 SAC E#1 - 一道难题 Tree

    P3931 SAC E#1 - 一道难题 Tree 题目背景 冴月麟和魏潇承是好朋友. 题目描述 冴月麟为了守护幻想乡,而制造了幻想乡的倒影,将真实的幻想乡封印了.任何人都无法进入真实的幻想乡了,但是 ...

  6. 结合docker发布后端项目(基于gradle包管理)的shell脚本

    结合docker发布后端项目(基于gradle包管理)的shell脚本 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统(敏感信息都进行了处理) 目前主流的 ...

  7. 微信小程序之猜拳游戏

    ---恢复内容开始--- 最近几天在学习小程序,看了网上的学习视频,于是自己捣鼓着做出了视频里面的小程序. 这是实现的效果图 一个小程序页面,一般有三个部分文件组成,index.js 这个文件里面放的 ...

  8. mock造数据

    前端开发,需要和后台联调:很多时候,前端开发并不需要等后台完全写好接口在去联调,自己可以写死数据,渲染数据,加样式.后台人员有时会很忙,他没有时间写好返回所有的数据等等,特别是新开一个项目,从零开始的 ...

  9. MapInfo常见数据格式

    在MapInfo 中所指的表是单纯的数据表或是图形与数据的结合.一个典型的MapInfo表将主要由*.tab.*.dat.*.wks.*.dbf.*.xls.*.map.*.id.*.ind文件格式组 ...

  10. 公司没有 DBA,Mysql 运维自己来

    如果你的公司有 DBA,那么我恭喜你,你可以无视 Mysql 运维.如果你的公司没有 DBA,那你就好好学两手 Mysql 基本运维操作,行走江湖,防身必备. 环境:CentOS7 版本: 一.虚拟机 ...