随笔分类 - 数据结构
HDU 5242 Game (贪心)
摘要:题意:给定一棵树,要求从根结点1走k次,每次都是到叶子结点结束,把走过的所有的结点权值加起来,最大是多少。 析:先把每个结点到根结点的路径之和求出来,然后按权值从大到小排序,然后每次把路径中的权值求出来,最后求前k个值的和即可。 代码如下:
阅读全文
HDU 1890 Robotic Sort (Splay)
摘要:题意:将一列数字排序 排序规则是 每次找到最小值的位置loc 将1~loc所有数字颠倒 然后删掉第一位 直到排好序 排序要求是稳定的。 析:直接用splay来维护最小值,然后插入删除即可。 代码如下:
阅读全文
BZOJ 1500 [NOI2005]维修数列 (splay)
摘要:1500: [NOI2005]维修数列 Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目。第2行包含N个数字,描述初始时的数列。以下M行,每行一条命令,格式参见问题描述中的表格。任何时刻数列中最多含有50
阅读全文
POJ 3690 Constellations (哈希)
摘要:题意:给定上一n*m的矩阵,然后的t个p*q的小矩阵,问你匹配不上的有多少个。 析:可以直接用哈希,也可以用AC自动机解决。 代码如下:
阅读全文
POJ 3691 DNA repair (DP+字符串)
摘要:题意:给出nn(1≤n≤50,1≤n≤50) 个病毒DNA序列,长度均不超过20。现在给出一个长度不超过1000的字符串,求至少要更换多少个字符, 才能使这个字符串不包含这些DNA序列。 析:利用前缀来做好状态转移。 代码如下:
阅读全文
SPOJ QTREE Query on a tree (树链剖分+线段树)
摘要:题意:给定一棵树,然后有一些操作,有两种,一种是改变某条边的权值,第二种是询问从u->v的路径中,边权最大的是多少。 析:就一个树链剖分,然后用线段树维护即可。 代码如下:
阅读全文
HDU 3966 Aragorn's Story (简单树链剖分)
摘要:题意:给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路径上的所有点权值加上K D C1 C2 K:把C1与C2的路径上的所有点权值减去K Q C:查询节点编号为C的权值 析:就是简单的树链剖分,可以用树状数组来维护,然后就OK了。 代码如下:
阅读全文
UVaLive 11525 Permutation (线段树)
摘要:题意:有一个由1到k组成的序列,最小是1 2 … k,最大是 k k-1 … 1,给出n的计算方式,n = s0 * (k - 1)! + s1 * (k - 2)! +… + sk-1 * 0!, 给出s1…sk,输出序列里第n大的序列。 析:我们先看第一数,如果第一个数是2,那么它前面至少有(k
阅读全文
UVaLive 5031 Graph and Queries (Treap)
摘要:题意:初始时给出一个图,每个点有一个权值,三种操作:(1)删除某个边;(2)修改每个点的权值;(3)询问与节点x在一个连通分量中所有点的第K大的权值。 析:首先是要先离线,然后再倒着做,第一个操作就成了加边操作,很容易实现,第二操作,就是分成两个操作,先把x结点删掉,然后再插入一个新结点, 最后一个
阅读全文
UVa 11468 Substring (AC自动机+概率DP)
摘要:题意:给出一个字母表以及每个字母出现的概率。再给出一些模板串S。从字母表中每次随机拿出一个字母,一共拿L次组成一个产度为L的串, 问这个串不包含S中任何一个串的概率为多少? 析:先构造一个AC自动机,然后随机生成L个字母,就是在AC自动机的某个结点走多少步,dp[i][j] 表示在 i 结点,并且剩
阅读全文
UVa 11020 Efficient Solutions (BST)
摘要:题意:给按顺序给定 n 个人群,用x和y来描述,如果有没有任何一个x' < x y' <= y 或 x '<= x y' <= y,那么这个群体就是优势群体, 让你求出每放入一个人群,已经知道的群体有几个优势群体。 析:首先我们知道的是,如果某个群体失去了优势,那么该群体就不可能再获得优势,然后我们
阅读全文
POJ 3693 Maximum repetition substring (后缀数组+RMQ)
摘要:题意:给定一个字符串,求其中一个由循环子串构成且循环次数最多的一个子串,有多个就输出最小字典序的。 析:枚举循环串的长度ll,然后如果它出现了两次,那么它一定会覆盖s[0],s[ll],s[ll*2].....这些点中相邻的两个,然后向前和向后匹配, 看看最大的匹配多大,然后把所有的答案记录下来,最
阅读全文
SPOJ - REPEATS Repeats (后缀数组+RMQ)
摘要:题意:求一个串中出现重复子串次数最多的数目。 析:枚举每个长度的子串,至少要重复两次,必然会经过s[l*i]中相邻的两个,然后再分别向前和向后匹配即可。 代码如下:
阅读全文
ZOJ 3946 Highway Project (最短路)
摘要:题意:单源最短路,给你一些路,给你这些路的长度,给你修这些路的话费,求最短路和最小花费。 析:本质就是一个最短路,不过要维护两个值罢了,在维护花费时要维护的是该路要花多少,而不是总的路线花费。 代码如下:
阅读全文
HDU 5862 Counting Intersections (离散化+扫描线+树状数组)
摘要:题意:给你若干个平行于坐标轴的,长度大于0的线段,且任意两个线段没有公共点,不会重合覆盖。问有多少个交点。 析:题意很明确,可是并不好做,可以先把平行与x轴和y轴的分开,然后把平行y轴的按y坐标从小到大进行排序,然后我们可以枚举每一个平行x轴的线段, 我们可以把平行于x轴的线段当做扫描线,只不过有了
阅读全文
URAL 1297 Palindrome (后缀数组+RMQ)
摘要:题意:给定一个字符串,求一个最长的回回文子串,多解输出第一个。 析:把字符串翻转然后放到后面去,中间用另一个字符隔开,然后枚举每一个回文串的的位置,对第 i 个位置,那么对应着第二个串的最长公共前缀, 求最长公共子串,可以用RMQ解决。 代码如下:
阅读全文
POJ 3764 The xor-longest Path (字典树)
摘要:题意:给出一颗n个节点的边权树,求一条路径(u,v),使得路径上的边的权值异或值最大。 析:先从0开始遍历树,记录所有的点到0的路径的边权异或值,然后任意两点的路径的异或值就是dp[u]^dp[v], 然后再构造一棵二进制树,每次查询,注意长度要相同,最后求最大值即可。 代码如下:
阅读全文
HDU 5542 The Battle of Chibi (离散化+树状数组优化DP)
摘要:题意:求n个数中长度为m的上升子序列的个数。 析:很容易想到一个n的三次方的DP,dp[i][j]表示第 i 个数长度为 j 的LIS 有多少个,但是会TLE,因此必须优化,dp[i][j] = sum{dp[k][j-1] | a[i] > a[k]} 我们可以用树状数组优化,当然用线段树也OK,
阅读全文
ZOJ 3512 Financial Fraud (左偏树)
摘要:题意:给定一个序列,求另一个不递减序列,使得Abs(bi - ai) 和最小。 析:首先是在每个相同的区间中,中位数是最优的,然后由于要合并,和维护中位数,所以我们选用左偏树来维护,当然也可以用划分树来做。 代码如下:
阅读全文
HDU 1512 Monkey King (左偏树+并查集)
摘要:题意:在一个森林里住着N(N<=10000)只猴子。在一开始,他们是互不认识的。但是随着时间的推移,猴子们少不了争斗,但那只会发生在互不认识 (认识具有传递性)的两只猴子之间。争斗时,两只猴子都会请出他认识的猴子里最强壮的一只(有可能是他自己)进行争斗。争斗后,这两只猴子就互相认识。 每个猴子有一个
阅读全文