Online Judge

两个圆的公切线

混江龙づ霸主 提交于 2020-04-27 08:08:09
两个圆的公切线 圆上任意一点拥有唯一的圆心角 struct circle{ Point p; double r; // 通过圆心角求圆上某一点 Point point(double a){ return Point(p.x + cos(a) * r, c.y + sin(a) * r); } } 根据两个圆的位置关系来确定情况 两个圆内含,没有公共点,没有公切线 两圆内切,有一个条公切线 两圆完全重合,有无数条公切线 两圆相交。有2条公切线 两圆外切,有3条公切线 两圆相离,有4条公切线 1 与 3 什么都不求,情况 2 可以直接求出直线AB的极角进而转换为圆心角来求切点,连接切点和圆心,旋转90度即可得到切线。 情况 4 有两条外公切线,求出圆心距 \(d\) 以及 \(|AG|\) 即可求出 \(\alpha\) 的大小,根据 \(\vec{AB}\) 的极角进行旋转即可求出切点,进而得到切线 情况 5 的内切线类似情况2 情况 6 的外公切线与情况4完全一样 情况 6 的内切线也是先求出圆心角 \(\alpha\) ,如何求? \(\cos \alpha = \frac{A_r+B_r}{|AB|}\) // a[i] 存放第 i 条公切线与 圆A 的交点 int getTangents(circle A, circle B, Point*a, Point *b){ int

网络流——最小割求最大权闭合子图

纵饮孤独 提交于 2020-04-26 03:02:58
定义 有一个有向图,每一个点都有一个权值(可以为正或负或0),选择一个权值和最大的子图,使得每个点的后继都在子图里面,这个子图就叫最大权闭合子图。 如下图: 能选的子图有Ø,{4},{3,4},{2,4},{1,2,3,4},它们的权值分别为0,-1,5,-6,4. 所以最大权闭合子图为{3,4},权值为5. 解法 这个问题可以转化为最小割问题,用网络流解决。 从源点s向每个正权点连一条容量为权值的边,每个负权点向汇点t连一条容量为权值的绝对值的边,有向图原来的边容量全部为无限大。 求它的最小割,割掉后,与源点s连通的点构成最大权闭合子图,权值为(正权值之和-最小割)。 如何理解 割掉一条边的含义 由于原图的边都是无穷大,那么割边一定是与源点s或汇点t相连的。 割掉s与i的边,表示不选择i点作为子图的点; 割掉i与t的边,表示选择i点为子图的点。 如果s与i有边,表示i存在子图中; 如果i与t有边,表示i不存在于子图中。 合法性 只有s与t不连通时,才能得到闭合子图。 如果s与t连通,则存在点i,j,使得s到i有边,i到j连通,j到t有边,所以j一定是i的后继,但选择了i,没有选择j,不是闭合子图。 如果s与t不连通,选择了正权点i,一定选择了i后继中的所有负权点。设j是i的后继中的正权点,则割掉s到j的边是没有意义的,最小割不会割掉它,则j一点被选中,所以i的所有后继都被选中

51nod 1019 逆序数

倾然丶 夕夏残阳落幕 提交于 2020-04-11 11:42:33
1019 逆序数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。 Input 第1行:N,N为序列的长度(n <= 50000) 第2 - N + 1行:序列中的元素(0 <= A[i] <= 10^9) Output 输出逆序数 Input示例 4 2 4 3 1 Output示例 4 思路:一开始跟大多数菜鸟一样选择暴力解决,虽然估算过时间复杂度肯定是过不掉的(但我比较相信玄学QAQ) 然后改成归并排序加一句代码cnt=mid-i+1就能AC,平时归并排序写得少,还不能完全手写出来,很气 #include<iostream> using namespace std; const int maxn=5e4+10; int a[maxn]; int b[maxn]; int cnt=0; //将数组a[low,mid]和a(mid,high]合并 void Merge(int *a,int low,int mid,int high,int *tmp) { int i,j,k; i=low; j

51nod 1046 A^B Mod C

左心房为你撑大大i 提交于 2020-04-11 09:38:35
1046 A^B Mod C 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出3个正整数A B C,求A^B Mod C。 例如,3 5 8,3^5 Mod 8 = 3。 Input 3个正整数A B C,中间用空格分隔。(1 <= A,B,C <= 10^9) Output 输出计算结果 Input示例 3 5 8 Output示例 3 思路:主要考考你会不会快速幂的知识 #include <iostream> using namespace std; typedef long long ll; ll mod_pow(ll x,ll n,ll mod) { ll res=1; while(n>0) { //如果二进制最低位为1,则乘上x^(2^i) if(n&1) { res=res*x%mod; } x=x*x%mod; n>>=1; } return res; } int main() { ll a,b,c; scanf("%lld%lld%lld",&a,&b,&c); printf("%lld\n",mod_pow(a,b,c)); return 0; } 点赞 收藏 分享 文章举报 bryce1010 发布了762 篇原创文章 · 获赞 201 · 访问量 33万+ 他的留言板 关注 来源: oschina 链接:

突破传统 OJ 瓶颈,“判题姬”接入云函数

故事扮演 提交于 2020-03-06 15:54:17
Online Judge 系统(简称 OJ)是一个在线的判题系统。用户可以在线提交多种程序(如C、C++、Pascal)源代码,系统对源代码进行编译和执行,并通过预先设计的测试数据来检验程序源代码的正确性。 随着时代的发展,OJ 已经真正地成为了测评工具,其作用不再局限为 ACM 备战,还有老师检测学生能力、学生入学考试、能力评测(例如 ZJU 的 PAT)、找工作刷题和面试(例如牛客)等,而目前 OJ 的开源框架也越来越多,但是很多 OJ 都是基于 HUSTOJ 进行定制或者二次开发。 无论是什么方法,在关于 OJ 的众多问题中,有一个就是:性能问题。 说实话,一些 OJ 群里,总会有人问:1 核 1G 的机器,可以同时判多少题目?可以有多少人同时用?如果比赛,大约有多少人需要多高性能的机器?那么『判题姬』是否只能存在传统的宿主机中,能否通过其他方式焕发新的生命力? 其中一种方法,就是和现有的云函数进行结合。 ▎简单思路 通过云函数实现在线编程的思路基本有两个: 每个用户的代码建立一个函数,用后删除; 每个语言建立一个函数,用户传递代码,每次执行; 这两种方法,第一种相对简单的,但是目前对于很多云函数服务商来说,函数数量有一定限制,而且每次执行这个操作相对比较繁琐。 所以,本文采用第二种策略,建立一个函数,每次执行,用户传入代码,系统执行,返回结果。 代码写入系统: def

【01】Python基础语法

随声附和 提交于 2020-02-26 10:41:40
接下来,我会用三篇文章,分别对 Python 的基础语法、NumPy 和 Pandas 进行讲解,带你快速入门 Python 语言。 如果你已经有 Python 基础了,那先恭喜你已经掌握了这门简洁而高效的语言,这几节课你可以跳过,或者也可以当作复习,自己查漏补缺,你还可以在留言区分享自己的 Python 学习和使用心得。 好了,你现在心中是不是有个问题,要学好数据分析,一定要掌握 Python 吗? 我的答案是,想学好数据分析,你最好掌握 Python 语言。为什么这么说呢? 首先,在一份关于开发语言的调查中,使用过 Python 的开发者,80% 都会把 Python 作为自己的主要语言。Python 已经成为发展最快的主流编程语言,从众多开发语言中脱颖而出,深受开发者喜爱。其次,在数据分析领域中,使用 Python 的开发者是最多的,远超其他语言之和。最后,Python 语言简洁,有大量的第三方库,功能强大,能解决数据分析的大部分问题,这一点我下面具体来说。 Python 语言最大的优点是简洁,它虽然是 C 语言写的,但是摒弃了 C 语言的指针,这就让代码非常简洁明了。同样的一行 Python 代码,甚至相当于 5 行 Java 代码。我们读 Python 代码就像是读英文一样直观,这就能让程序员更好地专注在问题解决上,而不是在语言本身。 当然除了 Python 自身的特点