正文内容加载中...
posted @ 2014-02-16 21:46 Rabbit_hair 阅读 (1498) 评论 (0) 编辑
摘要:hdu3572题意:n件工作,m个机器,一个机器一个时间只能给一个工作使用,每件工作i必须在si[i]~ei[i]之间选pi[i]个时间,问是否可以满足条件。刚开始把每个时间每个机器都当成一个点,没有m能当流量的概念,想不到其实对于可以再这一天进行的工作来说不管在哪个机器上都是无所谓的,所以把工作,时间当成点,该工作能在该时间工作就连流量为1,源点到工作连该工作需要的时间,时间当汇点流量为机器的个数,满流就Yes; 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #in... 阅读全文
posted @ 2014-02-15 21:10 Rabbit_hair 阅读 (65) 评论 (0) 编辑
摘要:http://poj.org/problem?id=2185题意:求最小的模式块,使其无限扩展后包含给你的矩阵块(看别人题解才懂的题意);分析:假设存在一个模式块可以满足上述条件,那么必然存在一个起点在(0,0)的模式块满足上述条件; 对于每一行,我们找出所有可以满足条件的前缀记录下长度,那么满足所有行的最短的长度就是该模式块的宽r; 对于模式块的长,我们把宽r的字符串压缩看出一个字符,然后再进行KMP,找出该字符串的最小循环串,即长l;答案就是r * l; 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include .. 阅读全文
posted @ 2013-12-04 21:52 Rabbit_hair 阅读 (553) 评论 (0) 编辑
摘要:poj 1741 http://poj.org/problem?id=1741题意:求树上距离小于k的点对的对数;分析:每条路经要么过根,要么不过根,对于不过根的路径我们递归同理可以求出,对于过根的路径,我们dfs一遍记录下所有其他节点到跟的距离,然后sort()一下可以o(n)求出其小于k的pair,但我们要减去其中来自同一子树的pair;利用重心分治,最多logn次,所有时间o(n * logn * logn);重心的定义:去掉该点后,其子树节点个数的最大值最小;step1:对于当前树,找到其重心,统计pair;step2:把重心当根,分别递归其子树;findsz(),findC()为求重 阅读全文
posted @ 2013-11-19 21:36 Rabbit_hair 阅读 (238) 评论 (0) 编辑
摘要:学了一下怎么写递归,发现确实比较简单;dp[pos][][]对应dfs()中的参数的状态,记忆化当前状态的值,不用考虑这个状态表示什么意思;然后就是设计好dfs()中的参数;hdu 3555http://acm.hdu.edu.cn/showproblem.php?pid=3555题意:统计1~n之间含有49的数字的个数;需要记录当前位置,前一位置放了那个数字,当前是否已经包含49,是否有上界;dfs(pos,pre,istrue,limit); 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace . 阅读全文
posted @ 2013-11-11 20:19 Rabbit_hair 阅读 (5318) 评论 (0) 编辑
摘要:有一个trick就是没想到,枚举第二段时间后,要检测该火车能否继续跑一圈来判断,不能先检测前半圈能不能跑加进去后在检测后半段;// **** 部分不能放在那个位置;最近代码导致的错误总是找不出,贴下代码权当提醒吧!! 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 int us[180000];10 int ID[180000];11 vector pr[5100];12 int ti[5100];13 int n;14 void FIND 阅读全文
posted @ 2013-11-07 22:43 Rabbit_hair 阅读 (182) 评论 (0) 编辑
摘要:读通题意应该要往二进制的方向去想,因为牌的个数是(1 a ^ b = c这样我们这样比较所得到的c是否相同就可以了; 1 import java.util.*; 2 import java.math.*; 3 import java.io.*; 4 5 public class Main { 6 public static void main(String[] arg) { 7 Solve t = new Solve(); 8 t.main(); 9 }10 }11 class Solve{12 int n;13 BigInte... 阅读全文
posted @ 2013-11-03 19:54 Rabbit_hair 阅读 (286) 评论 (0) 编辑
摘要:题意:给一束激光,一个三棱柱,三棱柱会折射光,问这束激光最终是否会和y = 0相交;分析:模拟题,为了方便处理折射角,事先求出每条边的向内和向外的法向量;findpoint : 找第一交点step1: 判断激光是否和三角形有规范相交;step2: 第一次折射;step3:第二次折射,可能无法折射; 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 const int N = 100+10; 10 const double e... 阅读全文
posted @ 2013-10-30 23:32 Rabbit_hair 阅读 (220) 评论 (0) 编辑
摘要:CF348http://codeforces.com/contest/348/problem/C题意:一个n个元素的序列,m个下标集合,q个操作,两种操作1:给你一个集合,求序列中下标在集合中的元素的sum;2:给你一个集合,把序列中下标在集合中的元素都加X; 1 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 using namespace std; 10 typedef long long LL; 11 const int N = 100000+10; 12 con... 阅读全文
posted @ 2013-10-10 18:08 Rabbit_hair 阅读 (151) 评论 (0) 编辑
摘要:hdu 4676http://acm.hdu.edu.cn/showproblem.php?pid=4676题意:给你1..n的排列,给一个区间[L,R],返回gcd(a[i],a[j]) L<=i<j<=R的和;分析:对于一个区间[L,R],我们设g(d) 表示在区间内gcd(a[i],a[j]) = d的个数 ;f(d) 表示在区间内gcd(a[i],a[j]) = d的倍数的个数;显然 f(d) = sigma{ d | n, g(n) };通过莫比乌斯反演得到 g(d) = sigma{ d | n, mu(n/d) * f(n) };其中mu()是莫比乌斯函数;g( 阅读全文
posted @ 2013-10-02 22:36 Rabbit_hair 阅读 (1382) 评论 (0) 编辑