1114 ModricWang's FFT EASY VERSION 思路 利用FFT做大整数乘法,实际上是把大整数变成多项式,然后做多项式乘法. 例如,对于\(1234\),改写成\(f(x)=1*x^3+2*x^2+3*x+4\),那么\(x=10\)处的值就是原数.类似的,对于输入的两个大整数,转换为\(f(x)\) 和\(g(x)\) ,利用FFT求出\(h(x)=f(x)*g(x)\) ,此时\(h(10)\) 就是乘积. 代码 #include <cstdio> #include…
1116 ModricWang likes geometry 思路 难题,非常考察几何知识,放在这里作为计算几何场次的最难的题. 原题地址 原版题解 代码…
1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那么这两个凸包(凸多边形)一定是不相交的. 计算凸包一般有两种方法,Graham扫描法和Jarvis步进法. Graham扫描法比较简单,好理解,书中也有伪代码.先找到最左下点P0,对剩下的点相对P0进行极角排序.然后依次进栈判断.当算法终止时,栈中从底部到顶部,依次是按逆时针方向排列的凸包中的点(有…
Bamboo之吃我一拳 分析 当两个点的距离<=d时,才可以出拳,想要使得满足出拳条件的点对最少但不为0 寻找最近点对距离,得到的最近距离能够使得可以出拳的组数最少,因为除了最近点对外其他组合均不符合条件. 在一堆点中找到两个点的距离最小,暴力的O(n^2)计算量很恐怖,可以用分治思想把问题变小: 把平面上的点分为两拨,距离最近的两个点只可能出现在:第一堆,第二堆,和两堆2中各自一个点 分解 想象一条垂直线把所给点集分成两拨:所有的点要么在直线左边,要么在其右边.按x坐标升序排列. 解决 划分后…
Bamboo之寻找小金刚 分析 可以抽象为许多连续线段,分别计数左拐和右拐的个数.考察叉积的基础应用. 假设ABC三点构成一个夹角∠ABC,B就是拐点,AC是辅助形成夹角.考虑线段AB和BC形成的向量 sin∠ABC= (AB * BC)/|AB|*|BC| 两个向量的叉乘除以它们的模 所以叉乘可以判断夹角是否大于180°从而确定转向.当然叉积是有方向的,可以自己选择哪条边在前,只要标准统一即可.每三个点组成一组,遍历,分别计数左拐数和右拐数.具体叉积相关操作可以看<算法导论> 注意 常见的一…
1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × OB = x1y2 - x2y1. OA × OB > 0:OA在OB的顺时针180°内: OA × OB = 0:三点共线,方向不一定相同: OA × OB < 0:OA在OB的逆时针180°内. 分析 注意数据范围,建议使用double.long long还是少用些好,真的. 参考代码 #in…
1032 AlvinZH的学霸养成记II 思路 中等题,贪心. 所有课程按照DDL的大小来排序. 维护一个当前时间curTime,初始为0. 遍历课程,curTime加上此课程持续时间d,如果这时curTime大于此课程DDL,表示无法学习此课程,但是我们不减去此课程,而是减去用时最长的那门课程(优先队列队首,课时最长). 贪心: 假设当前课程为B,被替换课程为A,则有A.d≥B.d,A.e≤B.e.既然curTime+A.d≤A.e,那么curTime+B.d≤B.e绝对成立,保证了B的合法性…
1066 ModricWang的水系法术 思路 比较典型的最大流问题,需要注意的是,题目已经暗示(明示)了这里的边是双向的,在建图的时候需要加上反向边的容量值. 解决最大流问题的基本思路就是不断在残量网络上找增广路径,这里可以参考一下我院远古学长Song Renfei对于ISAP算法的讲解:ISAP 时间复杂度\(O(V^2 \sqrt E)\) 代码 #include <iostream> #include <cstring> using std::ios_base; using…
1019 ModricWang的序列问题 思路 此题题意非常清晰,给定一个序列,求出最长上升子序列的长度.从数据规模来看,需要\(O(nlogn)\) 的算法. \(O(nlongn)\) 求最长上升子序列的做法如下: 维护一个数组\(f[]\) ,其中\(f[i]\) 表示当前步骤下长度为i的上升子序列的末尾元素的最小值. 需要注意的是,\(f[i]\) 一定是单调递增的,这个结论十分显然,这里就不做证明了. 使用动态规划思想,对于原序列中的每个元素,都拿去更新一次\(f[]\) .假设当前元…
1062 ModricWang的撒币游戏 思路 此题为2017年ACM-ICPC亚洲区域赛乌鲁木齐赛区的A题,现场94个队中有38个队做出此题.在这里作为满分以外的题,是为了让大家看一下外面一些题的风格,不要被三位助教的出题风格所局限. 此题首先需要知道一些高中数学概率论的知识.扔起N个硬币,如果每个硬币下落时,正反面朝上的概率都是确定的,那么这些硬币中正面朝上的数量是呈二项分布的. 考虑使用DP,\(prob[i][j]\) 表示扔了第i次后,有j个硬币正面朝上的概率.首先根据题设,\(pro…