随笔分类 -  题解

摘要:原图可能有多个连通分量,先DFS找出每个连通分量中最小节点,这些必然是要攻占的城市。设 n 为节点数, m 为边数, cnt 为初始连通分量数,在剩下的边数不小于 m - (n - cnt) 的时候,图的连通性是不变的,也就是在这之前可以适当策略删边保持结果不变。当边数小于等于 m - (n - c... 阅读全文
posted @ 2015-04-27 11:30 CSGrandeur 阅读(435) 评论(0) 推荐(0)
摘要:筛法。统计所有 [数] 的所有 [倍数] 的 [数] 的个数,即 i的所有倍数 i, 2i, 3i, 4i...个数为 dp[i],则所有倍数两两结合共有 dp[i] * dp[i]个。此处覆盖 dp[i] = dp[i] * dp[i]。对于新的 dp[i]数组,从后往前逆推,设已完成的子问题 d... 阅读全文
posted @ 2015-04-27 10:44 CSGrandeur 阅读(572) 评论(0) 推荐(0)
摘要:博客搬至blog.csgrandeur.com,cnblogs不再更新。 新的题解会更新在新博客:http://blog.csgrandeur.com/3/ ———————————————————————————————————————— —————————————————————————————— 阅读全文
posted @ 2014-01-15 15:34 CSGrandeur 阅读(15312) 评论(4) 推荐(0)
摘要:偶尔做一题,做一题更新一题好了。。。A、COJ1328: 近似回文词转化的时候记录每个字母在原串位置,对新串枚举中点,向两边枚举判近似回文,更新更长回文。 1 #include 2 #include 3 #include 4 #include 5 const int maxn = 1011; 6 char buf[maxn]; 7 char as[maxn]; 8 int p[maxn]; 9 int k;10 int main()11 {12 int i, j, start, maxlen, alen, neq, ca = 0;13 while(scanf("%d", & 阅读全文
posted @ 2013-10-27 19:36 CSGrandeur 阅读(436) 评论(0) 推荐(0)
摘要:设置优先级队列{sum:当前和nex:加入下个元素的和ith:将要考虑的下个元素}以nex为优先级,小的先出队读入数据后排序,初始化队列第一个元素(0,a[0],0)每次出队一个元素,入队(sum,sum+a[ith],ith+1),(nex,nex+a[ith],ith+1),即是否加上a[ith]都考虑进去了。这样每次新加入的元素都是下一个最小的(nex),进行m次就得到了第m小。#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include&l 阅读全文
posted @ 2013-05-17 23:30 CSGrandeur 阅读(795) 评论(0) 推荐(0)
摘要:三点构成三个点对的路径,x轴、y轴都至少有一个点对的路径经过。枚举每组点对的路径让其经过一个轴,当然也可以同时经过两个轴。在所有情况中取最小答案。当坐标在轴同一侧时,对其中一个点的该坐标取反,得到的新点求距离就是镜面反射的距离。如果在不同侧,就直接求距离。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 #include<algorithm> 5 const double eps = 1e-8; 6 inline double Sqr(double x) {return 阅读全文
posted @ 2012-10-26 22:14 CSGrandeur 阅读(388) 评论(0) 推荐(0)
摘要:难道和 I 题这么有缘么?长春也是 I 题……1、如果有某个追逐点的速度大于目标点,或者位置与目标点重合,则答案为1;2、追逐点速度不大于目标点时,目标点有一个方向上的圆周区间可以被追到,计算这个区间的范围;到两点距离成比例的点轨迹是圆,用圆求切线应该也能做。3、转化为最小区间覆盖,因为在圆周上,所以枚举一下起点,总复杂度O(Nlogn+N^2)=O(N^2)比赛时候脑子抽了,竟然忘了区间覆盖怎么写!最后十分钟没调出来。若是有这一题,应该就稳进Final了吧。 1 #include<stdio.h> 2 #include<string.h> 3 #include< 阅读全文
posted @ 2012-10-26 16:39 CSGrandeur 阅读(1230) 评论(0) 推荐(0)
摘要:先是用经纬度算,调了很久,实在不会如何用经纬度求交点,百度谷歌也找不到。用三分法求了交点,有问题。。。不得已各种三角函数反三角函数坐标旋转神马的都用上了,硬是求出三维坐标系的各种点再算,精度都不知损到哪里去了,竟然能AC了。。。1、算临界线的纬度2、判断行程所在平面的“斜率”是否能与临界线相交,不相交则100.0003、把行程平面的x方向旋转到x轴正方向算出与临界线交点,再在临界面旋转到行程面与临界面交点4、用球面距离和z坐标结合判断计算区间。 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h 阅读全文
posted @ 2012-10-17 17:24 CSGrandeur 阅读(691) 评论(2) 推荐(0)
摘要:特别选出其中两个点,比如p[0]和p[1],两个点要么在对称轴上,要么一个在对称轴上,要么是对称点,要么分别和其他点对称而共享一个对称轴。这样枚举其他点和这两点构成对称轴,可以枚举出2n个对称轴,复杂度是O(n),中间判断一下是否其中一个点在对称轴上。对于枚举得到的O(n)个对称轴,用set或hash的方法存点,就可以通过计算对称点是否存在的方法O(nlogn)或O(n)来判断是否是对称轴了。没想到36ms,set还挺快。 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #inc 阅读全文
posted @ 2012-10-11 16:01 CSGrandeur 阅读(531) 评论(0) 推荐(0)
摘要:Staginner剽悍地抽象出了数学模型并推出了各项数据,万事俱备只欠东风,可惜最后一步推错了,比赛时候这题没过。。插板法组合数对应了不同icon的分配方案。每种分配方案又对应了很多种摆放方案。假设有s种分配方案,x[1]~x[s]分别对应了每种分配方案的摆放方案,可通过DP求得∑x 。也可求得∑(x^2),∑(x^3)...设M[p] =∑(x^p)。设S[p] = ∑x[i1]*x[i2]*x[i3]...*x[ip],i1~ip为互不相同的1~s的序列。题目所给棋盘是N行,我们求的就是S[N] * N!——————————分割线——————————以上是Staginner得到的数据与结论 阅读全文
posted @ 2012-09-17 02:13 CSGrandeur 阅读(1339) 评论(5) 推荐(0)
摘要:去年省赛教练会汝哥讲过一个结论,至多两个数字就可以拼出任何数的倍数。证明可以这样,AAAA...AAA若干个A,模X,能得到的余数种类是有限的,至多是1~X-1,那么总会有n个A和m个A这两个数模X余数相等,他们相减就得到了X的倍数,而相减得到的数就是两个数组成的。这样就可以对一个数先枚举一下,对两个数再枚举一下,找组成的那个数,可以BFS。一个数用来拼数字的时候超过一定长度就可以停下了,一步步模会出现循环。枚举得到的答案比较一下更新,最后输出。比赛时候思维乱,代码不太工整,见谅。 1 #include<stdio.h> 2 #include<string.h> 3 # 阅读全文
posted @ 2012-09-16 19:25 CSGrandeur 阅读(1410) 评论(2) 推荐(0)
摘要:求通项和斐波那契数列的方法一样,矩阵快速幂。这道题麻烦在套了三层。但其实取模这种操作肯定会出现循环的,可以先本地暴出循环节,1000000007对应的循环节是222222224,222222224对应的循环节是183120。最外层的结果是对1000000007取模,它的内层对222222224取模,可以得到相等的答案,那么222222224的内层对183120取模,也能得到相等的答案,这样就是分别对三个模数做矩阵快速幂,内层得到的结果返回给外层作为指数。 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<str 阅读全文
posted @ 2012-09-16 19:18 CSGrandeur 阅读(1882) 评论(2) 推荐(0)
摘要:不知道这算不算个神题了,AC的时候只有我和汝哥两人过这题……想了一天,调了一天,竟然因为三角剖分时就差了一句叉积判断相邻边的凹凸性WA了好几天……1、三角剖分:所给多面体是非凸的,难以处理,剖分成一个个三棱柱就都是凸多面体了。最后才开始写陌生的三角剖分的,已经写+调了二百多行疲惫不堪的时候看到一计算几何书上好复杂的nlogn算法,竟然还要再搞平衡树,简直要崩溃。百度、谷歌都不给力了,期刊论文看着也晕乎,只好凭着自己的理解来暴力剖分了。读入每个点建立双向链表(单向应该也没关系,灵活性差点),然后开始循环剖分,对每个相邻边,先判断凹凸性,然后枚举其他所有边判是否和如图所示虚线交叉,通过判断后可以确 阅读全文
posted @ 2012-09-12 09:50 CSGrandeur 阅读(446) 评论(0) 推荐(0)
摘要:首先和传统扫描线的方法一样先把每个圆左右侧x坐标离散出来排个序标记好进出,然后开始扫描。如果全是矩形,就很好处理。圆就麻烦在没有像矩形那样可以离散化的规则上下界,便无法用预处理好的离散编号来构建线段树。但是我们可以注意到题目中说了圆与圆不会相切或相交,那么对于扫描线扫描的过程中从上到下穿过各个圆的顺序是不会变的,所以可以利用二叉树,把扫描线经过的“边”有序地插入(这里用set就很方便高效了),对于圆来说,这个边就是与上半圆交点纵坐标和与下半圆交点纵坐标。由于扫描线位置的变化,插入时用来比较的代表“边”的纵坐标也会变化,但是前面说过,扫描线穿过圆的顺序是不会变的,所以新的“边”依然会插入到正确的 阅读全文
posted @ 2012-09-12 01:12 CSGrandeur 阅读(1011) 评论(0) 推荐(0)
摘要:如图,横坐标为时间轴,纵坐标为相对起点的位移,斜率为速度。设C为起点发出的包,发出时间为1,速度为1~2。设D为终点发出的包,发出时间为2,速度为1~2。A、B为探测器发出时间范围2~5,速度为4。由图可看出,发包的时间-位移相叠的范围为可能全部抓包的范围,称有效范围。在探测器的时间-位移范围内的有效范围/探测器时间-位移范围即探测器全部抓包的平均工作效率。对所有速度区间、探测器时间-位移区间、起点终点区间 做半平面交,得到凸包面积除以探测器时间-位移区间面积可得解。精度要求挺高的,eps注意一下。 1 #include<stdio.h> 2 #include<stdlib. 阅读全文
posted @ 2012-09-10 22:29 CSGrandeur 阅读(415) 评论(0) 推荐(0)
摘要:如上图,设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 阅读全文
posted @ 2012-09-10 14:10 CSGrandeur 阅读(496) 评论(0) 推荐(0)
摘要:以位置为横坐标,速度为纵坐标,则高处的点总会跑到低处的点前面。如图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< 阅读全文
posted @ 2012-09-10 00:56 CSGrandeur 阅读(636) 评论(0) 推荐(0)
摘要:不需要正规的三角剖分,用求多边形面积的思想,从一点出发连接多边形的边得到很多三角形,三角形有向边方向决定有向面积有正有负,相加得到多边形面积的正值或负值。把两个多边形都分成若干这样的三角形,求每对三角形的交,根据两三角形有向边顺逆时针关系确定相交面积的正负号,最后两多边形面积和减去相交面积。 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<math.h> 5 #include<algorithm> 6 const int maxn = 5 阅读全文
posted @ 2012-09-07 16:24 CSGrandeur 阅读(1622) 评论(0) 推荐(0)
摘要: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 阅读全文
posted @ 2012-09-06 17:28 CSGrandeur 阅读(372) 评论(0) 推荐(0)
摘要:各种点线与圆的关系。1、三角形外接圆:求各边中垂线交点;2、三角形内切圆:定比分点构造等腰三角形求角平分线,求两角平分线交点;3、定点到圆切线:点到圆心斜率加减切线夹角,处理结果的表示范围;4、切直线、过定点的圆:点在线上是两个对称的圆,否则圆在点线确定的双曲线上,利用双曲线性质构造直角梯形,然后利用向量与定比分点求;5、与两相交直线相切的圆:分别将直线朝不同方向平移半径距离求交点;6、两相离圆的公共外切圆:三圆心连线构成三角形,所求圆心做三角形的高,余弦定理+定比分点求出各项数据。特殊情况进行特判求值。 1 #include<stdio.h> 2 #include<stri 阅读全文
posted @ 2012-09-03 11:36 CSGrandeur 阅读(498) 评论(0) 推荐(0)