摘要: 点,线:poj 1066题意:给一个矩形,n条在内部线,每次只能通过线段的中点,求从起点走到矩形外要经过几次线段;显然当我们确定终点后,那些横跨在起点和终点之间的直线是我们无法避免要通过的,且每条直线我们只需要通过一次就好了。这样我们只要枚举终点,然后判断交点个数就好了。问题的转化,线段平移,或者极端状况。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #define pbk push_back 11 using nam... 阅读全文
posted @ 2013-07-22 19:31 Rabbit_hair 阅读(715) 评论(0) 推荐(0)
摘要: 动态凸包,就是每次插入一个点,求新形成的凸包;就是给点一个序,然后找到插入点在凸包中的前驱后后继,然后俩边分别维护;可以用水平序,也可以用极角序,水平序因为要分别维护上下两个半凸包,而且因为是分别的维护的,不像极角序一样可以循环,即最后一个的点的后继就是第一个点,所以极角序相对实现起来简单,但极角有一个问题就是要找一个基准点,如果点都不重复那刚开始的点就可以,如果重复的话,在遇到这个点就连极角都求不出了。。。还有一些其他问题,我也不知道,就是做sgu277是一直第二组就WA了;但CF70D还是能过的;水平序: 1 #include 2 #include 3 #include 4 #in... 阅读全文
posted @ 2013-07-15 22:19 Rabbit_hair 阅读(1445) 评论(0) 推荐(0)
摘要: uva 12524题意:沿河有n个点,每个点有w的东西,有一艘船从起点出发,沿途可以装运东西和卸载东西,船的容量无限,每次把wi的东西从x运到y的花费为(y-x)*wi;问把n个点的东西合并成k个的最小花费;分析:设dp[j][i]表示把前i个点的东西合并成j个点的最小花费,那么dp[j][i] = min( dp[j-1][k] + w[k+1]*(x[i] - x[k+1]) + w[k+2]*(x[i] - x[k+2]) + ... + w[i] * (x[i] - x[i]));设sw[i] = w[1] + w[2] + ...+w[i];swx[i] = w[1]*x[1] + 阅读全文
posted @ 2013-07-12 01:30 Rabbit_hair 阅读(790) 评论(0) 推荐(0)
摘要: 斜率DP斜率DP的一版模式:给你一个序列,至多或分成m段,每段有花费和限制,问符合情况的最小花费是多少;一版都用到sum[],所以符合单调,然后就可以用斜率优化了,很模板的东西;如果看不懂可以先去看一下本博客----斜率DP题目,看一下第一道题目,然后在回来看push,pop是为什么这样操作;首先通过对方程的化简得到如下递推方程DP[i] = min/max( -a[i]*x[j] + y[j] ) + w[i]; (1 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 using n. 阅读全文
posted @ 2013-07-11 19:25 Rabbit_hair 阅读(3867) 评论(0) 推荐(3)
摘要: hdu 3948 1 /* 2 题意:给你一个串,求该串的不同子回文串的个数; 3 4 分析:首先我们想一下一个比较简单的问,求一个串的不同子串的个数 5 显然每个子串都是一个后缀的前缀,那么只要按照SA[]统计该后缀i的前缀 6 有那些是出现过的,也就是ans+=len[该后缀长]-height[i]; 7 8 9 同样的道理,我们先统计出以i为中心的回文串到最右边的距离,然后 10 再统计不同回文串的个数,即减去相同回文串的个数,但是两者还是有区别的 11 其次,为了统一奇偶的差别,我们构造出另一个字符串, 12 s1=aabaa -> s=$#a#a#b#a#a... 阅读全文
posted @ 2013-07-03 22:32 Rabbit_hair 阅读(1652) 评论(0) 推荐(0)
摘要: 1 /* 2 CF#190DIV.1-C 3 题意:给你n个结点的树,给这些结点标记字母AB..Z,对于标记相同的结点路径上 4 的结点的标记必须有一个是大于该标记的;问是否可以标记(A是最大标记) 5 6 分析:整天思路就是找一个点,然后标记为最大标记i,然后再分别以最大标记i+1,标记该点的子树 7 依次递归;最终如果标记log(10^5) 所以必定有解;10 11 而那个点,最优的应该就是树的重心,重心的定义:去掉这个点后,树给分成a个连通分量,每个连通分量12 仍然是一棵树,并且a个连通分量中最大结点数最小;13 14 求法:这棵树的结点树为all,dfs()下去,同时记录该结点每.. 阅读全文
posted @ 2013-06-29 16:10 Rabbit_hair 阅读(347) 评论(0) 推荐(0)
摘要: 求最长回文串,如果是暴力的方法的话,会枚举每个字符为中心,然后向两边检测求出最长的回文串,时间复杂度在最坏的情况下就是0(n^2),为什么时间复杂度会这么高,因为对于每一个作为中心的字符的检测是独立的,没有充分利用前面比较过信息,这就类似暴力求字符串的匹配最糟糕的情况下是0(n*m),然后通过预处理的信息把时间复杂度降低也就是kmp算法;MANACHER算法:先假设所有回文串都是以某个字符为中心的,即回文串的长度都是奇数;lc[ i ]保存的是以位置i的字符为中心的最长回文串到最右边的距离先假设以知lc[i],(0p那么直接以x为中心进行检测,并更新k;如果x=p-x+1) 那么lc[x]至少 阅读全文
posted @ 2013-06-27 18:42 Rabbit_hair 阅读(523) 评论(0) 推荐(0)
摘要: hdu4333/*题意:字符串s[0..n-1],每次把最后一个字符放到前面,求形成的字符串比最初串分别小,相同,大于的个数因为是为了练习扩展KMP所以肯定是扩展KMP,为了循环方便,在后面复制字符串,求出next[]数组后,如果next[i]>n那么肯定相等,如果小于就判断s[ next[i] ]和 s[ i+next[i] ]的大小判断trick:题目求得是形成的不同的字符串的个数,可以知道相等的字符串肯定只有一个,而从0..n-1,第二个next[i]大于n那么这个i就是该字符串的循环节;*/#include#include#include#include#include#incl 阅读全文
posted @ 2013-06-27 00:58 Rabbit_hair 阅读(857) 评论(0) 推荐(1)
摘要: 在解上面这个问题前我们要先解决一个类似的问题:求字符串s的所有后缀和s本身的最长公共前缀;我们用next[]数组保存这些值;现在我们假设要求next[ x ],并且next[ i ] 0 L2 then 如下图: 表示s[0 .. L2-1] == s[x .. x+L2-1] 而且因为L2 = next[x-k]使得s[L2] != s[x+L2] 所以next[x] = L2; 证明:假设s[L2]==s[x+L2],又因为s[x+L2]==s[x-k+L2]//由1推出 所以s[L2]==s[x-k+L2] 所以next[x-k]==L2+1与next[x-k]==L2矛盾 1 void 阅读全文
posted @ 2013-06-26 21:59 Rabbit_hair 阅读(4305) 评论(0) 推荐(1)
摘要: 1 /* 2 题意:矩形面积并 3 4 分析:离散+线段树+扫描线; 5 6 细节:首先线段记录的信息,len[]表示区间被覆盖的长度,cov[]表示当前区间是否被完全覆盖 7 其次,线段树的叶子节点[l,r]{l==r}的长度是?区间[l,r]的长度是LX[r]-LX[l]{LX是离散后保存数据的地方} 8 那叶子节点[l,l]的长度不就变成0,显然这是有问题的 9 10 线段树的每一个节点表示一段区间,[l,r]该区间表示LX[r+1]-LX[l]的长度 11 1___2___3___4___5离散后的状况12 1 2 3 4 线段树中的每一个节点13 14 ... 阅读全文
posted @ 2013-05-26 12:27 Rabbit_hair 阅读(351) 评论(0) 推荐(0)