摘要:
求通项和斐波那契数列的方法一样,矩阵快速幂。这道题麻烦在套了三层。但其实取模这种操作肯定会出现循环的,可以先本地暴出循环节,1000000007对应的循环节是222222224,222222224对应的循环节是183120。最外层的结果是对1000000007取模,它的内层对222222224取模,可以得到相等的答案,那么222222224的内层对183120取模,也能得到相等的答案,这样就是分别对三个模数做矩阵快速幂,内层得到的结果返回给外层作为指数。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<str 阅读全文
摘要:
不知道这算不算个神题了,AC的时候只有我和汝哥两人过这题……想了一天,调了一天,竟然因为三角剖分时就差了一句叉积判断相邻边的凹凸性WA了好几天……1、三角剖分:所给多面体是非凸的,难以处理,剖分成一个个三棱柱就都是凸多面体了。最后才开始写陌生的三角剖分的,已经写+调了二百多行疲惫不堪的时候看到一计算几何书上好复杂的nlogn算法,竟然还要再搞平衡树,简直要崩溃。百度、谷歌都不给力了,期刊论文看着也晕乎,只好凭着自己的理解来暴力剖分了。读入每个点建立双向链表(单向应该也没关系,灵活性差点),然后开始循环剖分,对每个相邻边,先判断凹凸性,然后枚举其他所有边判是否和如图所示虚线交叉,通过判断后可以确 阅读全文
摘要:
首先和传统扫描线的方法一样先把每个圆左右侧x坐标离散出来排个序标记好进出,然后开始扫描。如果全是矩形,就很好处理。圆就麻烦在没有像矩形那样可以离散化的规则上下界,便无法用预处理好的离散编号来构建线段树。但是我们可以注意到题目中说了圆与圆不会相切或相交,那么对于扫描线扫描的过程中从上到下穿过各个圆的顺序是不会变的,所以可以利用二叉树,把扫描线经过的“边”有序地插入(这里用set就很方便高效了),对于圆来说,这个边就是与上半圆交点纵坐标和与下半圆交点纵坐标。由于扫描线位置的变化,插入时用来比较的代表“边”的纵坐标也会变化,但是前面说过,扫描线穿过圆的顺序是不会变的,所以新的“边”依然会插入到正确的 阅读全文
摘要:
祝贺swm8023刷HDU-Steps登顶+突破新Section,14.2不是传说中的高级计算几何,而是数学~~ 阅读全文
摘要:
如图,横坐标为时间轴,纵坐标为相对起点的位移,斜率为速度。设C为起点发出的包,发出时间为1,速度为1~2。设D为终点发出的包,发出时间为2,速度为1~2。A、B为探测器发出时间范围2~5,速度为4。由图可看出,发包的时间-位移相叠的范围为可能全部抓包的范围,称有效范围。在探测器的时间-位移范围内的有效范围/探测器时间-位移范围即探测器全部抓包的平均工作效率。对所有速度区间、探测器时间-位移区间、起点终点区间 做半平面交,得到凸包面积除以探测器时间-位移区间面积可得解。精度要求挺高的,eps注意一下。 1 #include<stdio.h> 2 #include<stdlib. 阅读全文
摘要:
如上图,设A、B为点集中的两个点, 分别以A、B为圆心作单位圆,则相交范围内的任意位置作新的单位圆,都可以同时包含A与B,如圆C,如果把C放在一个其中一个圆A的圆周上,则圆C的圆周会穿过点A。假设已得到题目的一个解圆O,则把得到的圆O通过移动,总可以让圆内的某个点X靠在圆周上,换言之,O也在X所作单位圆的圆周上。由此,可枚举在最终结果的圆周上的点X,目标圆心O在X的圆周上。每枚举一个X作为图中的点A,枚举其他所有点作为点B,可得到C对应点A、B的在A圆周上的一个范围,覆盖次数最多的那个范围就是当X作为点O圆周上的点所能得到的最优解O的范围,这个次数加1(点X)就是对应X的最优解。通过枚举所有X 阅读全文
摘要:
以位置为横坐标,速度为纵坐标,则高处的点总会跑到低处的点前面。如图B追上A的时间就是横坐标差除以纵坐标差,也就是说斜率的绝对值越大,追上的越快。那么C就不会比B先追上A,B有机会保持一段时间的第一。同理C会在未来追上B,而保持一段时间第一。由此看来,统计凸包上x最大点和y最大点之间点的个数即得答案。对于多点共线的情况,只计一次,在求凸包的时候就可以处理掉了。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 #include< 阅读全文
摘要:
以圆心为中心将简单多边形划分为n个矢量三角形,对每个三角形与圆求交,根据有向边判断相交面积正负,最后相加取绝对值。一个顶点在圆心的三角形与圆的交需要讨论的情况比较少,容易计算。 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<math.h> 5 #include<algorithm> 6 const int maxn = 111111; 7 const int maxisn = 21; 8 const double eps = 1e-8; 阅读全文
摘要:
不需要正规的三角剖分,用求多边形面积的思想,从一点出发连接多边形的边得到很多三角形,三角形有向边方向决定有向面积有正有负,相加得到多边形面积的正值或负值。把两个多边形都分成若干这样的三角形,求每对三角形的交,根据两三角形有向边顺逆时针关系确定相交面积的正负号,最后两多边形面积和减去相交面积。 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<math.h> 5 #include<algorithm> 6 const int maxn = 5 阅读全文
摘要:
1、判断多边形有向边顺、逆时针:取最右点p[i],p[i-1]->p[i]与p[i]->p[i+1]成右手关系则为逆时针。2、判断点与简单多边形位置关系:参考文献:王学军,沈连婠,朱绍源等.基于左边的点在简单多边形内的判别算法[J].机械工程师,2006,(2):53-54.给定一个简单多边形,判别点u在多边形G内外的判断算法步骤:Step1:过u作一水平射线;Step2:求出射线与简单多边形G的交点;Step3:若交点为0,则u在G外,结束;Step4:若交点数大于0,求出与u点距离最近交点v;Step5:找到交点v所在边的两顶点,记p1为p[i],p2为p[i+1];Step6 阅读全文