codeforces 372E. Drawing Circles is Fun
tags:[圆の反演][乘法原理][尺取法]
题解:
圆の反演:将过O点的圆,映射成不过O的直线,相切的圆反演出来的直线平行。
我们将集合S中的点做反演变换:(x,y)->(x/(x^2+y^2), y/(x^2+y^2))
若OAB的外接圆与OCD的外接圆相切&&OAC外接圆与OBD外接圆相切。
那么反演后就有:A'B'//C'D' && A'C'//B'D'即A'B'C'D'为平行四边形
枚举所有的对角线,对于每一根对角线,我们记录下它的斜率,中点坐标。
对这些对角线排序后,使用尺取法&乘法原理即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int MOD = 1000000000 + 7;
const int NICO = 1000 + 10;
int n, tot, ans;
double a,b,c,d,x,y;
struct Point
{
double x, y;
} p[NICO];
struct Mid
{
double x, y, k;
} mid[NICO*NICO];
bool equal(double x, double y)
{
return abs(x-y) < 1e-9;
}
bool cmp(Mid a, Mid b) //对所有对角线按中点横坐标,中点纵坐标,斜率三个关键字排序。
{
if(equal(a.x, b.x))
{
if(equal(a.y,b.y))
{
return a.k < b.k;
}
return a.y < b.y;
}
return a.x < b.x;
}
void read()
{
scanf("%d", &n);
for(int i=1;i<=n;i++)
{
scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
x = a/b;
y = c/d;
p[i].x = x / (x*x + y*y); // 对所有点进行反演
p[i].y = y / (x*x + y*y);
}
}
void init() //求出对角线中点横坐标,中点纵坐标,斜率
{
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
mid[++tot].x = p[i].x + p[j].x;
mid[tot].y = p[i].y + p[j].y;
if(equal(p[i].x, p[j].x))
{
mid[tot].k = 1e9;
} else {
mid[tot].k = (p[j].y - p[i].y) / (p[j].x - p[i].x);
}
}
}
}
void solve()
{
sort(mid+1,mid+1+tot,cmp);
int i, j;
for(i=1;i<=tot;i=j) // 尺取法。
{
int cnt = 1; LL res = 1;
// 如果第j条线段中点的坐标与第i条线段中点的坐标不同,则跳出第二层循环。
for(j=i+1;j<=tot && equal(mid[j].x ,mid[i].x) && equal(mid[j].y, mid[i].y);j++)
{
if(equal(mid[j].k,mid[j-1].k)) cnt ++; // x,y,k皆相等!志同道合!
else res = res*(cnt+1)%MOD, cnt = 1; // 计数君阵亡!根据乘法原理,这些对角线有(cnt+1)种取法。
}
res = res * (cnt+1) % MOD;
ans = (ans + res - 1) % MOD;// 一根线段都不拿,会翻车!减掉!
}
printf("%d\n", ans - tot); // 只拿一根,会翻车!减掉!
}
int main()
{
read();
init();
solve();
}
codeforces 372E. Drawing Circles is Fun的更多相关文章
- HTML5资料
1 Canvas教程 <canvas>是一个新的用于通过脚本(通常是JavaScript)绘图的HTML元素.例如,他可以用于绘图.制作图片的组合或者简单的动画(当然并不那么简单).It ...
- Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 1) C. Bear and Drawing
题目链接:http://codeforces.com/contest/573/problem/C题目大意:在两行无限长的点列上面画n个点以及n-1条边使得构成一棵树,并且要求边都在同一平面上且除了节点 ...
- codeforces D. Area of Two Circles' Intersection 计算几何
D. Area of Two Circles' Intersection time limit per test 2 seconds memory limit per test 256 megabyt ...
- codeforces 573C Bear and Drawing
Limak is a little bear who learns to draw. People usually start with houses, fences and flowers but ...
- codeforces 600D Area of Two Circles' Intersection
分相离,内含,想交三种情况讨论一下. 主要是精度和数据范围的问题,首先数据用long double,能用整型判断就不要用浮点型. 题目中所给的坐标,半径是整型的,出现卡浮点判断的情况还是比较少的. 最 ...
- Codeforces 1015E1 Stars Drawing (Easy Edition)
题面: 传送门 题目描述: 要求用十字星星来画题目给出的"星"图.如果不能用十字星星来画"星"图,输出-1:如果能,则输出要在图的哪个位置画相应大小的十字星图. ...
- Codeforces Round #356 (Div. 2)-B
B. Bear and Finding Criminals 链接:http://codeforces.com/contest/680/problem/B There are n cities in B ...
- CodeForces 164 B. Ancient Berland Hieroglyphs 单调队列
B. Ancient Berland Hieroglyphs 题目连接: http://codeforces.com/problemset/problem/164/B Descriptionww.co ...
- Codeforces Round #290 (Div. 2) A. Fox And Snake 水题
A. Fox And Snake 题目连接: http://codeforces.com/contest/510/problem/A Description Fox Ciel starts to le ...
随机推荐
- Gulp自动构建Web前端程序
这两天在一个朋友在项目上碰到了一个这样的问题,在运营过程中,用户在浏览器上对某个表单进行数据提交时,需要引入新的平台接口数据的业务,通过评估,开发团队马上修改了相关后台代码和部分的前端脚本代码,通过简 ...
- c#模拟js escape方法(转)
实现URI字符串转化成escape格式的字符 public static string Escape(string s) { StringBuilder sb ...
- 我个人的Java学习经验(一家之言)
声明:本文只是我的个人经验之谈,或者连经验之谈都算不上,因为我觉得自己还是个新手,没有什么经验可谈,就算是我分享一下自己从开始学习Java到现在的一些心路历程吧,各位看官暂且看吧,欢迎交流.第一部分算 ...
- 用react分页显示数据
去年年底,尝试着用react写个组件化的页面! demo地址 里面有一个list页面弄了一下数据的分页展示 展示一下主要三个组件:父组件listBox.列表组件List.按钮组件PageButton ...
- 深入理解ajax系列第三篇——头部信息
前面的话 每个HTTP请求和响应都会带有相应的头部信息,其中有的对开发人员有用.XHR对象提供了操作头部信息的方法.本文将详细介绍HTTP的头部信息 默认信息 默认情况下,在发送XHR请求的同时,还会 ...
- Selenium 上传文件失败,解决办法一
昨个改程序遇到一个问题,UI上面有需要上传文件的地方.但是我不知道怎么让Selenium完成 点击上传文件按钮->在弹出的文件选择窗口中选择路径和文件,点确定. 要知道弹出窗口属于window的 ...
- weblogic 双机集群搭建
weblogic 双机集群搭建,基本步骤引用百度文库的一篇文章: wenlogic双机集群基本步骤 下面详解一下该文章搭建后会遇到的问题: 1. 主机名验证失败 javax.net.ssl.SSLKe ...
- ajax 提交表单(文件)
废话不多说,自己看代码 引入的jquery <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js&quo ...
- PHP服务器脚本 PHP内核探索:新垃圾回收机制说明
在5.2及更早版本的PHP中,没有专门的垃圾回收器GC(Garbage Collection),引擎在判断一个变量空间是否能够被释放的时候是依据这个变量的zval的refcount的值,如果refco ...
- JavaWeb之多语言国际化
这周打算把国际化.JDBC和XML学习一下,从下周就开始学习三大框架,再坚持一个半月吧就能入门JavaWeb了,上周周末两天过的真是生不如死,两天坐在家里,醒来就写博客,原本在公司也自己操作了一遍,其 ...