- 博客(116)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 acm 常用数据结构与算法专题(未分类均放于此)
并查集:hdu 1232 简单入门第 K 大问题:hdu 1280 简单题,数据很水,可直接用计数排序解题Manacher 算法:HDU 3294 简单题Trie 树:入门题: POJ 2001 POJ 2530 POJ 3630 POJ 1056区间树(线段树):HDU 1166 单点更新 HDU 1754 单点更新 HDU 1394 单点更新,求多排列的最小逆序对数数论:CF LCM
2015-06-28 21:52:28
1797
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 UVA题目分类索引
uva好像经常连不上,可以移步到virtual judge做题。列出来的题我都做过,可以在我博客中找到相关的解题报告。本文章保持更新。水题会用蓝色字体标明。字符串类题目:401 10010103615374091087810815 644 10115
2015-04-20 16:03:28
2672
原创 POJ 3264 解题报告 RMQ 问题 ST算法
这道题可以用线段树、树状数组解决,也可以用 ST 算法。题目意思很明显,最大值-最小值就是结果。第一道用 ST 解决的题目。//ST 算法#include #include #define MAXN (50000 + 10)int cows[MAXN];int st_max[MAXN][20];int st_min[MAXN][20];int n, q, l,
2015-07-17 15:58:09
1912
原创 HDU 1394 解题报告 线段树 单点更新
求逆序对常用方法是归并排序,当然线段树也可以解决,但是空间复杂度就会更大。这题两者都可用。因为只需要第一次求出逆序对数即可,后面的排列都可以推出来。具体怎么推?假设 sum 是第一次求出来的逆序对。 第一次排列是 1 3 6 9 0 8 5 7 4 2那么,第二次就会是3 6 9 0 8 5 7 4 2 11 被放到末尾,自然需要在 sum 上减去包括1
2015-07-16 19:37:36
1621
原创 Codeforces Round #146 (Div. 1) LCM Challenge 解题报告 数论 找规律
题目链接:http://codeforces.com/problemset/problem/235/A题目意思:找出三个小于 n 的数,这三个数组成的 LCM(最小公倍数)是最大的。首先,这三个数应该是互质的。根据 LCM 的公式 (a * b) / gcd(a,b),gcd(a,b)为1时,即互质,LCM 值是最大的。然后开始找规律:如果是奇数的话(n=7),那么
2015-07-16 11:32:34
1758
原创 HDU 1754 解题报告 线段树 单点更新
线段树入门题,单点更新。每个结点存储两个孩子最大者即可。//线段树单点更新,完全二叉树解法#include #define MAXN 200000#define lson rt<<1#define rson rt<<1|1int top[MAXN * 4 + 100];int students[MAXN + 10];int k;void pushup(int rt){
2015-07-15 10:38:30
1537
原创 HDU 1166 解题报告 线段树
这是一题线段树的入门题,主要是点更新。编码用的是完全二叉树,即数组,用链表会超时。其次用 p #include #define maxn 50000//4倍大小是一个合适的值int ns[maxn * 4 + 100];int nums[maxn]; //完全二叉树存储区间树void build(int p, int l, int r){ if (l == r) {
2015-07-14 23:25:01
1577
原创 POJ 2846 解题报告 Trie 树变型
题目意思:给一个待查询的字符串,输出包含这个字符串(作为子串)的个数。数据量比较大,用 KMP 会超时。可以用 Trie 树,不过需要变型。正常的 Trie 树是以前缀开始的。在这题需要改成以后缀开始,后缀指以字符串每个字符作为开始直至结尾。例如字符串 abcdae ,各个后缀是 abcdae,bcdae,cdae,dae,ae,e。这样就很方便查询子串出现的次数了。但是要
2015-07-05 12:20:30
1498
原创 POJ 1056 解题报告 Trie 树
这题跟poj 3630一样,也是找前缀,数据更弱。代码:#include #include #define maxn 10#define wlen 10 //单词长度#define character '0'#define size 2 typedef struct node { int cnt; //记录访问量 int child_num; //记录孩子个数
2015-07-05 00:05:55
1552
原创 POJ 3630 解题报告 Trie 树
题目意思:如果某个 number 是另一个 number 的前缀,则 输出 NO。可以用 trie 树,这题有多组数据,要注意清零。代码:#include #include #define maxn 10000#define wlen 10 //number长度#define character '0'#define size 10 typedef str
2015-07-04 21:31:21
1529
原创 POJ 2530 解题报告 trie 树
题目意思:给含有两个单词的映射关系的字典,然后查询接下来每个输入字符串的对应字符串。这题可以用 hash 或者 trie 树,都是入门级别。代码://这题是 trie 树 和 哈希 的入门题。#include #include #include #include #include #include using namespace std;#defi
2015-07-04 17:29:27
1597
原创 POJ 2001 解题报告 trie 树
题目意思:就是找能标识每个字符串自身的最短前缀。可以用 Trie 树解决,只需要记录每个结点的访问次数,那么每个字符串的最短前缀,要么就是到访问次数为1的那个字符结点为止的字符串,要么就是遍历完毕还没有遇到访问量为1的字符结点时,最短前缀就是自身。代码:POJ 2001#include #include #define maxn 1010typedef struc
2015-07-04 11:11:09
1480
原创 HDU 3294 解题报告 Manacher 算法
题目意思:对输入的字符串做两步处理,第一步先按要求转换。第二步在转换后的字符串中找出最长的回文子串。最长回文子串可以用 Manacher 算法解决。参考这篇
2015-07-03 16:10:09
1611
原创 HDU 1280 解题报告 第 K 大
求第 K 大的一道题,题目意思很直白,数据也比较水,没有负数。所以可以直接用计数排序解决。代码:#include #define MMAX 5003#define NMAX 3000int count[MMAX * 2];int N[NMAX];int main(){ int n, m, max; while (scanf("%d %d", &n, &m) !=
2015-07-01 07:30:09
1388
原创 HDU 3573 解题报告
这题需要注意,75被裁剪之后所剩余不能用于下一次。三种票:28 + 20 * 2 32 + 20 * 2 20 * 3 28 * 2 32 * 2 28 + 32 先用完长度20的,用它去与28或32组合,然后,再根据长度20所剩的大小去计算。代码链接:HDU 3573
2015-06-26 20:58:15
1486
原创 HDU 5272 解题报告
这是一道 bestcoder round45 的1001题。 简单题,找出二进制中连续的1有多少个就可以了。代码链接:HDU 5272
2015-06-21 11:01:01
1522
原创 HDU 3342 解题报告
这是一题简单的判断有向图是否有环。 参考《算法导论》22章里用白、灰、黑三色标记结点的方法,在深搜的时候只要发现下一个结点是灰色的就说明有环。代码链接:HDU 3342 用 dfs 解题还可以用拓扑做此题。 代码链接:HDU 3342 用拓扑解题
2015-06-18 21:46:19
1480
原创 HDU Count 101 解题报告
题目意思: 找出所有不含有“101”子串的个数这题可以用 DP。 用 DP[i]代表长度为 i 时的不含有“101”子串的个数。 观察可以发现,DP[i] = 2*DP[i-1] - 以“10”结尾的 DP[i-1]个数。 而 以“10”结尾的 DP[i-1]个数 是 以“0”结尾的 DP[i-1]个数 减去 以“0”结尾的 DP[i-2]个数。 任意一个 DP[i],以“0”结尾的个数有
2015-06-14 21:32:46
1554
原创 HDU 1025 解题报告
这是一道 LIS (最长升序子序列)的问题。 这题是不需要考虑元素重复的情况。 数据比较大,需要用 O(nlogn)才能解题。 注意输出有 load和 loads 的坑。。。代码链接:HDU 1025
2015-05-22 23:19:01
1637
原创 HDU 2046 解题报告
这是一题简单的递推题,可以用 dp 解题。递推公式: F(i) = F(i-1) + F(i-2)需要注意这题50时会爆 int。所以用__int64代码链接:HDU 2046
2015-05-19 15:55:13
901
原创 HDU 2602 解题报告
题目意思: 这是一道无变型的经典基础01背包问题。递推公式: F(i, j) : i 个骨头, j 的体积限制时的背包的最大价值 V[i] : 第 i 个骨头的体积 N[i] :第 i 个骨头的价值 F(i, j) = max{F(i-1, j), F(i-1, j-V[i]) + N[i]}注意这题的数据会有骨头体积为0却有价值的情况。代码链接:HDU 2602
2015-05-18 07:51:47
791
原创 POJ 1163 解题报告
题目意思: 在 Triangle中从上到下,按照规则走,找出路径最大值。思路: 这题可以用 DP 去解。 子问题定义为 F(i, j)。 i 是行数, j 是列。 F(i, j)的值是从第 i 行第 j 列开始的 Triangle 的路径最大值,即问题的解。得出递归公式是: F(i, j) = A[i][j] + max{F(i+1, j), F(i+1, j+1)}代码链接:POJ 116
2015-05-15 22:23:11
543
原创 UVA 400 解题报告
题目意思: 就是输出 input 里面的文件名。 文件名直接排序即可,没难度。 这题难在输出。要注意,ls 的输出是怎么样。我就在这里 wa 了好几次,怎么想要不明白,后面才发现我理解的输出形式与 ls 的不一样的。 ls 的输出形式是:从左至右,从上到下的升序输出。代码链接:UVA 400
2015-04-26 23:57:40
1073
原创 UVA 10785 解题报告
题目意思: 按照命理家给出的规则起一个名字。 规则: 1. 名字所以的元音和辅音加起来的值要最小。 2. 元音在偶数位,辅音在奇数位。 3. 辅音元音辅音元音辅音元音这样的形式。不得有连续二个或以上的元音或辅音。 4. 同一个辅音字母不得超过5个。原因不得超过21个。 5. 输出的名字应该是字典序最小的。 6. 名字应该是值最小,然后才是字典序最小的。代码链接:UVA 10785
2015-04-26 10:30:50
464
原创 UVA 123 解题报告
题目意思: 就是根据 word 进行字典序排序输出 titile。只是title 中的某些 word 要进行ignore。代码链接:UVA 123
2015-04-25 21:36:55
549
原创 UVA 120 解题报告
题目意思: 给出一序列。问需要翻转那些位置的元素能够使到序列变为升序。输出这些位置。最后加一个0.解法:每次取出下一个最大的数,如果这个数当前的位置是合法的,就 continue。否则就根据这个元素的位置进行选择翻转。代码链接:UVA 120
2015-04-24 10:47:09
1027
原创 UVA 156 解题报告
题目意思: 找出出现次数仅一次的字符串。用 C++的 map 也很方便解决这题。注意点: 1. 输出时候是大小写敏感的。 2. 两个字符串,只要所组成是一样的就意味着是相等的字符串。哪怕顺序不一样或分别是大小写。代码链接:UVA 156
2015-04-23 11:40:37
972
原创 UVA 755 解题报告
题目意思: 找出重复的电话号码,并输出重复次数。用 c++的 map。打个字母到数字的映射。就可以直接粗暴地解决这题了。注意点: 1. 不同测试集中间的输出要加一空行。最后一个不需要。代码链接:UVA 755
2015-04-23 09:57:10
528
原创 UVA 152 解题报告
题目意思: 简单来说,就是求一棵树的最邻近的树。然后与这课树的距离是否在[0,10)之间,如果是就统计起来并输出。 PS:是不是水题题目都那么的绕。得看好一会儿才能明白意思,有些题目还得查查意思 - -注意点: 1. 输出用 “%4d”。不然会 pesentation error.代码链接:UVA 152
2015-04-22 19:46:55
429
原创 UVA 10474 解题报告
题目意思: 简单来说,就是在以升序排序后的 N 里面找到每一个 Q的位置,按照规定格式输出。用 c++做的话思路就十分显浅了,用 vector 即可。代码链接:UVA 10474
2015-04-22 15:43:01
613
原创 UVA 10420 解题报告
题目意思: 简单来说,就是直接统计国家名字出现的次数。使用 c++的 map 就可以很方便的 ac 这道题。输出时候因为 map 内部实现的特性,所以直接用迭代器输出的时候就是按照 key 的‘<’的操作进行输出。代码链接:UVA 10420
2015-04-22 12:48:26
615
原创 UVA 10106 解题报告
题目意思: 模拟大整数的乘法,两个数都是大整数。注意点: 1. 注意任意一个数是零时的处理。 2. 注意前导零的处理。代码链接:UVA 10106
2015-04-21 17:26:14
523
原创 UVA 424 解题报告
题目意思: 就是数个大整数相加,然后输出结果。注意点: 1. 输出需要加’\n’,不然会 WA。 2. 要注意前导零这些情况的处理。 3. 最左边的进位也要注意处理。代码链接:UVA 424
2015-04-21 16:34:49
682
原创 UVA 10494 解题报告
题目意思: 模拟除法运算。注意点: 1. 除数可以直接用 long long int 保存。 2. 用数组存储商的话,要注意前导零的处理。和被除数小于除数的处理。代码链接:UVA 10494
2015-04-21 11:03:26
696
原创 UVA 644 解题报告
题目意思: 判断 set 里面是否有出现某个 code 是另一个 code 的前缀。 这题用 strncmp() 很好解决。注意点: 1. 输入的数据不会按照由小到大的。代码链接:UVA 644
2015-04-20 15:31:34
583
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人