【BZOJ1913】[Apio2010]signaling 信号覆盖

题意:一个平面上n个点,随机选3个点构成一个圆,问期望有多少个点在这个圆内。数据保证没有4点共圆、3点共线和重点。

认为比较难想到

因为是等概率选择,所以只要求所有情况包含的点总数

在所有C(n, 3)种情况中,每个被圆包含的点都可以对应到一个四边形上

因此求出凸四边形和凹四边形的个数就可以算出答案

1.对于凸四边形有两种方法可以包含4个点

2.对于凹四边形只有一种方法可以包含4个点

ans = (2 * Q + P) / C(n, 3) + 3

#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
#define V P
const double eps = 1e-9;
inline int dcmp (const double& x) {
    return x < -eps ? -1 : x > eps;
}
struct P {
    double x, y;
    void scan() {
        scanf("%lf%lf", &x, &y);
    }
    P(double x = 0, double y = 0) : x(x), y(y) { }
    V operator + (const V& a) const {
        return V(x + a.x, y + a.y);
    }
    V operator - (const V& a) const {
        return V(x - a.x, y - a.y);
    }
    V operator * (const double& p) const {
        return V(p * x, p * y);
    }
    V operator / (const double& p) const {
        return V(x / p, y / p);
    }
    bool operator < (const P& a) const {
        return x < a.x || (dcmp(x - a.x) == 0 && y < a.y);
    }
    bool operator == (const P& a) const {
        return dcmp(x - a.x) == 0 && dcmp(y - a.y) == 0;
    }
};

inline double dot(const V& a, const V& b) {
    return a.x * b.x + a.y * b.y;
}
inline double len(const V& a) {
    return sqrt(dot(a, a));
}
inline double dis(const P& a, const P& b) {
    return len(b - a);
}
inline double ang(const V& a, const V& b) {
    return acos(dot(a, b) / len(a) / len(b));
}
inline double cross(const V& a, const V& b) {
    return a.x * b.y - a.y * b.x;
}
inline int get(const P& a) {
    if( a.x > 0 && a.y >= 0) return 1;
    if( a.x <= 0 && a.y > 0) return 2;
    if( a.x < 0 && a.y <= 0) return 3;
    if( a.x >= 0 && a.y < 0) return 4;
    return 0;
}
inline bool cmp (const V& a, const V& b) {
    return get(a) < get(b) || (get(a) == get(b) && dcmp( cross(a, b) ) >0);

}
const int N = 2100;
P p[N], b[N];
int n;
typedef long long LL;
LL res[N];
LL solve(int n, P* p) {
    for (int i = 1; i <= n; i ++)
        p[i] = p[i] - p[0];
    sort(p + 1, p + 1 + n, cmp);
    for (int i = 1; i <= n; i ++)
        p[i - 1] = p[i];
    int ed = 0, sum = 0;
    LL z = 0;
    for (int i = 0; i < n; i ++) {
        while(dcmp(cross(p[i], p[(ed + 1) % n])) == 1) ed = (ed + 1) % n, sum ++;
        //printf("%d\n", sum);
        z += sum * (sum - 1) / 2;
        if (ed != i) sum --;
        else ed ++, sum = 0;
    }
    //printf("z: %I64d\n", z);
    z = (LL)n * (n - 1) * (n - 2) / 6 - z;
    //printf("z: %I64d\n", z);
    return z;
}
LL t;
int main() {
    freopen("a.in", "r", stdin);
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++)
        p[i].scan();
    LL P = 0, Q = 0;
    for (int i = 1; i <= n; i ++) {
        int cnt = 0;
        for (int j = 1; j <= n; j ++)
            if (j != i)
                b[++ cnt] = p[j];
        b[0] = p[i];
        P += solve(n - 1, b);
    }
    Q = (LL)n * (n - 1) * (n - 2) * (n - 3) / 24 - P;
    t = (LL)n * (n - 1) * (n - 2) / 6;
    printf("%.6lf\n", 1.0 * (2 * Q + P) / t + 3);
    return 0;
}
时间: 2024-10-24 12:02:59

【BZOJ1913】[Apio2010]signaling 信号覆盖的相关文章

BZOJ1913: [Apio2010]signaling 信号覆盖

1913: [Apio2010]signaling 信号覆盖 Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1502  Solved: 615[Submit][Status][Discuss] Description Input 输入第一行包含一个正整数 n, 表示房子的总数.接下来有 n 行,分别表示 每一个房子的位置.对于 i = 1, 2, .., n, 第i 个房子的坐标用一对整数 xi和yi来表 示,中间用空格隔开. Output 输出文

【BZOJ 1913】 [Apio2010]signaling 信号覆盖

1913: [Apio2010]signaling 信号覆盖 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 639 Solved: 255 [Submit][Status][Discuss] Description Input 输入第一行包含一个正整数 n, 表示房子的总数.接下来有 n 行,分别表示 每一个房子的位置.对于 i = 1, 2, .., n, 第i 个房子的坐标用一对整数 xi和yi来表 示,中间用空格隔开. Output 输出文件

【bzoj1913】 Apio2010—signaling 信号覆盖

http://www.lydsy.com/JudgeOnline/problem.php?id=1913 (题目链接) 题意 给出一个平面上n个点,求任选3个点画一个圆所包含的点的期望值. Solution 这个问题可以转化为凹凸多边形的问题求解(当然我是没想到的)..左转题解:http://blog.csdn.net/regina8023/article/details/45556321 细节 注意存放极角的数组要开成2倍. 代码 // bzoj1913 #include<algorithm>

[BZOJ1911][BZOJ1912][BZOJ1913]APIO2010解题报告

特别行动队 Description 这个好像斜率优化不是一般地明显了啊...只不过要分a的正负两种情况考虑是维护上凸还是下凸 1 /************************************************************** 2 Problem: 1911 3 User: mjy0724 4 Language: C++ 5 Result: Accepted 6 Time:1688 ms 7 Memory:24248 kb 8 *******************

联想全球总部(北京)地下停车场FM调频广播信号覆盖系统顺利开通运行

联想总部办公大楼联想全球总部新园区位于北京中关村软件园,总建筑面积22万平方米,可同时容纳10000多名员工办公.联想集团全球总部的运营管理和研发部门入驻新园区.新园区地下停车场共两层,近1000个停车位,本次将5套FM广播信号引入地下停车场.车辆驶入停车场内,可清楚地听到87.6MHz.88.7MHz.97.4MHz.103.9MHz.106.6MHz等5套FM广播信号,系统最终可扩容至20套光信号覆盖.此系统由接收天线.数字选频器.光纤拉远系统.微蜂窝直放站.发射天线等组成,目前系统已经开通

机场地下停车场FM广播信号覆盖

(北京恒星科通科技发展有限公司http://www.bjhxkt.com010-82565576 13810952040)一.高铁站地下停车场FM广播信号覆盖系统概述21世纪之交对中国而言,是一个大变革大发展大融合的年代,中国的汽车工业飞速前进,随着人民生活水平的提高,汽车由政府部门和权贵象征走入千家万户,逐步成为工薪阶层的代步工具.由于城市土地资源的宝贵和紧缺,地下停车场如雨后春笋应运而生,成为机场.火车站.商场.写字楼.居民区和企事业单位不可或缺的配套建筑,地下停车场设计越来越先进,规模越来

高铁站地下停车场FM广播信号覆盖方案

(北京恒星科通科技发展有限公司http://www.bjhxkt.com010-82565576 13810952040)一.高铁站地下停车场FM广播信号覆盖系统概述21世纪之交对中国而言,是一个大变革大发展大融合的年代,中国的汽车工业飞速前进,随着人民生活水平的提高,汽车由政府部门和权贵象征走入千家万户,逐步成为工薪阶层的代步工具.由于城市土地资源的宝贵和紧缺,地下停车场如雨后春笋应运而生,成为机场.火车站.商场.写字楼.居民区和企事业单位不可或缺的配套建筑,地下停车场设计越来越先进,规模越来

无线覆盖方案该如何选择

随着信息科技的发展,网络已经成为了人们生活中不可缺少的一部分.以前,人们使用手机作用只有三点,看时间,打电话,发短信.如今,手机已成为了一个缩小版的电脑,上QQ,玩微信,翻网页,看新闻.以前说到上网人们第一反应是电脑,如今已经成为了手机,现在人手一部手机已成为必然.然而这种种,都有一个前提,就是有稳定的网络. 早几年,一些服务场所,餐饮场所为吸引客户,都在门口张贴上"冷气开发"的标识,然而空调是有季节性的,只有在夏天才有效,而如今,精明的商家都已换成了"WIFI已覆盖&quo

南京大发燕澜湾室外WLAN覆盖项目建议书

  南京大发燕澜湾室外WLAN覆盖项目建议书 项目名称:                                南京大发燕澜湾室外WLAN覆盖项目建议书 项目管理单位: 项目联系人: 联系人电话: 工程建设单位 维护管理单位 申报日期: 2014年12月1日 目录 一.需求分析...........................................................................................................