摘要: 找规律题同样是训练的题目题目:给出n,得到一个n*n的方阵,n保证为奇数,从第1行最中间的位置开始填1,然后以某种规则一直填数,每次填2,3,4,5……直到n*n。填充规则是每次把下一个数填在现在位置的右上方(即上移一格再右移一格),如果另外把这个方阵看做一个环,如果现在位于第一行,上移一格其实移到了最底那行,如果现在位于最右边那列,右移一格就是移到了最左边那列,同样的,如果刚好位于右上角,移动后就在左下角了;另一部分,在移动到右上方的时候,如果右上方已经被填充了,那么就不能向右上移动,而是向下移动,然后再继续向右上移动,画个图便知最后要求,右下角那个位置填的数字时多少这题的规律还是不难找到答 阅读全文
posted @ 2013-04-13 18:22 Titanium 阅读(274) 评论(0) 推荐(1) 编辑
摘要: 图论今天训练的题目,题意:有一些工作要做必须等某些工作做完了才能开始,每个工作也要花费时间去做。输入先给出n,m,表示有n个工作,要求完成第m个工作的最短时间(工作从1到n标号),下面n行给出每个工作的信息,每行第一个数表示做这个工作要多少时间,后面可能有1个或多个或0个数字,表示这个工作要在这些工作做完后才能动工。另外注意一点,同一个时刻只能做一个人工作,不能同时进行多个工作这题一开始看错,以为又是关键路径,敲了模板发现wa,才看到那句话,同一个时间只能做一个工作不能同时进行多个工作,因为这个条件,这道题可以说和关键路径就毫无关系了。后来想不出方法,在队友的提醒下想到了正解。其实我们只要知道 阅读全文
posted @ 2013-04-13 17:52 Titanium 阅读(509) 评论(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 阅读(1572) 评论(0) 推荐(0) 编辑
摘要: 例题:hdu 1828 Picture有两种方法,不过常用的第二种,两种都说一下。第一种:把矩形分成横线和竖线去处理,可知是完全相同的操作,我们来讲下怎么算出横线部分,竖线部分就是照搬即可。将横线保存在一个表中,按横线所处的竖直位置排序(升序),另外每条横线带一个标记值,原矩形的下线为1,上线为-1(对应过去就是插入线段和删除线段)从低到高扫描横线,没扫到一条横线就能计算出一部分横线值。计算方法是算出现在总区间的被覆盖的长度,然后求出与上一次的总区间的覆盖长度的差(即相减求绝对值),因为每次添加了一条线段,如果没有没有使总区间覆盖长度发生变化,说明这条线段其实在多边形的内部,被覆盖掉了,不能计 阅读全文
posted @ 2013-04-13 17:32 Titanium 阅读(2947) 评论(0) 推荐(2) 编辑