随笔分类 - 数据结构
UVa 10766 Organising the Organisation (生成树计数)
摘要:题意:给定一个公司的人数,然后还有一个boss,然后再给定一些人,他们不能成为直属上下级关系,问你有多少种安排方式(树)。 析:就是一个生成树计数,由于有些人不能成为上下级关系,也就是说他们之间没有边,没说的就是有边,用Matrix-Tree定理,很容易就能得到答案,注意题目给定的可能有重复的。 对
阅读全文
BZOJ 2038 小Z的袜子(hose) (莫队算法)
摘要:题意:中文题。 析:很著名的莫队算法,先把这个求概率的式子表达出来,应该是分子:C(x1, 2) + C(x2, 2) + C(x3, 2) + ... + C(xn, 2) 分母:C(n, 2),然后化成分数的表达形式,[x1(x1-1)+x2(x2-1)+...+xn(xn-1)] / (n*(
阅读全文
HDU 6096 String (AC自动机)
摘要:题意:给出n个字符串和q个询问,每次询问给出两个串 p 和 s 。要求统计所有字符串中前缀为 p 且后缀为 s (不可重叠)的字符串的数量。 析:真是觉得没有思路啊,看了官方题解,真是好复杂。 假设原始的字符串 数组为A,首先将A中的每个字符串都进行翻转,得到字符串数组B,然后,将A和B按字典序排序
阅读全文
LightOJ 1268 Unlucky Strings (KMP+矩阵快速幂)
摘要:题意:给出一个字符集和一个字符串和正整数n,问由给定字符集组成的所有长度为n的串中不以给定字符串为连续子串的有多少个? 析:n 实在是太大了,如果小的话,就可以用动态规划做了,所以只能用矩阵快速幂来做了,dp[i][j] 表示匹配完 i 到匹配 j 个有多少种方案,利用矩阵的性质,就可以快速求出长度
阅读全文
HDU 5834 Magic boy Bi Luo with his excited tree (树形DP)
摘要:题意:给定一棵树,每个点有个权值,每条边有权值,每经过边都会消耗相应的权值,但是点的权值只能获得一次,问你从 i 点出发能获得的最大权值是多少。 析:树形DP,就是太麻烦了,两次dfs,维护一共6个值分别是,从 i 出发的最大值并且返回 i, 从 i 出发的最大值并且不返回,从 i 出发的次大值并且
阅读全文
HYSBZ 1036 树的统计Count (水题树链剖分)
摘要:题意:中文题。 析:就是直接维护一个最大值和一个和,用线段树维护即可,这个题很简单,但是我卡了一晚上,就是在定位的时候,位置直接反过来了,但是样例全过了。。。真是。。。 代码如下:
阅读全文
LightOJ 1065 Island of Survival (概率DP?)
摘要:题意:有 t 只老虎,d只鹿,还有一个人,每天都要有两个生物碰面,1.老虎和老虎碰面,两只老虎就会同归于尽 2.老虎和人碰面或者和鹿碰面,老虎都会吃掉对方 3.人和鹿碰面,人可以选择杀或者不杀该鹿4.鹿和鹿碰面,没事问人存活下来的概率 析:最后存活肯定是老虎没了,首先可以用概率dp来解决,dp[i]
阅读全文
LightOJ 1258 Making Huge Palindromes (Manacher)
摘要:题意:给定上一个串,让你在后面添加一些字符,使得这个串成为一个回文串。 析:先用manacher算法进行处理如果发现有字符匹配超过最长的了,结束匹配,答案就是该字符前面那个长度加上该串原来的长度。 代码如下:
阅读全文
LightOJ 1427 Substring Frequency (II) (AC自动机)
摘要:题意:给定一个文本串和 n 个子串,问你子串在文本串出现的次数。 析:很明显的AC自动机,只要把先把子串进行失配处理,然后再去用文本串去匹配,在插入子串时就要标记每个串,注意串可能是相同的,这个我错了两次,最后匹配一次就OK了。 代码如下:
阅读全文
POJ 1741 Tree (树分治)
摘要:题意:给定一棵树,然后给定每条边的权值,问你有多少个点对满足路径的权和小于等于m。 析:直接枚举是肯定不行的,会TLE,利用分治的思想,我们可以把树按重心分成几部分,那么答案就是所有子树的点对都经过重心的,对于所有的子树的重心也是这样,对于经过重心的,可以先求出每个点都重心的距离,再排序,利用单调性
阅读全文
HDU 3487 Play with Chain (Splay)
摘要:题意:给定一个序列,1 2 3 ... n,然后有两种操作。 第一种是 CUT x y z ,把第 x 到 第 y 个数剪切下来,然后放到第 z 个后面。 第二种是 FLIP x y 把 第 x 到第 y 个反转。 最后输出序列。 析:几乎就是裸的Splay,就是两种操作,剪切和反转,用splay很
阅读全文
POJ 2828 Buy Tickets (线段树)
摘要:题意:给定 n 个人,每次在第 pos 位置,插入一个人,然后后面的向后移动,问你最后的顺序是什么。 析:肯定不能模拟,要不然,肯定TLE,然后我们可以倒着考虑,最后一个人的位置是肯定能确定的,因为他就在最后才插入的,然后剩下的n-1个时,第n-1个人的相对位置也就确定了,依次,这样就可以用线段树来
阅读全文
HDU 3333 Turing Tree (主席树)
摘要:题意:给定上一个序列,然后有一些询问,求区间 l - r 中有多少个不同的数的和。 析:和求区间不同数的方法是一样,只要用主席树维护就好。 代码如下:
阅读全文
SPOJ DQUERY D-query (主席树)
摘要:题意:给定上一个序列,然后有一些询问,问你区间 l - r 中有多少个不同的数。 析:一个主席树入门题,首先是先进行处理,记录不同数出现的个数,如果相同的,先减去以前的,再加上这个最新的, 对于查询,处理好,每一部分。 代码如下:
阅读全文
POJ 2104 K-th Number (主席树)
摘要:题意:给定一个序列,然后有 q 个询问,每次询问 l - r 区间内的第 k 大的值。 析:很明显的主席树,而且还是裸的主席树,先进行离散化,然后用主席树进行查询就好。 代码如下:
阅读全文
HDU 3724 Encoded Barcodes (Trie)
摘要:题意:给n个字符串,给m个询问,每个询问给k个条形码。每个条形码由8个小码组成,每个小码有相应的宽度,已知一个条形码的宽度只有2种,宽的表示1,窄的表示0。并且宽的宽度是窄的宽度的2倍。由于扫描的时候有误差,每个小码的宽度为一个浮点型数据,保证每个数据的误差在5%内。所以一个条形码可以对应一个ASC
阅读全文
HDU 6055 Regular polygon (暴力)
摘要:题意,二维平面上给N个整数点,问能构成多少个不同的正多边形。 析:容易得知只有正四边形可以使得所有的顶点为整数点。所以只要枚举两个点,然后去查找另外两个点就好。 代码如下:
阅读全文
HDU 6047 Maximum Sequence (贪心+单调队列)
摘要:题意:给定一个序列,让你构造出一个序列,满足条件,且最大。条件是 选取一个ai <= max{a[b[j], j]-j} 析:贪心,贪心策略就是先尽量产生大的,所以就是对于B序列尽量从头开始,由于数据比较大,采用桶排序,然后维护一个单调队列,使得最头上最大。 代码如下:
阅读全文
HDU 4081 Peach Blossom Spring (最小生成树+dfs)
摘要:题意:给定一个 n 个点和相应的权值,要求你用 n-1 条边连接起来,其中一条边是魔法边,不用任何费用,其他的边是长度,求该魔法边的两端的权值与其他边费用的尽量大。 析:先求出最小生成树,然后再枚举每一条边,求出最大值,任意两点之间的距离可以通过预处理来解决,最小生成树时,要用prime算法,要不然
阅读全文
HDU 4424 Conquer a New Region (并查集)
摘要:题意:给定一棵树,让你选一个中心城市,问你中心城市到所有其他城市的权值和最小,每条路的权值是该边上和最小权值。 析:从大到小枚举边,然后用并查集进行维护,在合并两个集合时,要考虑两边集合加上该边的的最大的那一个,每次要取最大值。 代码如下:
阅读全文