zoukankan      html  css  js  c++  java
  • BZOJ1043 [HAOI2008]下落的圆盘

    倒过来做,然后就变成了线段覆盖问题了。

    线段覆盖就是贪心即可。。。

    但是好烦好烦= =,需要耐心和几何基础2333

     1 /**************************************************************
     2     Problem: 1043
     3     User: rausen
     4     Language: C++
     5     Result: Accepted
     6     Time:240 ms
     7     Memory:872 kb
     8 ****************************************************************/
     9  
    10 #include <cstdio>
    11 #include <cmath>
    12 #include <algorithm>
    13  
    14 using namespace std;
    15 typedef double lf;
    16 typedef pair <lf, lf> Pair;
    17 const lf pi = 3.1415926536;
    18 const int N = 1005;
    19  
    20 struct point {
    21     lf x, y;
    22 };
    23 typedef point P;
    24  
    25 struct circle {
    26     P o;
    27     lf r;
    28 }a[N];
    29 typedef circle C;
    30  
    31 int n, tot;
    32 lf ans;
    33 Pair inter[N << 1];
    34  
    35 inline lf Sqr(lf x) {
    36     return x * x;
    37 }
    38  
    39 inline lf dist(const P & a, const P &b) {
    40     return sqrt(Sqr(a.x - b.x) + Sqr(a.y - b.y));
    41 }
    42  
    43 inline lf K(const P &a, const P &b) {
    44     return atan2(a.y - b.y, a.x - b.x);
    45 }
    46  
    47 void Calc (C O1, C O2, lf &dis) {
    48     lf alpha = K(O1.o, O2.o) + pi,
    49     delta = acos((Sqr(O1.r) + Sqr(dis) - Sqr(O2.r)) / (2 * O1.r * dis));
    50     Pair tmp = make_pair(alpha - delta, alpha + delta);
    51     if (tmp.first >= 0 && tmp.second <= 2 * pi)
    52         inter[++tot] = tmp; 
    53     else if (tmp.first < 0)
    54         inter[++tot] = make_pair(tmp.first + 2 * pi, 2 * pi),
    55         inter[++tot] = make_pair(0, tmp.second);
    56     else
    57         inter[++tot] = make_pair(tmp.first, 2 * pi),
    58         inter[++tot] = make_pair(0, tmp.second - 2 * pi);
    59 }
    60  
    61 lf Union() {
    62     int i;
    63     lf res = 0, st = -1, ed = -1;
    64     sort(inter + 1, inter + tot + 1);
    65     for (i = 1; i <= tot; ++i) {
    66         if (inter[i].first > ed) {
    67             res += ed - st;
    68             st = inter[i].first, ed = inter[i].second;
    69         } else
    70             ed = max(ed, inter[i].second);
    71     }
    72     res += ed - st;
    73     return 2 * pi - res;
    74 }
    75  
    76 int main() {
    77     int i, j;
    78     lf dis;
    79     scanf("%d
    ", &n);
    80     for (i = n; i; --i)
    81         scanf("%lf%lf%lf", &a[i].r, &a[i].o.x, &a[i].o.y);
    82     for (i = 1; i <= n; ++i) {
    83         tot = 0;
    84         for (j = 1; j < i; ++j) {
    85             dis = dist(a[i].o, a[j].o);
    86             if (a[j].r - a[i].r > dis) break;
    87             if (a[i].r + a[j].r > dis && fabs(a[i].r - a[j].r) < dis)
    88                 Calc(a[i], a[j], dis);
    89         }
    90         if (j == i)
    91             ans += Union() * a[i].r;
    92     }
    93     printf("%.3lf
    ", ans);
    94     return 0;
    95 }
    View Code
    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    springmvc,springboot单元测试配置
    uboot中ftd命令
    在根文件系统中查看设备树(有助于调试)
    协议类接口
    网络设备接口
    块设备驱动框架
    i2c子系统
    触摸屏
    input子系统
    原子访问、自旋锁、互斥锁、信号量
  • 原文地址:https://www.cnblogs.com/rausen/p/4121676.html
Copyright © 2011-2022 走看看