04 2013 档案

摘要:A 题: 越来越弱,都掉渣了....连暴力递归模拟都不会写了...对每个黑棋递归搜索其边界,若遇到相同的黑棋则数量+1继续找,遇到0或者边界则直接return.View Code #include<cstdio>#include<cstdlib>#include<cstring>char mp[110][110];bool flag;int n, m, dir[4][2] = {0,1,0,-1,1,0,-1,0};bool legal(int x,int y){ if( x>=0&&x<n&&y>=0&am 阅读全文
posted @ 2013-04-30 21:24 yefeng1627 阅读(232) 评论(0) 推荐(0)
摘要:题意: 一个串s,经过多次被覆盖,求最小的原串s.思路: 将题目转换下,就是 一个串s的前缀能覆盖串r,且s本身是r的一个后缀. 做法是首先考虑s的前缀能够覆盖r, 则我们从串r开始, 依次比较,并且记录上一次完全匹配(长度与s相同)的位置idx.当出现ri != sj时,令 j = nxt[j], (这样做,而不是直接令J=0,是为了保证模式串最短),因为可能是从头开始的. 继续比较,直到 j = 0, 意味着无法匹配.则将上一次的完全匹配位置idx+1到 i,添加到模式串s中, 然后更新模式串的next函数,因为我们已经知道了. s( 1, length ),这个时候模式串变成 s(... 阅读全文
posted @ 2013-04-30 11:21 yefeng1627 阅读(222) 评论(0) 推荐(0)
摘要:题意 求区间[a,b] 之间, x%f(x) = 0的数量, 其中f(x)表示x的数位和.解题思路: 转换成 F(A) = { x | x%f(x) = 0, 1 <= x <= A } , 然后结果即为 F(B)-F(A-1) 首先定义一个状态. dp( L, i, j, k ) 表示长度为L的数位和为i,其对j取模结果为k的方案数. 在同模j的情况下,则在该数后面增加一个x(0,9), 则得到 dp( L+1, i+x, j, (k*10+x)%j ). 那么转移方程就是: dp( L+1, i+x, j, (k*10+x)%j ) += dp( L, i, j, k ) .. 阅读全文
posted @ 2013-04-29 19:10 yefeng1627 阅读(343) 评论(0) 推荐(0)
摘要:kmp含义 克努斯-莫里斯-普拉特算法,一种字符串查找算法。 字符串算法主要是用于主串 S( s1,s2,s3,...,sn ), 模式串T( t1,t2,...,tm ), 之间的匹配问题. 相对与模式匹配O(n^2)而言:当 Si != Tj 失配时, 主串下标i不回溯, 而是将模式串下标j回溯到合适的地方,再继续比较 Tj ,Si.时间复杂度极端情况是 O(N*M), 但是一般情况下总能保证O(N+M). 假定串 S( i-j+1, i ) 与 模式串 T( 1, j ) 匹配时, Si != Tj 不匹配,此时需j最短回溯到 k, 则存在 T(1,k-1) = T( j-k... 阅读全文
posted @ 2013-04-28 20:41 yefeng1627 阅读(1257) 评论(0) 推荐(0)
摘要:虽然题目只给了起点st,和终点ed, st,ed <= 10000.但是只有200条边,极端情况也才200条边对应的400个顶点都不一样.所以我们可以离散化顶点到[1,400]之间.然后跑个最大流即可.注意本题边是单向的.View Code #include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<map>using namespace std;const int inf = 0x3f3f3f3f;const int MAXN = 1 阅读全文
posted @ 2013-04-28 19:08 yefeng1627 阅读(162) 评论(0) 推荐(0)
摘要:题意: 给一个数字x, x<=1e18, 求其分解成数个fib数相加的方案总数.其中fib数不能重复.解题思路: 首先一个结论: 任意一个数,都能被分解成 数个fib数相加的形式. 另外, 在区间 [1,1e18]总共有 88个fib数. 对于一个数 x, 我们用一个长度为88的01序列来唯一表示.当前位为1则表示取,否则不取 例如 8: 00000100...0 2: 00100...0 3: 0110...0 从高位到低位. 根据 fib_i = fib_i-1 + fib_i-2 . 对于一个序列 001, 其能够被 110 替换. 我们可以总结出. 当前位为... 阅读全文
posted @ 2013-04-28 18:56 yefeng1627 阅读(154) 评论(0) 推荐(0)
摘要:题意: 有N(n<=1000)个数 a1,a2,..,an, ai <= 10^15, 取其中部分组合相乘的到数是一个完全平方数.求方案总数.其中保证 ai 不包含大于500的质因子.解题思路: 解决本题需要有,线性代数基础. 涉及到关于矩阵的初等变换与高斯消元.求解齐次方程. 首先考虑,一个数 x = p1^e1 * p2^e2 * ... * pn^en 若其是一个完全平方数,则 所有的 ei % 2 == 0 . 另外. 取部分数相乘. 例如三个数 ai*aj*ak = x ,此时我们只关心的是其对应的质因子的幂皆为偶数. 所以对于 ai = p1^e1 * p2^e2 * 阅读全文
posted @ 2013-04-28 17:08 yefeng1627 阅读(192) 评论(0) 推荐(0)
摘要:解题思路: 首先考虑题目数据大小范围, 总共9个不同数字的全排列, 9! = 3*10^5 假设N = 9!, 意味着,拼图的状态有N种, 将其看成顶点.[1,N] 则因为每次只能够移动0, 且每次只能向四个方向移动,则意味着每个顶点至多有四条边.且每条边的长度为1. 假定序列 (876543210) 目标序列, 其编号为 st, 则我们可以通过求 单源点的最短路. 求出从st出发到其他顶点v的最短距离 dis[v]. 那么对于T次询问操作. 我们只需要O(1)的时间 输出dis[v]就可以了. 另外还有个问题就是. 对于 (0,1,..,8)的全排列,如何唯一编号.这里就用到... 阅读全文
posted @ 2013-04-28 16:27 yefeng1627 阅读(150) 评论(0) 推荐(0)
摘要:题意: 两个都含有N个元素的数组a,b, 求 a[i]+b[j] ( i , j < N ) 的前 M个最小值(M < N)解题思路: 假定a,b数组都有序,则我们有下面的结论: a_1 + b_1 <= a_1 + b_2 <= ... <= a_1 + b_n a_2 + b_1 <= a_2 + b_2 <= ... <= a_2 + b_n ... a_n + b_1 <= a_n + b_2 <= ... <= a_n + b_n 那么我们就可以得出一个 N*N 的矩阵.如下形式 A(1,1), A(1,2), ... 阅读全文
posted @ 2013-04-28 16:10 yefeng1627 阅读(155) 评论(0) 推荐(0)
摘要:题意: 统计长度为n的绳子,截成多个相似三角形,方案数思路: 先整体看此题, 设定一个函数 g(x), 表示周长为x的本质三角形(a,b,c),其 gcd( a,b,c ) = 1, 的数量 则我们可以知道, 对于长度为 n 的铁丝, 能拆成 n/d 个长度为 d的 本质三角形, d个点,d-1个空隙, 因为可以组合,这样得到的三角形两两相似, 方案数就是 g(d) * r^(n/d-1) . 大意就是利用最小单位的三角形来拼.d-1个空隙都有两个选择,取于不取,取则分开,不取则组成成一个大三角形,则最终结果为 \sum g(d) * r^( n/d-1 ) 其中 n%d = 0... 阅读全文
posted @ 2013-04-25 20:27 yefeng1627 阅读(495) 评论(0) 推荐(0)
摘要:题意: 给一个N(n<=1e4), M个数字(长度为1),问最小的数x(x%n=0) 不包含这m个数。思路: 直接求,没想出解法. 对于一个数 x%n = m, 则 x` = x*10+i , 有 m` = (m*10+i)%n 我们可以利用 除了M个数字外的 数来构造这个 X. 因为需要最小的, 则其长度与字典序排列皆最小. 通过BFS进行搜索. 每一个 模n的余数之取第一次出现的,因为之后再出现的. 只可能更长或者更大. 必定不是最优解. 搜索节点,保存三个信息: 当前x的最后一位, 当前x%n的余数, 当前节点的父亲节点. 结果输出利用记忆父亲节点 ,然后递归输出即可.Vi... 阅读全文
posted @ 2013-04-24 17:07 yefeng1627 阅读(432) 评论(0) 推荐(0)
摘要:题意: 定义 f(x) = { num | a*b| x } , 求 \sum { f(x) } , x <= 10^11思路: 题目等价于求 a*b*c <= n 的数量. 假定 a <= b <= c. 则 a <= n^(1/3) , b <= n^(1/2) 所以我们可以通过枚举 a,b 计算出数量,时间复杂度未 O(n^(2/3)) 对于枚举的 a, b, c; 有三种情况 1 . 三个相等 a, a, a 则只需要计算一次 , 数量为: n^(1/3) 2. 二个相等, a, a, b or a, b, b 则需要计算 C(1,3) = 3 次 阅读全文
posted @ 2013-04-24 15:15 yefeng1627 阅读(301) 评论(0) 推荐(0)
摘要:首先是对于概率的计算,负二项分布: 物品A取与不取概率为,p,1-p, 共取 k+r次,最后一次取A ,且取A总次数为 r 次概率为: 则这里两个盒子取也可转换成此模型, 则期望公式为: 然后是公式的计算, 这里有两个问题. 1. 组合数 \binom{ 2n }{ n } 太大,会上溢 2. p^n 太小会下溢.对于问题一: 排列过大,考虑到 y = logx 函数, log(n!) 也不会很大. 又 令 f(x) = log( x! ),则有 预处理出 函数f() 就可以 O(1)求出 log( \binom{n}{m} )了. 然后 再求个 exp( x ... 阅读全文
posted @ 2013-04-24 13:48 yefeng1627 阅读(1300) 评论(0) 推荐(0)
摘要:解题报告转摘自其它博客。最好看这里http://acmicpc.info/archives/1229A 这题非常简单,全场所有队都过了。B此题只需要枚举每个盒子还剩了几个糖,算出其概率就可以了,不过需要推一会儿公式。 i = 0,1,...,nC 分两部分处理。首先计算出周长为L的本质不同三角形个数,可以O(n)递推;而后对于原问题可以直接枚举n的约数来处理。源代码主干如下: for(int i=1; i<ran; i++)a[i]=add(a[i-2],i/3-i/4);for(int i=1; i<ran; i++)for(int j=i+i; j<ran; j+=i)a 阅读全文
posted @ 2013-04-23 22:57 yefeng1627 阅读(293) 评论(0) 推荐(0)
摘要:#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;const int inf = 0x3f3f3f3f;const int N = 101;int n, m; struct Matrix{ int mat[N][N]; Matrix(){ memset(mat,0,sizeof(mat)); } void input(){ for(int i = 0; i < m; i++) for(i... 阅读全文
posted @ 2013-04-22 22:48 yefeng1627 阅读(224) 评论(0) 推荐(0)
摘要:题意: 有N个顶点,每个顶点由M*M矩阵构成, 对于顶点 A, B,C, 若 A*B = C,则存在一条路 (a,c)路径为1, K次询问,问 (x,y)最短路径。 N,M 《= 100解法: 用矩阵乘法 暴力找出 顶点间关系, 然后Floyd跑一次。 好久没写矩阵乘法了。顺便当模板敲一次。View Code #include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;const int inf = 0x3f3f3f3f;cons 阅读全文
posted @ 2013-04-22 22:47 yefeng1627 阅读(148) 评论(0) 推荐(0)
摘要:乱搞.#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>#include<stack>using namespace std;const double Pi = acos(-1);const double eps = 1e-8;char str[310][10];int n, m;int sign(double x){ return x<-eps?-1:(x>eps);}stack<dou 阅读全文
posted @ 2013-04-22 21:18 yefeng1627 阅读(162) 评论(0) 推荐(0)
摘要:题意: N个顶点(N<=10000),N-1条边,每条边含有一个权值,有T个基地,需要删除K条边,形成K+1个连通块,使每个连通块包含至少一个基地. 求最小花费.解法: 还是太弱. 看完题没敢想 O(N^2)的算法,最初想建模求最小割,后面又想到点分治,但是O(N^2)的空间复杂度。。。。。 其实题目给了10S, 将所有边从小到大排序后, 尝试删除该边,若此边两端 联通快,都包含基地,则删除. 处理出来K+1个联通块就是答案了.View Code #include<cstdio>#include<cstdlib>#include<cstring>#in 阅读全文
posted @ 2013-04-22 20:02 yefeng1627 阅读(155) 评论(0) 推荐(0)
摘要:Splay 的属性 1 struct Splay{2 int rt, cnt;3 int ch[N][2], pre[N], sz[N];4 LL sum[N], add[N], val[N];5 }Splay 的操作主要集中在 1. Rotate( x, d ) 旋转分为 左旋(d=0), 右旋(d=1) 2. Splay( x, goal ) 将节点x 旋转到 节点goal下 3. Rotate_To( k, goal ) 将左数第k个节点旋转到 节点goal 下 1 void rotate(int x,int d){ 2 int y = ... 阅读全文
posted @ 2013-04-17 12:59 yefeng1627 阅读(204) 评论(0) 推荐(0)
摘要:题意 N个骑士,分别有个名字和战斗值。现在一个擂台上PK,第一个人上,之后的人一个一个上。若出现替换,则次数加1. 然后M次询问,每次一个K,问替换次数为K的序列,方案总数,以及字典序(骑士名)最小的方案输出。解题思路 DP优化总方案数 假定 p_1 < p_2 < ... < p_n 状态dp[i][k],表示前i个骑士已经分配完策略,这个时候放 j = [ i+1, n ] 中任一个。 当 p_j 放到 i+1 位置时, [ i+2, p-1 ] 中任意一个其实都不能替换掉 p_j , 则其在 [ i+2, n ] 这些位置可以随意放。 则我们得出转移方程... 阅读全文
posted @ 2013-04-16 21:18 yefeng1627 阅读(207) 评论(0) 推荐(0)
摘要:hdu 2131View Code#include<stdio.h>#include<string.h>int main(){ char ch[2],s[210]; while(scanf("%s %s",ch,s)!=EOF) { char x = ch[0]; int len = strlen(s); int cnt = 0; if( x >= 'A' && x <= 'Z' ) { for(int i = 0; i < len; ++i ) ... 阅读全文
posted @ 2013-04-16 10:19 yefeng1627 阅读(180) 评论(0) 推荐(0)
摘要:另附 2013 个人选拔赛排名: 阅读全文
posted @ 2013-04-16 09:56 yefeng1627 阅读(161) 评论(0) 推荐(0)
摘要:题意 N个数,M个操作,操作有三类: 1. D,A,B,C 区间[a,b]中 大于0 的数 除以C,计算机整除 2. M,A,B,C 区间[a,b]所有数减去C 3. S,A,B 区间[a,b]求和解法 区间更新和求和,线段树上延迟更新就可以了。主要是除法如何维护。 这里的数C <= 5*1E5 , 因为大于0才除,所以每个数最多被除 log(Ai) 次, N个数则最多被除 N*log(Ai) 次了。 所以做除法可以直接更新到底,还有就是使用一个标记,区间中都不可被除时,就没必要更新到底了。 另外,除数是1的时候,不能除,貌似后台数据好多1,╮(╯▽╰)╭~~~ Vi... 阅读全文
posted @ 2013-04-15 09:35 yefeng1627 阅读(1258) 评论(0) 推荐(0)
摘要:对于序列 a_1,a_2,..a_i.,a_n从小到大排列处理花费会最小。一个一个处理完,例如当处理 a_1 则此时花费分为 a_1, 以及 a_x (x>1)的花费来计算 1. a_1 时 2. a_x 时 当消除掉 a_1 后,又生成一个新的 序列 a_1`, a_2`, ..., a_n` 此时可以知道, a_i` = a_i - a_1 + 1 我们可以通过 线段树来 维护更新序列,这样省事. 但是这题 n = 1e5 , 且极限T = 100, 此时时间复杂度达到 1e7,若再添加个 log(N) 复杂度,就会TLE了。 我们可以发现总花费为 序列除了被... 阅读全文
posted @ 2013-04-14 21:56 yefeng1627 阅读(268) 评论(3) 推荐(0)
摘要:Problem A 一边输入边一边维护残留网络,然后跑ISAP。小数据过了,大数据TLE。据说可以BFS预处理 层次网络。可以过。View Code #include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>using namespace std;const int inf = 10000000;const int MAXN = 500;#define MIN(a,b) (a)<(b)?(a):(b)#define MAX(a,b) (a)>(b)?( 阅读全文
posted @ 2013-04-14 21:29 yefeng1627 阅读(281) 评论(0) 推荐(0)
摘要:1 namespace MappingBinaryHeap{ 2 /* 3 DS: 4 Datastructure to show the value 5 Heap: 6 1.Ds:value 7 2.idx:index 8 pos: 9 The position for each index10 len:11 The volum n of heap12 hh:13 heap14 Push:15 insert an element16... 阅读全文
posted @ 2013-04-12 15:39 yefeng1627 阅读(316) 评论(0) 推荐(0)
摘要:Problem A 客户数量 可以得出将长度为 len的蛋糕切成 len段 1的,不管如何切,总花费都为 len*(len-1)/2 对于每个顾客,来到的时间st,以及需要的蛋糕长度k,则有一个终止时间ed = st+k*(k-1)/2 对每个顾客求出其服务终止时间,然后得到n个区间,将区间以终点排序,然后线性扫过去,用i的起点时间与前一个服务顾客 的终点时间比较即可。 时间复杂度 O( NlogN )View Code #include<cstdio>#include<cstring>#include<algorithm>#include<casse 阅读全文
posted @ 2013-04-12 12:31 yefeng1627 阅读(338) 评论(0) 推荐(0)
摘要:题意: n个单词,每行字符数量m个,单行字符数量值为j时,花费我 (m-j)^3 单词间有一个空格,问最小花费。 最后一行不花费解法 dp[i][j] 表示前i个单词,长度为j的最小花费 // 最后一行多余空格不作为计算,只有出现换行时才计算。// dp[i][j] 表示前i个单词,长度为j的最小整齐度// 由 dp[i][j] 通过添加一个 单词 L[i+1] 只可能导致两种情况// 1, 依然在一行,此时应满足条件 // 若 j == 0 ,则此时必定可以添加到后面有// dp[i+1][ L[i+1] ] = Min{ dp[i][j] }// 若 j > 0... 阅读全文
posted @ 2013-04-10 18:41 yefeng1627 阅读(155) 评论(0) 推荐(0)
摘要:题意 n(n<=2e4)个顶点m(m<=6e4)条边,每个顶点有个权值val_i, 然后有Q(Q<=5e5)次操作. 操作分为三类: D x : 删除第x条边 Q x k : 查询与节点x关联的所有顶点中第k大 C x V : 将节点x的权值更改为V 输出查询的均值 /sum { Query_val } / Query_num解题思路 离线算法 对于删除,可以通过将所有操作读入后,从后往前处理。把删除边转换成插入边。 对于查询第k大顶点,我们可以使用 treap维护的名次树 kth来实现 对于修改操作,我们先将原来的值删除,然后再插入新值。 因为我们使用离线逆向... 阅读全文
posted @ 2013-04-09 20:29 yefeng1627 阅读(684) 评论(0) 推荐(0)
摘要:Treap是一颗拥有键值,优先级两种权值的树. 对于键值而言,这棵树是排序二叉树(BST Balance Sort Tree); 对于优先级而言,这棵树是堆,既在这棵树的任意子树中,根节点的优先级是最大的(这个性质称为堆性质) 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 using namespace std; 6 struct Node{ 7 Node *ch[2]; //左右子树 8 int r; // 优先级,数值越大, 阅读全文
posted @ 2013-04-08 20:23 yefeng1627 阅读(432) 评论(0) 推荐(0)
摘要:题意 N个人,每个人有一个属性(x,y), 若对于一个人P(x,y),不存在P`(x`,y`)使 x`< x , y` <= y or x` <= x , y` < y , 则认为 P是有优势的.问逐一的输入N个人信息,在当前情况下有优势的人的数量.解题思路 若添加当前人信息进入, P(x,y), 其可能有两种情况: 1. 若 存在 P`(x`,y`), 使得 x`<x,y`<=y or x`<=x,y`<y, 则P无优势,则不必加入. 2. 若其不存在则其 有优势,并会导致部分点失去优势,将那些点删除. 这里 通过 <x,y> 进行 阅读全文
posted @ 2013-04-08 19:04 yefeng1627 阅读(168) 评论(0) 推荐(0)
摘要:Splay 概念文章:http://blog.csdn.net/naivebaby/article/details/1357734叉姐 数组实现:https://github.com/ftiasch/mithril/blob/master/2012-10-24/I.cpp#L43Vani 指针实现:https://github.com/Azure-Vani/acm-icpc/blob/master/spoj/SEQ2.cpphdu 1890 写法:http://blog.csdn.net/fp_hzq/article/details/8087431HH splay写法:http://www.n 阅读全文
posted @ 2013-04-07 21:59 yefeng1627 阅读(1515) 评论(0) 推荐(0)
摘要:int gcd( int a, int b ){ if( a == 0 ) return b; if( b == 0 ) return a; if( a%2 == 0 && b%2 == 0 ) return 2*gcd( a/2, b/2 ); else if( a%2 == 0 ) return gcd( a/2, b ); else if( b%2 == 0 ) return gcd( a, b/2 ); else return gcd( abs(a-b), min(a,b) );... 阅读全文
posted @ 2013-04-07 13:18 yefeng1627 阅读(119) 评论(0) 推荐(0)
摘要:A Jason的特殊爱好 组合数学, 通过计算 [1,n]区间数量解决. 假设n十进制表示位数为L,则通过统计长度为 L, L-1, ..., 1的数量来得出结果. 假设 n = a1,a2,a3,...,aL // 十进制表示,其中a1为高位 一.当长度小于L, 假设其为 len = 1,2,...,L-1 则当前数 X = a1,a2,a3,...,a_len 因为 Length(X) < Length(N), 所以任意的X都小于N, 我们可以枚举 X中包含的1的个数,假设其为 K, 则 K = 0,1,2,...,len... 阅读全文
posted @ 2013-04-06 18:32 yefeng1627 阅读(295) 评论(0) 推荐(0)
摘要:一, Sequence SearchView Code // Sequence_Search// yefeng1627#include<stdio.h> #include<stdlib.h>#define True 1#define False 0#define MaxLength 100typedef int KeyType;typedef int DataType;typedef struct{ KeyType key; //关键字域 DataType other; //其它属性域 }ElemType;typedef struct{ ElemType... 阅读全文
posted @ 2013-04-05 22:29 yefeng1627 阅读(410) 评论(0) 推荐(0)
摘要:未解决的题 F.Arrange Books并查集+树状数组。如果不考虑抽出书本的操作,这是一道相对简单的并查集题目,只需给每本书再开一个域,记录其上有多少本书即可。我们发现,当书堆起来的时候,可以按照从上到下的顺序给每本书重新编号,如果抽出一本书,则可以在这本书的新编号上标记-1,表示删除。如果要统计书本i(设书本i的新编号为y)上有多少本书,则可以把它最上面的那本书的新编号x找出来,数x到y之间有多少本书被删掉,然后就能得解。从这时候想到了什么?树状数组!所以,我们先把所有操作存起来,然后进行一次堆书的操作,这时候不考虑抽出书,根据最后的书在各自书堆的顺序,给一个新编号。最后,重新进行一次. 阅读全文
posted @ 2013-04-05 22:11 yefeng1627 阅读(192) 评论(0) 推荐(0)
摘要:题目 给N个name ,与N个id, 及其之间关系, 求唯一匹配解法 删除边(u,v)后若匹配数减小,则证明此边必定为唯一匹配。 时间复杂度有点高。View Code #include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<string>#include<map>#include<iostream>using namespace std; map<string,int> mp_name,mp_id;c 阅读全文
posted @ 2013-04-04 12:55 yefeng1627 阅读(306) 评论(0) 推荐(0)
摘要:题目大意 N件物品, 每件物品价值为a[i],数量为b[i], 问分成两堆差值尽量小.解题思路 感觉像是多重背包的变形~~~ 状态DP[N][V]表示,前i件物品,价值为V的方案数 转移方程 dp[i][ j+k*a[i] ] += dp[i-1][j] // k = 0..b[i] #include<stdio.h>#include<stdlib.h>#include<string.h>const int N = 250010;int dp[2][N];int main(){ int a[110], b[110], n; while( scanf(&quo 阅读全文
posted @ 2013-04-03 20:30 yefeng1627 阅读(201) 评论(0) 推荐(0)
摘要:对于路径覆盖概念请点击以下链接: Path Cover#include<stdio.h>#include<stdlib.h>#include<string.h>const int N = 150;int n, m;int ma[N],mb[N];bool g[N][N], vis[N];int path( int u ){ for(int v = 1; v <= n; v++){ if( g[u][v] && !vis[v] ){ vis[v] = 1; if( ma[v] == -1 || path( ma[v] )){ ... 阅读全文
posted @ 2013-04-03 19:41 yefeng1627 阅读(199) 评论(0) 推荐(0)
摘要:题意 一个序列,求其所有长度为k的子序列最大最小值解法 单调队列维护最大最小。平摊时间复杂度到O(1)这题T了几次,因为C++,G++编译器不同的缘故。 感谢 纳米,科普。 具体见下yefeng1627(361072774) 19:06:28 求解 c++ 与 g++ (GUN c++)yefeng1627(361072774) 19:06:45 这个是为什么? 好像记得去年暑假HDU多校也有过这样的事情...yefeng1627(361072774) 19:06:53 有一题~~纳米(549950130) 19:07:05 所谓C++... 一般都是指VC..ye... 阅读全文
posted @ 2013-04-03 19:15 yefeng1627 阅读(204) 评论(0) 推荐(0)
摘要:题意 一个序列 a_1,a_2,..,a_n, 求最长子序列,满足 low <= max{ai}-min{ai} <= high.解题思路 首先考虑区间 [i,j], 我们可以通过固定右边界,来实现区间的滑动.以求解最佳值. 我们首先观察题目要求 low <= max{a_i,a_j}-min{a_i,a_j} <= high. 假定我们固定了右边界, 令 d = max{a_i,a_j} - min{a_i,a_j} 意味着我们只能移动 左边界i, 对于左边界的移动会导致两种情况 1. max{ a_i.a_j } 下降 2. min{ a_i, a_j } ... 阅读全文
posted @ 2013-04-03 15:46 yefeng1627 阅读(225) 评论(0) 推荐(0)
摘要:Just a note because of a failure understand for the Path Cover 以下内容均来自:http://en.wikipedia.org/wiki/Path_cover 对于有向图 G Belong (V,E), 一个路径覆盖就是:一个由多条有向路径组成的集合,并且每一个顶点 v Belong V, 其至少(同时也至多)属于一条路径. 注意,一个路径覆盖可能包含路径长度为0的情况.(单个顶点时). 路径覆盖也能够定义为: 一个不相交的路径覆盖. 一个由多条路径组成的集合,每一个顶点 v Belong V 都准确的属于一条路径. ... 阅读全文
posted @ 2013-04-02 22:56 yefeng1627 阅读(952) 评论(0) 推荐(0)
摘要:题意 N个人,其中包含男女,然后某些男女之间有关系。现要求找出最大的K人,其之间两两无关系。解题思路 最大独立子集问题。 题意是求最大独立集,但是N太大(其实也不大,就是数据好强,KB算法T了), 因为男女生有边,男男或者女女之间不会有边,所以理论上将男女分开,然后就形成二分图了. 但是,男女情况不明....我是将N个看成一个集合,与其自身匹配. 拆点将N个人看成 集合A{N},与集合B{N},然后求最大匹配, 结果即为最大独立集 : N - 最大匹配/2#include<stdio.h>#include<stdlib.h>#include<string.h> 阅读全文
posted @ 2013-04-02 19:41 yefeng1627 阅读(565) 评论(0) 推荐(0)
摘要:---恢复内容开始---题意 N*N的土地,某些点被挖成池塘了,其余为空地, 现在要组织成1*2的空地出售,问最大能出售的数量。解题思路 因为 R*C - K <= 50 意味着,去除掉池塘后最多只有50个空地 每个顶点与其上下左右的空地 连接,然后 构成二分图。 转换成求最大独立边(任意两条边不共用相同顶点)即为最大匹配。#include<stdio.h>#include<stdlib.h>#include<string.h>const int N = 110;int r, c, n, m, k;bool g[N][N], use[N][N];int 阅读全文
posted @ 2013-04-02 18:48 yefeng1627 阅读(542) 评论(0) 推荐(0)
摘要:题意 P个课程,N个学生,之间有边连接,问是否可以 P个学生选择不同的P个课程。解题思路 最大匹配#include<stdio.h>#include<stdlib.h>#include<string.h>const int N = 310;int p, n;bool g[110][310];int ma[N], mb[N];bool vis[N];int path( int u ){ for(int v = 1; v <= n; v++){ if( g[u][v] && !vis[v] ){ vis[v] = 1; if( m... 阅读全文
posted @ 2013-04-02 17:13 yefeng1627 阅读(183) 评论(0) 推荐(0)
摘要:题意 两个机器A,B, 分别有 N,M个工作模式, K个作业,可以在( Ai, Bj ) 模式下工作. 机器最初在模式0下.问最小的 切换模式次数.解题思路 A, B 两个天然二分图顶点集合, A,B机器上的两个模式之间连边即为 作业K. 最小的切换次数, 即为 最小顶点覆盖数. 特殊的定理是, 二分图中 最小顶点覆盖 = 最大匹配. (仅仅在二分图中满足. 主要是由于最大独立点集导致)#include<stdio.h>#include<string.h>#include<stdlib.h>const int N = 110;int n, m, k;int 阅读全文
posted @ 2013-04-02 16:56 yefeng1627 阅读(191) 评论(0) 推荐(0)
摘要:题意, N*N 矩阵, 有些地方有行星, 现有一种武器能够攻击一行, 或者一列,问最少攻击次数.消灭所有行星解法. 因为要消灭所有顶点, 同一行中的顶点能 一次 消灭, 同一列的顶点也能 一次 消灭. 我们需要 最小的 攻击次数, 则意味着 最小的攻击次数消灭 所有顶点. 将所有存在行星的顶点(x,y), 按x, y轴分别作为 A,B顶点集合,转换成二分图. 这样 A,B集合连边的代表一次 攻击 箭支 能消灭的行星, 则题目所求就转换成了. 最小的顶点 覆盖所有边, 既 最小顶点覆盖 问题. 又因为, ( 在所有图中都满足) 最小顶点覆盖 + 最大独立子集 = 顶点数... 阅读全文
posted @ 2013-04-02 16:50 yefeng1627 阅读(213) 评论(0) 推荐(0)
摘要:问题 p_i != i and p_i != i+1思路 PS: \sum_{k=0}^n(-1)^k(n-k)!(2n)/(2n-k)\binom{2n-k}{k} 设E_i表示 p_i=i 的{p_n}数量 F_i表示 p_i=i+1 的{p_n}数量 把E,F排成一圈,E_1,F_1,E_2,F_2,…,E_n,F_n 那么,相邻两个集合的交是空 然后证一个引理,在这2n个集合里面挑出k个,两两不相邻的方案数,就是 //psbinomial 二项式 最后套上容斥,就得到想要的,引理很好证 引理证明,继续往后翻聊天记录ftiasch(826513189)16:41:... 阅读全文
posted @ 2013-04-01 21:47 yefeng1627 阅读(321) 评论(0) 推荐(0)
摘要:题意 N*M矩阵,有空地('o')、草地('*')、墙('#‘),机器人能攻击到上下左右,不被墙挡住的方位。并且机器人只能被放置在空地上。问能放置的最大数量机器人,相互间不能攻击到。解题思路 对于所有空地,能够攻击到的相互之间冲突,即可连接成边,然后题目就转换成了 最大独立集问题。但是本题 顶点数量为 50*50 = 2500, 果断TLE。 另外我们可以发现,通过 将每一行相互攻击到的空格位置看成一个点,这些点命名为 {A} 将每一列相互攻击到的空格位置看成一个点,这些点命名为 {B} 则图就转换了二分图, 对于 顶点集 {A} 与 {B} 而言, 之 阅读全文
posted @ 2013-04-01 20:47 yefeng1627 阅读(278) 评论(0) 推荐(0)
摘要:题意 有N根棍子,分别有长度。问将其拼接成X根,长度相同,求最小长度。解法 搜索。 1.因为总共n根棍子,最多拼接成n根相同长度, 并且,组成的棍子数量越多,则长度则越小 2.拼接的棍子数量必定能够 被 \sum{stick_i} 整除 3.若当前棍子长度 stick_i 不能够匹配, 在 stick_i = left_len 或者 stick_i = target_len 情况下, 此长度无合法方案, 因为每一根棍子都将被使用,若有一根不能被使用,则此长度方案必定不能成立.View Code #include<cstdio>#include<cstring>#incl 阅读全文
posted @ 2013-04-01 17:13 yefeng1627 阅读(147) 评论(0) 推荐(0)
摘要:题意 已知一个数X有K个因子,求最小的X。解法 搜索剪枝 对于任意整数 其因子个数为: 意味着 因为需要最小的整数 N, 则我们使用小的质因子总是最优. 所以我们枚举 #include<stdio.h>typedef long long LL;const LL INF = 1000000000000000010ll; int p[12] = { 2,3,5,7,11,13,17,19,23,27,29,31}; int N; void dfs( LL &ans, int i, LL x, int n ){ if( n > N ) return; // 基本减枝 if. 阅读全文
posted @ 2013-04-01 12:21 yefeng1627 阅读(276) 评论(0) 推荐(0)

Launch CodeCogs Equation Editor