08 2013 档案
摘要:A.Helpful Maths分析:将读入的字符转化为数字,直接排个序就可以了。#include #include #include #include using namespace std;const int N = 500;int seq[N];int main() { char c; int t = 0, idx = 0; while ((c = getchar()) != EOF) { if (c == '+' || c == '\n') { seq[idx++] = t; t = 0; } ...
阅读全文
摘要:后缀自动机也是解决字符串问题的常用工具,犀利在O(N)的空间复杂度下存在给定串的后缀以及子串,而且支持在线的操作。POJ-1509Glass Beads题意:求一个字符串的最小表示的开始下标。分析:其实有一个O(N)的算法专门来解决这个问题,并且实现非常简单,不过后缀自动机同样能够解决这个问题。首先把这个串重复两次,然后从前往后一一将字符加入到后缀自动机中,最后从根开始向下遍历串的长度层即可。#include #include #include #include using namespace std;const int N = 10005;char str[N];struct SAM { .
阅读全文
摘要:HDU-4698Counting题意:给定一个二维平面,其中x取值为1-N,y取值为1-M,现给定K个点,问至少包括K个点中的一个的满足要求的共有多少中取值情况。也就是说K个点中至少一个点落在所给定的区间内。解法:正面求解,由于点只有1000个,因此直接暴力离散化之后的x轴坐标,对于y轴则可以通过增加一个一个加入点,使用一个set来维护纵轴有多少种不同的取法。#include #include #include #include #include using namespace std;typedef long long LL;const int N = 1005;const int mod
阅读全文
摘要:HDU-4687 Boke and Tsukkomi题意:给定一个简单图,询问哪些边如果选择的话会使得最大的连边数减少。解法:套用一般图的最大匹配算法(带花树)先算出最大匹配数,然后枚举一条边被选择(注意:如果改变被选择,则两端点相邻的边都应删除),看是否只减少一条匹配边。#include #include #include #include #include using namespace std;const int MAXN = 45;int n, m;int u[150], v[150];struct Graph { bool mat[MAXN + 1][MAXN + 1]; ...
阅读全文
摘要:http://hi.baidu.com/myidea/item/142c5cd45901a51820e25039
阅读全文
摘要:分块算法主要用于给定序列的区间询问问题,能够以较小的时间代价暴力求解,时间复杂度一般在O(n*n^0.5)。关键在O(1)维护好某一区间在增加或者减少一个边界元素所带来的影响。需要注意的就是在更新的区间的时候要先放大在缩小,否则可能出现当前区间左右边界互换的情况,这个影响某一些题可能没有影响,但是极有可能出错。时间复杂度:先考虑左边界的时间复杂度,由于分成了sqrt(n)块,而同一块中左标移动的范围最多是sqrt(n),那相邻块跳转的情况呢?可以虚拟出每块中有至少一个询问进行思考,那么相邻块之间的移动次数最大为2*sqrt(n)。由于共有Q次询问,因此最终时间复杂度为O(Q*sqrt(n))。
阅读全文
摘要:HDU-4676Sum Of Gcd题意:给定一个1-N的全排列序列,N同样的有, , , , , , , ,如果此时以为对任意一个因子的个数 t ,取C(2, t)就错了,且不说因子个数只有一个的数不能够成为公因子(例如, 等),就算成为公因子也未必是最大的公因子(例如等)。实际在统计的过程中不采用组合数的方式,而采用观察单个数带来的影响的方式。考虑到已知数 A 的因子 d 在区间其他数中出现了 k 次,那么如果 d 是所有gcd(A, other)的值时,那么最终的结果加上k*d,但这是不一定的,且 d 的因子肯定也是 A 的因子,当枚举到 d 的因子 d' 时显然就不能够加了。当
阅读全文
摘要:test
阅读全文
摘要:引用:刘聪《浅谈数位类统计问题》在信息学竞赛中,有这样一类问题:求给定区间中,满足给定条件的某个 D 进制数或此类数的数量。所求的限定条件往往与数位有关,例如数位之和、指定数码个数、数的大小顺序分组等等。题目给定的区间往往很大,无法采用朴素的方法求解。此时,我们就需要利用数位的性质, 设计 log(n)级别复杂度的算法。 解决这类问题最基本的思想就是 “逐位确定”的方法。下面就让我们通过几道例题来具体了解一下这类问题及其思考方法。SPOJ-2319Sequence题意:给定所有 K 位二进制数:0,1,…,2^K-1。你需要将它们分成恰好 M 组,每组都是原序列中连续的一些数。设 Si(1 ≤
阅读全文
摘要:友情提示:使用该模板的注意了,在大数减法里有一个小错误,导致减法可能会出错// 原来的写法,将t1.len错写成了len while(t1.a[len - 1] == 0 && t1.len > 1){ t1.len--; big--;}// 改正后while(t1.a[t1.len - 1] == 0 && t1.len > 1){ t1.len--; big--;} #include #include #include #include #include using namespace std; #define MAXN 9999#define
阅读全文
摘要:HDU-4655Cut Pieces题意:有N个格子能够被涂色,每个格子能够涂1-ai 种颜色,当N=6,涂色方案:112233 认为方案中共有3个颜色块;涂色方案:121212 认为方案中共有6个颜色块。所谓颜色块也就是整个涂色方案中相同连续的颜色被视作为一个颜色块。问如何安排 ai 的排列使得所有方案颜色块之和最大。分析:从反面求解,首先能够产生的方案数一共有a1*a2*a3*...*an种,每种方案在没有相邻颜色认为为同一颜色块的情况下,颜色块的数量均为n。那么如何减掉重复计算的。可以考虑到任何一个k长连续颜色块,若统计其相邻格子颜色相同数量为k-1,如果减去这些相邻格子数正好满足同一颜
阅读全文
摘要:test
阅读全文
摘要:后缀数组是解决一系列字符串题目的利器,后缀数组中保留了这样的信息。sa[i]表示排名为第 i 位的后缀是从sa[i]开始的。通过倍增算法可以在O(nlogn)的时间复杂度内将所有的后缀进行排序。而height数组也是在处理问题中经常要使用到的,height[i]表示排名第 i 的后缀与排名第 i-1 位的后缀的最长公共前缀的长度。具体见代码。#include #include #include #include using namespace std;const int N = 100005;int wa[N],wb[N],wv[N],ws[N];int cmp(int *r,int a,in
阅读全文
摘要:HDU-4632Palindrome subsequence题意:给定一个字符串,长度最长为1000,问该串有多少个回文子串。分析:设dp[i][j]表示从 i 到 j 有多少个回文子串,则有动态规划方程:str[i] != str[j]:dp[i][j] = dp[i+1][j] + dp[i][j-1] - dp[i+1][j-1];str[i] = str[j]:dp[i][j] = dp[i+1][j] + dp[i][j-1] + 1.#include #include #include #include #include using namespace std;const int
阅读全文