题意

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. 牛客多校第三场 G Removing Stones(分治+线段树)

    牛客多校第三场 G Removing Stones(分治+线段树) 题意: 给你n个数,问你有多少个长度不小于2的连续子序列,使得其中最大元素不大于所有元素和的一半 题解: 分治+线段树 线段树维护最 ...

  2. Oracle Net Manager 的使用方法(监听的配置方法)

    一,在服务端配置oracle端口 win+R  输入netca 弹出如下窗口后 选择监听程序配置,点击下一步 二.配置端口后使用Telnet工具调试端口是否联通 在命令行输入telnet 服务器ip ...

  3. CSDN博客 专用备份工具

    CSDN博客 专用备份工具 用要的朋友可下载. 本程序为个人所用,仅供学习.作者:潇湘博客网站:http://blog.csdn.NET/fkedwgwy默认文件存放位置为用户名文件夹下,也可以直接自 ...

  4. 【原创】http请求中加号被替换为空格?源码背后的秘密

    这是why技术的第**20**篇原创文章![在这里插入图片描述](https://user-gold-cdn.xitu.io/2019/12/30/16f550eb82e10eff?w=900& ...

  5. 最小生成树+LCA不能算最小环!!!!!!!

  6. Redis事务、持久化、发布订阅

    一.Redis事物 1. 概念 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他 ...

  7. 第一次看CCControl

    Control中有九种可能的事件,定义在.h文件中,另外还定义四种状态,用来表示控件高亮等. 在初始化控件的时候: bool Control::init() { if (Layer::init()) ...

  8. $CH0601\ Genius\ ACM$ 倍增优化DP

    ACWing Description 给定一个长度为N的数列A以及一个整数T.我们要把A分成若干段,使得每一段的'校验值'都不超过N.求最少需要分成几段. Sol 首先是校验值的求法: 要使得'每对数 ...

  9. Java函数式接口与Lambda表达式

    什么是函数式接口? 函数式接口是一种特殊的接口,接口中只有一个抽象方法. 函数式接口与Lambda表达式有什么关系? 当需要一个函数式接口的对象时,可以提供一个lambda表达式. package l ...

  10. SQLServer系统函数之字符串函数

    一.字符串函数 参数character_expression:由字符数据组成的字母数字表达式,可以是常量或变量,也可以是字符列或二进制数据列 参数integer_expression:是正整数,如果 ...