随笔分类 -  ACM

上一页 1 2 3 4 5 6 7 8 9 ··· 14 下一页
摘要:计算几何训练的题目,给出n个点的坐标(整数),选3个点组成三角形问能形成多少个锐角三角形直接暴力解决,用三个for循环枚举3个点(升序枚举避免重复),然后用余弦判断三角形中三个角是否为锐角判断一个角为锐角:已知j,i,k三个点形成一个角,以i为交点向j,k做两个向量a,b,用余弦定理cos = a*b/( |a| * |b| ) ,因为|a|*|b|必为正整数而且我们不是要算确切的角度只是判断锐,直,钝角所以直接用 a*ba*b=0 , 直角a*b>0 , 锐角或0度a*b<0,钝角或180度所以不用单纯靠 a*b 的正负来判断是什么叫,对于a*b>0的情况还要判断是否为0度 阅读全文
posted @ 2013-04-19 12:51 Titanium 阅读(268) 评论(0) 推荐(0)
摘要:线段树求面积并升级版题意中文,不解释这题的代码在一般的线段树求面积并的基础上进行了修改,但是所用的思想是一样的,所以不难理解回忆一下一般的求矩形覆盖面积,线段树节点里面有一个重要的变量,cnt。这个变量表示了该节点表示的区间被完全覆盖,如果cnt=0,说明没有被完全覆盖(但不代表没有被覆盖),要算出该节点所代表的区间被覆盖的长度,需要由它左右孩子节点被覆盖的长度相加所得。如果cnt=1,表示被完全覆盖,覆盖长度就是该区间长度。如果cnt>1说明也是被完全覆盖,不过不止覆盖了一次,在算覆盖长度的时候,和cnt=1的计算方法是一样的。注意一点,节点里还有另一个变量len,就是该区间被覆盖的长 阅读全文
posted @ 2013-04-14 21:09 Titanium 阅读(3455) 评论(3) 推荐(2)
摘要:找规律题同样是训练的题目题目:给出n,得到一个n*n的方阵,n保证为奇数,从第1行最中间的位置开始填1,然后以某种规则一直填数,每次填2,3,4,5……直到n*n。填充规则是每次把下一个数填在现在位置的右上方(即上移一格再右移一格),如果另外把这个方阵看做一个环,如果现在位于第一行,上移一格其实移到了最底那行,如果现在位于最右边那列,右移一格就是移到了最左边那列,同样的,如果刚好位于右上角,移动后就在左下角了;另一部分,在移动到右上方的时候,如果右上方已经被填充了,那么就不能向右上移动,而是向下移动,然后再继续向右上移动,画个图便知最后要求,右下角那个位置填的数字时多少这题的规律还是不难找到答 阅读全文
posted @ 2013-04-13 18:22 Titanium 阅读(278) 评论(0) 推荐(1)
摘要:图论今天训练的题目,题意:有一些工作要做必须等某些工作做完了才能开始,每个工作也要花费时间去做。输入先给出n,m,表示有n个工作,要求完成第m个工作的最短时间(工作从1到n标号),下面n行给出每个工作的信息,每行第一个数表示做这个工作要多少时间,后面可能有1个或多个或0个数字,表示这个工作要在这些工作做完后才能动工。另外注意一点,同一个时刻只能做一个人工作,不能同时进行多个工作这题一开始看错,以为又是关键路径,敲了模板发现wa,才看到那句话,同一个时间只能做一个工作不能同时进行多个工作,因为这个条件,这道题可以说和关键路径就毫无关系了。后来想不出方法,在队友的提醒下想到了正解。其实我们只要知道 阅读全文
posted @ 2013-04-13 17:52 Titanium 阅读(516) 评论(0) 推荐(0)
摘要:两种方法详细分析:线段树辅助——扫描线法计算矩形周长并(轮廓线)第一种,对横线和竖线做相同的操作/*对横线和竖线做两次一样的操作这题不需要离散化*/#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 5010#define MAX 10010#define lch(i) ((i)<<1)#define rch(i) ((i)<<1|1)int res;struct segment{ int l,r,h,v;}sx[2* 阅读全文
posted @ 2013-04-13 17:34 Titanium 阅读(1587) 评论(0) 推荐(0)
摘要:找规律题?YY题?题意:给出一条线的长度L(直线在[0,L]),和蚂蚁数,下面m个数字表示m个蚂蚁的起始位置(整数,坐标),所有蚂蚁向哪边走不确定,但是两个蚂蚁相撞会掉头走。蚂蚁的速度1cm/s,蚂蚁没有长度是一个点,另外蚂蚁走到直线的两个尽头就会掉下去。问怎么走,所有蚂蚁最快掉下去,输出时间(所有蚂蚁都掉下去后再输出时间而不是第一个掉下去就输出),然后怎么走最晚掉下去,输出所有蚂蚁都掉下去的时间这题真想不到什么算法,不过可以确定一些基本的策略1.最快掉下去:以中点为轴,位于两端的蚂蚁都向两端走,这样他们不会发生任何的碰头,直接全部掉下去,那么最后掉下去的蚂蚁,是离中点最近的蚂蚁,它是最后掉下 阅读全文
posted @ 2013-04-12 11:50 Titanium 阅读(765) 评论(0) 推荐(0)
摘要:数据结构:暴力(可用哈希优化)+建树+前序遍历题意:输入行数n,下面n行是一下文件的路径(和平常使用的电脑一样),一整行数据中没有空格(还好,别有搞些空格出来),要你整理好所有文件的路径,从根开始,输出所有的文件夹名首先一点,我们要名字,在同一个文件夹下,是不会有重名的文件夹的即a\ba\b这种是非法的(和电脑一样),但是输入中可以有,有的话只是一种重复输入,不是代表a下面真的有两个b然后不同文件夹下可以由相同的名字,就好比你D盘和E盘都有一个文件夹叫“电影”例如a\bd\b这种是合法的在输入中也是会出现的,看case就知道。另外,每个文件夹都只有一个双亲好像a\b\c\d , 你要找d,输入 阅读全文
posted @ 2013-04-12 10:52 Titanium 阅读(613) 评论(0) 推荐(0)
摘要:简单树型DP题意:一个图,N个点,N-1条边,并且说明是树(一棵树,连森林都排除掉了)。在这颗树中删除一个点rt以及和他关联的边,那么剩下的部分将会是森林,统计森林中每棵树的节点数,最大值记录下来为dp[rt],你的任务是找出最小的dp[rt],如果有多个rt相等,那么按升序输出所有rt的编号一个最大值最小的问题,解法是求出所有的dp[rt]然后记录最小值因为本来是一棵树,用哪个做顶点都可以,默认为1,为整个树的祖先。定义sum[rt] = 以rt为根的子树含有的节点数 dp[rt] =dp[rt]:除去rt后,各个分块中节点数的最大值 ans = min{ dp[rt] }; 删掉rt... 阅读全文
posted @ 2013-04-11 23:07 Titanium 阅读(274) 评论(0) 推荐(0)
摘要:树DP题意:输入n和m,表示n个城市,m条无向边,下面一行n个数字,表示每个城市的权值,下面m行是每条边的信息,u,v,w,顶点和边权。问你从一个城市出发,走出一条路线,使得权值和最大,权值和包括这条路线上城市的权值和边的权值和。题中有一句话出卖了它是个树DP:It turned out that if Petrovich can fly (using one or several flights) from townito townj, then there is exactly one way to do this.从一个顶点去另一个顶点如果连通的话只有一条路径,说明这个无向图其实是个无根 阅读全文
posted @ 2013-04-11 10:16 Titanium 阅读(376) 评论(0) 推荐(0)
摘要:http://www.cqoi.net:2012/JudgeOnline/problem.php?id=1380题意什么的都在里面,中文题目不用解释个人感觉是数据的问题,因为网上找遍了代码都不能通过,算了还是不纠结了代码写得也不好,无心机改了/*dp思想:dp[rt][p],当前节点rt,有p点,能获得的最大价值1.可以用一部分来升级当前的这个技能,升的级数不确定,但升级需要花费点数,花费的点数 c<=p2.不升级当前,全部用于升级子树和兄弟。但注意,若不升级当前节点而且当前节点等级是0,那么 其子树不能升级,只能升级其兄弟*/#include <cstdio>#includ 阅读全文
posted @ 2013-04-10 23:24 Titanium 阅读(347) 评论(0) 推荐(0)
摘要:树DP经典问题,公司聚会,下属和直属上司不能共存,给出每个人的快乐值,再给出每个人的编号和他的上司,选出一些人参加聚会使快乐值最大/*从叶子开始选择,每个节点只有选不和不选两种可能,dp[rt][0],dp[rt][1]分别表示选和不选该节点dp[rt][1]=sum{ dp[son][0] }+val[rt] , 因为跟选了它的儿子就全部不能选dp[rt][0]=sum{ max{dp[son][0] , dp[son][1]} }如果根不选,那么儿子的选择就多样化了,每个儿子又是互不干扰的所以令每个儿子最优,加起来根就是最优的,而每个孩子无非还是选和不选,一比较就能得到每个儿子的最优方案而 阅读全文
posted @ 2013-04-09 23:09 Titanium 阅读(367) 评论(0) 推荐(0)
摘要:提交地址:http://www.cqoi.net:2012/JudgeOnline/problem.php?id=1709问题描述如果一个数x的约数和(不包括它本身,下同)比它本身小,那么x可以变成它的约数和;如果对于某个y>x且y的约数和为x,那么x也可以变成y。例如,4可以变为3,1可以变为7。限定所有的数字变换在不超过n的正整数范围内进行,求不断进行数字变换且没有重复数字出现的最多变换步数。输入数据 输入一个正整数n。输出数据 输出最少需要花费的时间。 (这里原题应该打错了,应该是输出最大转换步数)样例说明 一种方案为:4→3→1→7。时间限制 各测试点1秒内存限制 你的程序将.. 阅读全文
posted @ 2013-04-07 18:56 Titanium 阅读(742) 评论(1) 推荐(0)
摘要:树型DP这题刘汝佳居然归在数学题里面,他的用意应该是想归在递推的,但是这题更应该属于一个经典树DP题意:给一个图,两个点间不会有重边,边时双向连通的,另外注意这句话,there is only one route from a village to a village that does not pass through some other village twice.这句话说明了,这个图是很特殊的,其实是一个无根树。要求的是,找出两点,他们的距离最远有两种思路,但是本质还是一样的,写法不同,推荐后面那种第一种:/*思考方法:这个图的本质是个无根树,所以我们指点任意一个节点为树根即可,因而指 阅读全文
posted @ 2013-04-07 13:31 Titanium 阅读(799) 评论(0) 推荐(0)
摘要:提交地址:http://www.cqoi.net:2012/JudgeOnline/problem.php?id=1286这题是OI的经典题,不难,注意一点,原题是用文件输入输出的,但是这里的提交直接标准输入输出即可这题的题意很清晰,明说了是二叉树(而且只能在两个孩子的节点和叶子节点)。注意输入给出的信息,对于一对数据,a,b,a指通过走廊的时间,那是不是树中边的信息呢?不是的,应该是点的信息。树中每一个点都应该包含两个信息,就是时间花费和它有多少张画,对于非叶子节点而言,它的画数都是0,而时间是有的,对于叶子节点,除了有画数外,它也是有时间花费的另外,本题读题要仔细,它是说在警察来之前就要离 阅读全文
posted @ 2013-04-07 10:27 Titanium 阅读(441) 评论(0) 推荐(0)
摘要:数据结构:堆题目请你写一个内存管理系统。 内存中有30000个块,编号为1..30000。 当操作系统需要内存时内存管理系统会找出编号最小的空闲块,向里面写入数据。 操作系统还会会发出指令读取某个编号的内存块。如果目标块空闲,读取失败,否则读取成功。 一开始所有块都是空闲块。被写入数据之后就不是空闲块了。 如果一个块在600秒内没有被写入或读取,这块内存自动清空,变为空闲块。 本题中不会出现内存块不够用的情况。输入格式每行一个要求,可能是申请内存或读取。申请内存的格式如下: T + T表示这条请求收到时的时间,是不大于65000的整数,以秒为单位。读取内存的格式如下: T . N T表示这条请 阅读全文
posted @ 2013-04-06 18:49 Titanium 阅读(387) 评论(0) 推荐(0)
摘要:树状数组题意:一个树,以树枝连接两个点的形式给出,固定以1为整棵树的根。苹果长在树的节点上,节点上只可能0或1个苹果,一开始每个节点都有1个苹果有两种操作,C表示更改某个节点的苹果数,0变1,1变0。Q表示查询,某个节点(包括)的子树上一共有多少个苹果这题是选拔赛时候的题,一看,单点修改,区间查询?线段树?后来一直没想出来,今天看解题报告才明白真的是,不过是树状数组(不过按照理论来将,凡是树状数组能解决的问题,线段树都可以解决,反之不然)。整个问题最难的时候怎么映射成树状数组,映射后,只是树状数组的模板操作1.首先数据太大,不用显式建树,只是用vector来保存边的信息,仅仅是利用vector 阅读全文
posted @ 2013-04-04 22:22 Titanium 阅读(230) 评论(0) 推荐(0)
摘要:树型DP:二叉苹果树另外一个提交地址:http://www.cqoi.net:2012/JudgeOnline/problem.php?id=1375里面有中文题目,不解释题目了。树型DP:主要是两点,怎么建树,怎么DP。这两者应该说是相互制约相互影响的,怎么DP就要怎么建树,而建树方法对不对也决定了你能不能DP。所以先分析怎么DP的,再分析怎么建树题意说要保留m个树枝,而且注意权值不是点的而是树枝的,这样子并不利于我们解决问题,我们可以转化一下,把权值转移给节点。首先给出所有边的信息后,我们的建树是唯一的(这个问题值得思考一下为什么,唯一是指不考虑左右孩子的位置,而只考虑从属关系,好像1(3 阅读全文
posted @ 2013-04-04 17:11 Titanium 阅读(456) 评论(0) 推荐(0)
摘要:线段树题意:很明显的线段树。做了这题更加让我注意了用点和用段来建树的区别。这题是用点来表示线段的。一开始从0到10^9这个点之间的线段都是白色的,然后m个更新,每个更新 a,b,col,表示从点a到点b这条线段染成黑色或白色,问最后,白色线段中最长的是哪一段,输出它的位置(即线段两端的端点)注意更新的时候a,b的数值范围是 0<a<b<10^9 , 其实这样给数据方便了处理,否则的话最后要搞一下挺烦的先看看用段和用点表示线段树的区别。用点的话,0,1,表示的长度是1。1,3表示的长度是2。而用段的话1,3表示的长度是3,就是这个意思线段树的建树,无论在何种情况下,应该说建树的 阅读全文
posted @ 2013-04-03 21:34 Titanium 阅读(576) 评论(0) 推荐(0)
摘要:并查集题意:题意比较好懂简单说一下。一个序列,只有0,1;输入n,表示序列长度(从1到n标号),输入m,下面m个更新,每行都是a,b,string,表示说序列中下标a到下标b的元素中有偶数个或奇数个1.没得到一个更新就更新序列的信息,知道读入第k个信息,和已建立的信息矛盾,那么结束,输出k-1,表示前面k-1个更新不矛盾,如果m个更新都成立,那么输出m这题要转化一下,一转化就比较明显了。我们定义前缀和为sum[i]表示1到i的和,那么sum[b]-sum[a-1]=c[a]+c[a+1]+c[a+2]……c[b] , 即序列的[a,b]区间和因为序列中只有0,1所以区间和的奇偶性就是该区间拥有 阅读全文
posted @ 2013-04-03 21:11 Titanium 阅读(800) 评论(1) 推荐(0)
摘要:网络流UVA 1161 是相同的题目这题网上找不到任何题解的,看上去是个最大流,但是最难搞的就是有时间限制,现在基本上能确定的就是要拆点,但是怎么拆不确定,我用了这种拆法就一直超时超时的原因我总结一下有几个可能。1.构图的代码太烂,可能出了什么差错但是找不出来。2.数组开小了?开大了?3.和第1个原因,然后运行EK的时候掉进了死循环或者效率太慢。4.EK太慢,要用ISAP超时的代码/*原本的点从0到n-1标号,但是每个点需要占用2880个空间,所以对于原来第u个顶点,怎么确定那个范围是它可以用的就是[u*2880 , (u+1)*2880-1]如果读入了点u,时间为t而且它是作为到达时间,那么 阅读全文
posted @ 2013-04-02 19:54 Titanium 阅读(349) 评论(0) 推荐(0)

上一页 1 2 3 4 5 6 7 8 9 ··· 14 下一页