Problem A: 踢罐子 解题报告
Problem A: 踢罐子
Description
平面上有\(n\)个点,其中任意2点不重合,任意3点不共线。
我们等概率地选取一个点A,再在剩下的\(n-1\)个点中等概率地选取一个点B,再在剩下的\(n-2\)个点中等概率地选取一个点C。
然后我们计算伤害倍率\(d\)。作ABC外接圆,每一个位于弧BC和线段BC之间的点计1倍,每一个位于弧BC上的点(包括B,C两点)计1/2倍,特别的,点A计1倍。将这些倍率全部加起来得到伤害倍率\(d\)。
注意:弧BC是指,ABC外接圆上B到C而不包含点A的部分,这个弧不一定是劣弧。
给定这\(n\)个点的坐标,你需要求出\(d\)的期望。为了简单起见,你只需要输出\(d\times n\times (n-1)\times (n-2)\times 2\)的值,可以看出这是一个整数。
Input
第一行一个正整数\(n\)
接下来\(n\)行,每行2个整数\(x, y\),空格分隔,表示一个坐标。
Output
仅一行,一个数,表示\(d\times n\times (n-1)\times (n-2)\times 2\)的值。
HINT
对于40%的数据,n<=20。
对于60%的数据,n<=50。
对于80%的数据,n<=200。
对于100%的数据,3<=n<=1000。
对于100%的数据,xi和yi的绝对值不超过2000000000。
暴力需要求圆心,最后选择了列圆的方程高斯消元解的诡异办法,wjyyy神仙给出了一个向量的做法还没仔细看...
事实上这个题感觉思路不太自然。
先把处于顶点的贡献算好是\(4n(n-1)(n-2)\)。
然后四个点四个点讨论
发现如果四个点是凸边形,那么这四个点贡献8,否则不产生贡献。
问题转化成统计凸四边形个数了。
凸四边形两两连边后有4条边剩下两个点在异侧,2条边同侧
而凹的3异3同
可以先统计X个异侧,Y个同侧,然后列方程解凸四边形个数
统计的时候枚举一个点,然后极角排序另一个就可以了。
Code:
#include <cstdio>
#include <algorithm>
#include <cmath>
#define ll long long
const int N=2010;
const double pi=acos(-1);
int n,tot;ll X,Y;
double dx[N],dy[N],s[N];
ll cal(ll x){return x*(x-1)/2;}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lf%lf",dx+i,dy+i);
for(int i=1;i<=n;i++)
{
tot=0;
for(int j=1;j<=n;j++)
{
if(i!=j)
{
s[++tot]=atan2(dy[j]-dy[i],dx[j]-dx[i]);
if(s[tot]<0) s[tot]+=pi*2;
}
}
std::sort(s+1,s+1+tot);
for(int j=1;j<=tot;j++) s[j+tot]=s[j]+2*pi;
for(int j=1,k=1;j<=tot;j++)
{
while(k<=tot*2&&s[k]-s[j]<=pi) ++k;
int c1=k-j-1,c2=n-c1-2;
X+=1ll*c1*c2;//异
Y+=cal(c1)+cal(c2);//同
}
}
printf("%lld\n",(Y-X)*2+4ll*n*(n-1)*(n-2));
return 0;
}
2018.12.31
Problem A: 踢罐子 解题报告的更多相关文章
- ZOJ Problem Set - 1025解题报告
ZOJ Problem Set - 1025 题目分类:基础题 原题地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=10 ...
- ACM: A Simple Problem with Integers 解题报告-线段树
A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%lld & %l ...
- BestCoder18 1002.Math Problem(hdu 5105) 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5105 题目意思:给出一个6个实数:a, b, c, d, l, r.通过在[l, r]中取数 x,使得 ...
- Problem - 433C - Codeforces解题报告
对于这题本人刚开始的时候的想法是:先把最大两数差的位置找到然后merge计算一个值再与一连串相同的数做merge后计算一个值比较取最大值输出:可提交后发现不对,于是本人就搜了一下正解发现原来这题的正确 ...
- Problem A: 选举 解题报告
Problem A: 选举 题意 给出一个投票过程.有\(n\)个选民和\(m\)个候选人,每个选民\(i\)有个不重且有序的可投集合\(\{a_i\}\). 对于第一轮投票,选民\(i\)会投给\( ...
- Problem A: 种树 解题报告
Problem A: 种树 Description 很久很久以前,一个蒟蒻种了一棵会提问的树,树有\(n\)个节点,每个节点有一个权值,现在树给出\(m\)组询问,每次询问两个值:树上一组点对\((x ...
- Problem C: 多线程 解题报告
Problem C: 多线程 Description 多线程是一种常见的加速手段,利用多个线程同时处理不同的任务可以一定程度上减少总耗时,达到提高效率的目的.然而,多个线程间的执行顺序是完全不可控的, ...
- Problem B: 专家系统 解题报告
Problem B: 专家系统 Description 一个专家系统是指,你雇佣了\(n\)个专家,他们每个人会做出一个结果,然后你从中选取较多的专家的结果组合而成最终的结果.专家系统广泛应用于传统机 ...
- Problem C Dist 解题报告
Problem C Dist Description 有一个\(n\)个点带边权的连通无向图,边集用\(k\)个集合\(s_1,s_2,\dots,s_k\)和\(k\)个整数\(w_1,w_2,\d ...
随机推荐
- 大数据入门第十二天——sqoop入门
一.概述 1.sqoop是什么 从其官网:http://sqoop.apache.org/ Apache Sqoop(TM) is a tool designed for efficiently tr ...
- C++自学成长之路(第一篇)
今天开始我将开启C++自学成长之路,今天是第一天,在以前就一直在网上查找关于c++的资料,想买一本好一点的,权威一点的资料书,通过努力查找,我选择了c++ primer,在网上这本书的好评如潮.更多的 ...
- Selenium-ActionChainsApi接口详解
ActionChains 有时候我们在通过Selenium做UI自动化的时候,明明能够在DOM树内看到这个元素,但是我在通过driver click.sendkey的时候,就是点击不到或无法输入字符串 ...
- JavaScript组成—— DOM、BOM、ECMAScript
ECMAScript是JS的核心:提供核心语言功能 DOM(文档对象模型):提供访问和操作网页内容的方法和接口 BOM(浏览器对象模型):提供与浏览器交互的方法和接口 1. DOM(文档对象模型) 1 ...
- 手撸orm框架
一 前言 1 我在实例化一个user对象的时候,可以user=User(name='lqz',password='123') 2 也可以 user=User() user['name']='lqz' ...
- Markdown打造高逼格博客
这里首先假设读者你已经掌握了Markdown与GitHub的基本用法 如果不会, 请先自行百度或Google, 我目前还没写Markdown与GitHub的教程 看云只是一个推荐, 可以认为协助生成格 ...
- AngularJS + CoffeeScript 前端开发环境配置详解
AngularJS 号称 '第一框架' ('The first framework') 确实是名不虚传.由其从jQuery中完全转入AngularJS后就有无法离开他的感觉了.虽然AngularJS的 ...
- 微软职位内部推荐-Service Engineer for Office365
微软近期Open的职位: Key Responsibilities: The Service Engineer in this team will be responsible for plannin ...
- This is me
This is me 爱琴棋 爱书画 也爱格物 爱跋山 爱涉水 也爱深林 This is me. 刘伯承的诗词有曰“高耸入云”,于是“李入云”便成为了我一生的标记,也造就了一个时而安静,时而疯狂的我 ...
- linux内核分析第三周
20135103王海宁 linux内核分析第三周 http://mooc.study.163.com/course/USTC-1000029000 按照课堂提供的方法,命令行一行行敲上去,我是手机缓 ...