题意

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. Spring MVC 模拟

    在Spring MVC中,将一个普通的java类标注上Controller注解之后,再将类中的方法使用RequestMapping注解标注,那么这个普通的java类就够处理Web请求,示例代码如下: ...

  2. 第二阶段:2.商业需求分析及BRD:4.产品需求分析总结

    产品的需求筛选 战略定位要考虑公司的战略问题.产品定位要分阶段,各个阶段的需求不同. 其实现在需求分析跟筛选都是非常快的. 不把需要当成需求,意思就是不要用户说需要什么就是什么,用户需要引导. 先分类 ...

  3. 一款类似loadRunner的优秀国产压力测试工具——kylinTOP测试与监控平台

    市面上流行的压力/负载/性能测试工具多是来自国外,近年来国内的性能测试工具也如雨后春笋般崛起,但大部分产品是基于Jmeter开源内核包装起来的性能测试工具,其中也不乏佼佼者,如:kylinTOP测试与 ...

  4. [梁山好汉说IT] 梁山好汉和抢劫银行

    [梁山好汉说IT] 梁山好汉和抢劫银行 0x00 摘要 今天看了一篇文章<史上最有学问的银行劫匪,教你如何把握人生重大机会>.先摘录精华如下,然后看看梁山好汉在类似情况下如何处理 (东京汴 ...

  5. HashMap、lru、散列表

    HashMap HashMap的数据结构:HashMap实际上是一个数组和链表("链表散列")的数据结构.底层就是一个数组结构,数组中的每一项又是一个链表. hashCode是一个 ...

  6. linux大盘格式化分区

    Linux 实例的磁盘管理 对于 Linux 系统上的大磁盘,也要采用 GPT 分区格式, 也可以不分区, 把磁盘当成一个整体设备使用. 在 Linux 上一般采用 XFS 或者 EXT4 来做大盘的 ...

  7. Acunetix 11 配置详解

    Acunetix 扫描配置 Full Scan– 使用Full Scan来发起一个扫描的话,Acunetix会检查所有可能得安全漏洞. High Rish Vulnerabilities–这个扫描选项 ...

  8. 【汇编】AX内容依次倒排序

    ;P99,5.13,ax内容倒序 ;思路,ax左移一位最高位进cf里,bx右移一位把cf里值进bx的最高位, ;循环16次即实现ax16位内容倒序存储在bx中 DATA SEGMENT DATA EN ...

  9. 【转】7本免费的Java电子书和教程

    本文由 ImportNew - 唐小娟 翻译自 Javapapers.如需转载本文,请先参见文章末尾处的转载要求. 1. Thinking in Java (Third Edition) 本书的作者是 ...

  10. 图解kubernetes scheduler基于map/reduce无锁设计的优选计算

    优选阶段通过分离计算对象来实现多个node和多种算法的并行计算,并且通过基于二级索引来设计最终的存储结果,从而达到整个计算过程中的无锁设计,同时为了保证分配的随机性,针对同等优先级的采用了随机的方式来 ...