ACM题目整理

并查集:

poj 2492 

就是不能在相同的集合中再次添加相同的点,就是并查集的简单应用,使用并查集判断是否出现过这个元素。

题解链接:点击这里

HUD 3461 codelock 

有一个长n的字符串锁,求这个锁有多少种不同的解锁方式,这个锁有若干个区间能够转动,两个能通过转动互相到达的情况属于同一种解锁方式。所以题目就是求区间的个数了。

题解链接:点击这里

ZOJ 3261 Connections in Galaxy War  

有 N 个星球 ,编号从 0 到 n-1 每个星球相应有一个能量值。每次查询输出有链接的最大能量值。用并查集确定链接关系,离线处理倒过来加边然后记录答案再输出。

题解链接:点击这里

POJ 1456 Supermarket 

给你 N 件不同的商品,每件商品最多可以买一次 问你可以得到的最大价值。我以前是用贪心做的,但是这道题用并查集优化会让复杂度变得很低。

题解链接:点击这里

树状数组

HDU 3874 Necklace

 给你一段长度为 N 的序列,然后是 M 个询问,要求计算每段区间的连续和注意:重复的元素只能在连续和中出现一次 用map来判断是否重复,把区间都存起来离线处理然后在输出答案。

题解链接:点击这里

HDU 2227 Find the nondecreasing subsequences

给你一个有序序列, 求有多少个不下降子序列,看似简单但是是好几种算法的结合是比较经典的值得好好研究一下。

题解链接:点击这里

HDU 1394 Minimum Inversion Number

有一个n个整数的排列,求出各种排列的逆序数,树状数组加速求逆序数

题解链接:点击这里

·

线段树

POJ - 2528 Mayor's posters 

给出n个区间然后求区间覆盖后可见的区间个数 典型的区间覆盖问题,但是这道题的数据量需要离散化,这个离散化用的也是非常巧妙,离散化后再使用线段树操作最后查询区间个数。

题解链接:点击这里

HDU - 1540 Tunnel Warfare

n个村庄用地道连成一条直线,每次可以毁坏一个村庄也可以重建一个村庄,求最大连续的村庄数,以为是并查集做,看了题解发现是线段树维护最大连续值。

题解链接:点击这里

POJ 1436 Horizontally VisibleSegments

给出N条垂直线段,问着N条线段能组成多少三角。首先如果我们可以求得任意两条垂直线段i和j之间是否可见,那么我们可以用暴力O(n^3)遍历的方式来得到所有三角个数。所以下面我们只要求出这个矩阵即可。本题就变成了一个线段树区间覆盖染色问题了

题解链接:点击这里

HDU 1542 Atlantis

二维平面有n个平行于坐标轴的矩形,现在要求出这些矩形的总面积. 非常经典的线段树扫描线,但是不简单

题解链接:点击这里

UVA11297 Census

给你一个n*n的矩阵,有单点修改还矩阵最值查询,二维线段树。

题解链接:点击这里

HDU 6315 Naive Operations

有两个数组,对其中一个操作,然后求区间喝,线段树维护a % b - b的最大值,然后每次更新下传标记。

题解链接:点击这里

HDU 1540 Tunnel Warfare

给你N个建筑,建筑排成一排三种操作,查询操作就是查询最大连续的长度。

要不是在线段树专题真的想不到是线段树,模拟也过了,然后看了题解发现是线段树的区间合并问题,估计数据量再大点,模拟就过不去了。

题解链接:点击这里

RMQ

POJ 3264 Balanced Lineup  

给你n 按一定顺序排列的个奶牛的高度,求给定区间内最高的奶牛和最矮的奶牛的差值。刘汝佳紫书上的例题,虽然不难但是很经典, 需要先对数据进行预处理,然后再查询。

题解链接:点击这里

Poj 2452 Sticks Problem 

给定一个长度为n的序列,序列里的元素都不相同,要求找出一对(i,j),i<j,arr[k]>=i&arr[k]<=j,All(i < k < j).然后求最大的j-i差值。

RMQ+二分

题解链接:点击这里

HDU2888 Check Corners

 给定一个n * m的矩阵,再给定q个询问,每次询问(r1,c1)为左上角,(r2,c2)为右下角的子矩形的最大值,并且判断该最大值是否出现在了这个子矩阵的4个顶角上?  

二维RMQ的基础操作。

题解链接:点击这里

POJ1785 Binary Search Heap Construction

建立一颗树,每个结点有两个关键字,要求第一个关键字满足二叉搜索树的性质,第二个结点满足堆的性质,Treap+RMQ

题解链接:点击这里

HDU 3183 A Magic Lamp

对于一个n位数,删除m个位后,得到的最小数是什么,真的联系不到RMQ问题上去,转换一下思路把删除数改成挑数这样就能使用RMQ求解了。

题解链接:点击这里

树的直径

POJ 2631 Roads in the North

有一个树结构, 给你树的所有边, 表示u和v两点间有一条距离为cost的边. 然后问你该树上最远的两个点的距离是多少?  树的直径经典例题 用的是邻接表来表示树结构.

题解链接:点击这里

HDU 3534 Tree

给出一颗n个节点的树,每条边对应一个长度,求出距离最大的两个节点之间长度,并找出一共有多少个顶点对。

就是求树的直径和圆点,DFS可做,树型DP也可做。和上面那道题一样都是经典题

题解链接:点击这里

KMP:

uva1328 Period 

对于每一个从头开始的长度为 i (i>1)的前缀,是否由重复出现的子串A组成 就是KMP求最小循环节

那么我们发现当i-next[i]能够整除i时候,那么s[1~i-next[i]]就是s[i-1]的最小循环元,至于次数那么也就是i/(i-next[i]).。

题解链接:点击这里

POJ2406 Power Strings

 找一个串的最小循环节的个数.。

先求出next数组,然后使用长度-next【len】就是最小循环节的长度。然后特判。

题解链接:点击这里

HDU3336

给你一个串,求用该串所有前缀去 匹配本身这个串的次数 的总和。裸扩展KMP,但是最后求答案的过程必须完全理解KMP中next数组的含义。

题解链接:点击这里

HDU 1867 A + B for you again

给你两个字符串,输出他们合并之后的字符串  使用两次KMP,然后再判断怎么样组合可以使得字典序最小

题解链接:点击这里

POJ3080 Blue Jeans

给你n个字符串,要你求出这n个字符串的最长公共连续子序列是哪个。枚举所有子串然后KMP进行匹配再找到字典序最小的那一个

题解链接:点击这里

POJ 2185 Milking Grid

求矩阵最小循环节,行和列分别跑一遍nxet数组,最后得答案就是两个结果的积

题解链接:点击这里

后缀数组

POJ1226 Substrings

给你N个字符串,要你求这样一个最长子串的长度,要求这个子串在每个原始串中或原始串的逆串中都出现过一次.输出该串长度即可.

枚举所有子串然后使用后缀数组

题解链接:点击这里

URAL 1517. Freedom of choice

给你两个等长的串,求他们的最长公共连续子串。我们只要记录过程中的每一个可以作为解的后缀编号以及长度即可

题解链接:点击这里

POJ 3294 Life Forms

 给你n个字符串,然后要你求出超过一半字符串中的最长公共连续字串是什么。后缀数组二分答案

题解链接:点击这里

POJ1743Musical Theme

求一个序列中满足相减值相同的两个不重叠的最长子序列。没想到是后缀数组,先对序列预处理求差值,求完然后只要找相同的两个最长子序列就好了,

题解链接:点击这里

POJ3261 Milk Patterns

求最少重叠k次的最长子串的长度,将后缀数组按照height数组分组排序,满足条件且组内元素=>k个的就是答案。

题解链接:点击这里
 

字典树

HDU 4099 Revenge of Fibonacci

给你一个字符串,求最小的斐波那契数的下标,使这个字符串是这个斐波那契数的前缀。将0~99999斐波那契数存入字典树,只存前40位,然后查找。

题解链接:点击这里

HDU 1251 统计难题 

统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).增加一个sum数组把到一个节点 (以该节点为尾的字符串作为前缀) 的字符数存储起来。

题解链接:点击这里

HDU4825 Xor Sum

在一组数中找跟某个数异或结果最大的数。

直接套用模板,将数组中的数插入到 01字典树,对每一个数查询即可。

题解链接:点击这里

HDU5536 Chip Factory

在一个数组中找出 (s[i]+s[j])^s[k] 最大的值,其中 i、j、k 各不相同。01字典树难点在于判断不同,这里我们可以在查询 x 和 y 的和之前,先把 x 和 y 在 01字典树中去除,等查询完后再加上。

题解链接:点击这里

BZOJ 4260 Codechef REBXOR

给你 n 个数,让你求两个不相交的区间元素异或后的和的最大值,01字典树对区间的操作。

题解链接:点击这里

HDU 6096 String

题意是给n个字符串,然后m次查询,每次查询有给定的前缀和给定的后缀的字符串有多少个。构建字典树的时候交叉构建,查询的时候也是这样。

题解链接:点击这里

AC自动机

洛谷 P3796 【模板】AC自动机(加强版)

找到在母串中出现次数最多的那个子串,有多个就按照输入顺序输出,AC自动机模板的加强版,可以作为一个很不错的模板来使用

题解链接:点击这里

ZOJ 3228 Searching the String

给你N个模板串和一个文本串,问你这些模板串在文本串中最多出现了多少次。模板串可能重复,且模板串有两种类型,一开始想写两个查询函数,但是仔细想一下只需要在定义一个记录子串长度的数组分别判断就够了。

题解链接:点击这里

HDU3065 病毒侵袭持续中

给你多个不同的模板和一个文本串.问你这个文本串中各个模板都分别出现了多少次?和上面那道题类似而且少了一个操作。

题解链接:点击这里

HDU2457DNA repair

给你N个模板串,并且给你一个文本串,现在问你这个文本串最少需要改变几个字符才能使得它不包含任何模板串,没想到是AC自动机后来看题解明白利用DP的思想+AC自动机

题解链接:点击这里

HDU2296 Rin

给你M个单词构成一个词典,每个单词有一个权值(,现在要你构造一个不超过长度N的字符串,使得该字符串权值最大。如果出现多个答案,还是AC自动机和DP的结合,需要记录权值之和然后选择最大的那一个。

题解链接:点击这里

HDU2825 Wireless Password

现在要你推断一个长度==n的由小写字母构成的字符串S有多少种组成方式.其中这个S至少包含字典集合中的k个单词.还是和DP的结合,还是需要用到match数组。

题解链接:点击这里

Treap:

POJ3481 Double Queue

有 n 个客户,每个客户有一个优先度,我们需要3个操作

1 X Y 加入ID为 X ,优先度为 Y 的客户

2 提取出优先度最大的客户

3 提取出优先度最小的客户

使用优先队列的话更简单,使用Treap的基本操作:

题解链接:点击这里

POJ 2985 The k-th LargestGroup

几个小组,可以合并小组,然后查询第K大的小组。Treap的基本操作。

题解链接:点击这里

POJ2761 Feed the dogs

查询区间第K大的数,这个不是全部数的查询了,每次查询的区间不一样。每次超出区间的删掉,不在区间内的加上,再找第k小值

题解链接:点击这里

BZOJ1503 郁闷的出纳员

四种操作,然后查询排名第几的员工的工资是多少。Treap必刷的一道题,这个的删除添加操作是对整个数进行操作的。

题解链接:点击这里

树链剖分

树链剖分裸题,把模板改改价就可以,帮助理解模板.。

题解链接:点击这里

Codeforces-343D Water Tree

给出一个具有N个点的树,1号节点是根节点。现在有三种操作,也是树链剖分比较基础的题目。

题解链接:点击这里

主席树:

HDU 4471 Super Mario

题意就是n个数,给你m个询问,然后每个询问给l,r,k意思就是查询lll到r中有多少数比k小的。

主席树模板的稍微变形。

题解链接:点击这里

2019ICPC南昌邀请赛J题 Distance on the tree

题意就是n个点,n−1条边,然后每条边都有自己的权值,m个询问,每个询问就是从一个点到另外一个点的路径上有多少满足权值不大于k的边有多少条。‘

这个就是主席树的进阶加上了LCA。

题解链接:点击这里

 

发布了611 篇原创文章 · 获赞 390 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_43627087/article/details/101297201