题目大意:有$n$张一模一样的信用卡,每个角进行了圆滑处理,问这些卡组成的“凸包”的周长

题解:发现是圆滑处理的圆心围成的凸包加上一个圆周即可

卡点:输入长宽弄反,然后以为是卡精

C++ Code:

#include <algorithm>
#include <cstdio>
#include <cmath>
#include <iomanip>
#include <iostream>
#define maxn 10010
const double Pi = acosl(-1); struct Point {
long double x, y;
Point() { }
Point(long double __x, long double __y) : x(__x), y(__y) { } inline long double operator ^ (const Point &rhs) const {
return x * rhs.y - y * rhs.x;
}
inline Point operator + (const Point &rhs) const {
return Point(x + rhs.x, y + rhs.y);
}
inline Point operator - (const Point &rhs) const {
return Point(x - rhs.x, y - rhs.y);
}
inline Point rotate(long double theta) {
const long double Sin = sinl(theta), Cos = cosl(theta);
return Point(x * Cos - y * Sin, x * Sin + y * Cos);
}
} s[maxn << 2], O, v[maxn << 2];
inline long double abs2(const Point &x) { return x.x * x.x + x.y * x.y; }
inline long double dis(const Point &lhs, const Point &rhs) { return sqrtl(abs2(lhs - rhs)); }
inline long double det(const Point &O, const Point &lhs, const Point &rhs) {
return (lhs - O) ^ (rhs - O);
}
inline bool cmp(const Point &x, const Point &y) {
static Point X, Y; X = x - O, Y = y - O;
static long double tmp; tmp = X ^ Y;
return (tmp > 0) || (tmp == 0 && abs2(X) < abs2(Y));
} int n, tot;
long double ans, A, B, R;
int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
std::cin >> n >> A >> B >> R; ans = 2 * R * Pi;
A /= 2, B /= 2, A -= R, B -= R;
for (int i = 0; i < n; ++i) {
static long double x, y, theta;
std::cin >> x >> y >> theta;
const Point t1 = Point(B, A).rotate(theta), t2 = Point(B, -A).rotate(theta), O(x, y);
s[tot++] = O - t1, s[tot++] = O + t1;
s[tot++] = O - t2, s[tot++] = O + t2;
}
int miny = 0;
for (int i = 0; i < tot; ++i)
if (s[i].y < s[miny].y || (s[i].y == s[miny].y && s[i].x < s[miny].x)) miny = i;
std::swap(s[0], s[miny]); O = s[0];
std::sort(s + 1, s + tot, cmp);
n = tot, tot = 3;
v[0] = s[0], v[1] = s[1], v[2] = s[2];
for (int i = 3; i < n; ++i) {
Point *a = v + tot - 2, *b = v + tot - 1;
while (tot > 2 && det(*a, *b, s[i]) <= 0) {
--tot, --a, --b;
}
v[tot++] = s[i];
}
for (int i = 1; i < tot; ++i) ans += dis(v[i - 1], v[i]);
ans += dis(v[0], v[tot - 1]);
std::cout << std::fixed << std::setprecision(2) << ans << '\n';
return 0;
}

  

[洛谷P3829][SHOI2012]信用卡凸包的更多相关文章

  1. luogu P3829 [SHOI2012]信用卡凸包 凸包 点的旋转

    LINK:信用卡凸包 当 R==0的时候显然是一个点的旋转 之后再求凸包即可. 这里先说点如何旋转 如果是根据原点旋转的话 经过一个繁杂的推导可以得到一个矩阵. [cosw,-sinw] [sinw, ...

  2. P3829 [SHOI2012]信用卡凸包

    思路 注意到结果就是每个信用卡边上的四个圆心的凸包周长+一个圆的周长 然后就好做了 注意平行时把距离小的排在前面,栈中至少要有1个元素(top>1),凸包中如果存在叉积为0的点也要pop,否则可 ...

  3. 【BZOJ2829】[SHOI2012]信用卡凸包(凸包)

    [BZOJ2829][SHOI2012]信用卡凸包(凸包) 题面 BZOJ 洛谷 题解 既然圆角的半径都是一样的,而凸包的内角和恰好为\(360°\),所以只需要把圆角的圆心弄下来跑一个凸包,再额外加 ...

  4. [SHOI2012]信用卡凸包(凸包+直觉)

    这个题还是比较有趣. 小心发现,大胆猜想,不用证明! 我们发现所谓的信用卡凸包上弧的长度总和就是圆的周长! 然后再加上每个长宽都减去圆的直径之后的长方形的凸包周长即可! #include<ios ...

  5. Luogu-3829 [SHOI2012]信用卡凸包

    这道题的转化很巧妙,可以把信用卡四个角的圆心看做平面上的点来做凸包,\(ans\)就是凸包周长加上一个圆的周长 // luogu-judger-enable-o2 #include<cmath& ...

  6. [SHOI2012]信用卡凸包(计算几何)

    /* 考验观察法?? 可以发现最终答案等于所有作为圆心的点求出凸包的周长加上一个圆的周长 向量旋转 (x1, y1) 相较于 (x2, y2) 旋转角c 答案是 (dtx * cosc - dty * ...

  7. 洛谷——P3833 [SHOI2012]魔法树

    P3833 [SHOI2012]魔法树 题目背景 SHOI2012 D2T3 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的 ...

  8. 洛谷3833 [SHOI2012]魔法树

    SHOI2012 D2T3 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节点0是根节点 ...

  9. 洛谷 P3833 [SHOI2012]魔法树

    题目背景 SHOI2012 D2T3 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节点 ...

随机推荐

  1. Kubernetes集群部署篇( 一)

    K8S集群部署有几种方式:kubeadm.minikube和二进制包.前两者属于自动部署,简化部署操作,我们这里强烈推荐初学者使用二进制包部署,因为自动部署屏蔽了很多细节,使得对各个模块感知很少,非常 ...

  2. 从零开始的Python学习Episode 16——模块

    一.模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相 ...

  3. Plasma Cash 合约解读

    作者介绍 虫洞社区·签约作者 steven bai Plasma Cash 合约解读 Plasma Cash 合约解读 1. 合约代码 2. 合约文件简单介绍 3. Plasma Cash 的基础数据 ...

  4. nginx 在ubuntu上使用笔记(绑定域名)

    1. 重启nginx的两个语句: sudo service nginx restart sudo nginx -s reload 2. nginx配置文件路径: etc/nginx/ 尤其是 site ...

  5. Struts2 核心流程

    1.Struts2架构图  这是Struts2官方站点提供的Struts 2 的整体结构.  执行流程图 2.Struts2部分类介绍  这部分从Struts2参考文档中翻译就可以了. ActionM ...

  6. 【转】 MATLAB下如何指定GPU资源

    [转] MATLAB下如何指定GPU资源 原文链接

  7. SpringMVC(二)-- springmvc的系统学习之跳转结果的方式

    资源: 尚学堂   邹波  springmvc框架视频 若无特别注明,例子项目的配置方式为注解 一.设置ModelAndView对象. 1.根据View的名称和视图解析器跳转到指定的页面. 2.跳转的 ...

  8. “吃神么,买神么”的第一个Sprint计划(第四天)

    “吃神么,买神么”项目Sprint计划 ——5.24  星期日(第四天)立会内容与进度 摘要:logo做出来了,但是在立会展示时遭到反对,不合格,重新设计.(附上失败的logo图) 目前搜索栏出来了, ...

  9. Week4-作业1:《构建之法》第四章、第十七章 阅读笔记与思考

    第四章 两人合作   这一章是讲述了两人结对编程的一些东西,包括一些代码的规范,还有结对编程的优点.怎么做.以及一些注意事项. 1.“错误处理 当程序的主要功能实现后,一些程序员会乐观地估计只需要另外 ...

  10. grunt入门讲解5:创建插件,安装Grunt以及常见问题

    创建插件 创建插件主要有以下几个步骤: (1)通过 npm install -g grunt-init 命令安装 grunt-init .(2)通过 git clone git://github.co ...