算法竞赛进阶指南
文章平均质量分 89
快乐算法,健康秃头。
短尾黑猫
这个作者很懒,什么都没留下…
展开
-
双栈排序(栈+二分图)
牛客题面:双栈排序题面大意:给定一个整数 nnn 和一个初始序列 aaa,其中序列 aaa 的值为[1,n]不重复的正整数。现在有以下四个操作,希望能够凭借这四个操作使得序列 aaa 成为一个升序的序列。操作a:如果输入序列不为空,将第一个元素压入栈S1操作b:如果栈S1不为空,将S1栈顶元素弹出至输出序列操作c:如果输入序列不为空,将第一个元素压入栈S2操作d:如果栈S2不为空,将S2栈顶元素弹出至输出序列让我们判断,初始序列 aaa 是否能够通过以上四个操作得到升序序列,如果不能输出原创 2020-12-04 12:29:30 · 740 阅读 · 0 评论 -
数据备份(小根堆+贪心+思维)
牛客题面:数据备份思路:原创 2020-11-22 23:05:06 · 152 阅读 · 0 评论 -
【POJ 2442】Sequence(二叉堆+多路归并)
POJ题面:Sequence题面大意:给定 mmm 个序列,每个序列包含 nnn 个非负整数。现在我们可以从每个序列中选取一个整数来新成一个包含有 nnn 个整数的新序列。显然,我们可以得到 nmn^mnm 个新序列,nmn^mnm 个新序列的整数之和。求出在这些新序列中,整数之和最小的一个新序列。(输出这个新序列)思路:我们可以先考虑 m=2m = 2m=2 的情况。此时,我们有两个序列 {a1,a2,...,an}\{ a_1,a_2,...,a_n \}{a1,a2,...,an}原创 2020-11-17 17:18:53 · 181 阅读 · 0 评论 -
【POJ 3764】The xor-longest Path(按位Trie树)
POJ题面:The xor-longest Path题目大意:给定一个具有边权的树。树中一条路径 ppp 的异或长度被定义为该路径上所有边的权值的异或和:xorlength(p)=⊕e∈pw(e)_{xor}length(p)=\oplus_{e\in p}w(e)xorlength(p)=⊕e∈pw(e)其中,⊕\oplus⊕ 表示异或运算。给定上述具有 nnn 个节点的树,求一条异或长度最大的路径。(也就是求所有路径中最大的异或长度)思路:每条边都有相应的权值,我们可以拿一个数组 di原创 2020-11-17 00:15:27 · 132 阅读 · 0 评论 -
The XOR Largest Pair(按位Trie树维护)
题面地址:牛客 The XOR Largest Pair题目大意:给定 NNN 个整数 A1,A2,A3,...,ANA_1,A_2,A_3,...,A_NA1,A2,A3,...,AN,并从中选出两个数进行 XORXORXOR(异或)运算,求得到的最大结果。数据范围:N≤105,0≤Ai≤231N\leq 10^5, 0\leq A_i\leq 2^{31}N≤105,0≤Ai≤231。思路:我们可以考虑将所有数都转化成一个32位的二进制01串,并且将这些01串,按高位到低位插入到同一原创 2020-11-14 10:53:30 · 106 阅读 · 0 评论 -
前缀统计(Trie板子题,复习)
题目地址:前缀统计思路:先把 nnn 个字符串插入同一棵Trie树中,对于Trie树上的每个节点可以拿一个cntcntcnt数组来维护以当前节点为末尾的字符串的个数。对于每次询问,在Trie树中检索字符串 TTT 时,累加每次经过的节点的 cntcntcnt 值即可得到最终答案。代码:#include <bits/stdc++.h>#define sc scanf#define pf printfusing namespace std;typedef long long LL;原创 2020-11-13 22:16:40 · 121 阅读 · 0 评论 -
火车进出栈序列问题(Catalan数+高精度压位)
题面:Acwing 130思路先假设每一个入栈的操作为 111,出栈的操作为 000。这样就抽象出一个 nnn 个 111 和 nnn 个 000 的排列问题。因为每次出栈操作都必须保证栈里有火车,所以入栈的次数一定都不少于出栈的次数(出栈次数包括当前出栈)。于是有一个很强的性质:序列任意前缀中的 111 的个数都不少于 000 的个数于是该问题就转化成了 求第 nnn 项的卡特兰数,即 :C2nnn+1=(2n)!n!n!(n+1)\cfrac{C_{2n}^n}{n+1}=\cfrac{(2原创 2020-09-06 18:20:51 · 241 阅读 · 0 评论 -
【POJ 3714】Raid(分治、平面最近点对)
题面:Raid题目大意有 N 个核电站能源供应点需要被摧毁。将军派出了 N 位特工去摧毁这些供应点。由于受到了帝国空军的袭击,特工分散到了几个位置,每个位置有坐标给出。将军想哪个特工离任意一个核电站的距离最小。请你求出这个最小距离。思路分治。将所有点按 xxx 坐标从小到大先排好序,之后可以分成左右两部分进行分别的计算最短距离,再进行计算中间部分可能的最短距离。但是这题是由两个不同的阵营组成,我们可以先将阵营标记出来,同阵营之间的距离就给赋值成 “无穷大”。左右两边我们只要运用归并的思想原创 2020-09-03 18:35:53 · 542 阅读 · 0 评论 -
【POJ 1723】SOLDIERS(排序、中位数)
题面:SOLDIERS题目大意有 nnn 个士兵,并且知道每个士兵在二维坐标图上的位置。士兵可以进行移动,但是每个士兵每次只能向上、向下、向左或向右移动一个单位,因此,他的 xxx 或 yyy 坐标也将相应的加 1 或减 1。现在希望通过移动士兵,使得所有士兵彼此相邻的处于同一条水平线内,即所有士兵的y坐标相同并且x坐标相邻。请你计算满足要求的情况下,所有士兵的总移动次数最少是多少。注意:两个或多个士兵不能占据同一个位置。思路分析题目,可以发现,每个士兵的横纵坐标对于他们的移动是彼此独立的,原创 2020-09-03 16:32:39 · 450 阅读 · 0 评论 -
【HDOJ 4864】Tack(贪心)
题面:Tack题目大意今天某公司有 mmm 个任务需要完成。每个任务都有自己相应的难度级别和完成任务所需的时间,记作 (y,x)(y,x)(y,x)。公司若完成第 iii 个任务,可以获得 (500∗xi+2∗yi)(500*x_i+2*y_i)(500∗xi+2∗yi) 美元的报酬。现在,公司有 nnn 台机器,每台机器都有相应的最长工作时间和级别。如果任务所需时间超过机器的最长工作时间,则机器无法完成此任务。如果任务难度级别超过机器的级别,则机器无法完成次任务。每台机器一天内只能完成原创 2020-09-03 11:39:40 · 247 阅读 · 0 评论 -
【POJ 1050】To the Max(降维,贪心,最大子区间和)
题面:To the Max题目大意给定一个整数 nnn ,代表的是方形区间的边长,之后再输入所有格子内的数。求该区间内的最大子区间的和。思路暴力要搞到 O(n4)O(n^4)O(n4)。考虑一下降维和动归。正常动归,要用到二维动态规划,可能会超时。这里可以将每一列的前缀和算出来,即把每一列当作一个数,在确定好上下界之后,就可以用一维动归来解决这个问题了。算法的时间复杂度就降到了 O(n3)O(n^3)O(n3)贪心思想在做一维动归的时候,需要一些贪心思想。遍历到第 kkk 个数时,如果原创 2020-09-03 10:33:59 · 387 阅读 · 0 评论 -
【POJ 3045】Cow Acrobats(贪心)
题面:Cow Acrobats题目大意相当于有 nnn 头奶牛在叠罗汉。每头牛都有两个特质,一个是重量 www,一个是强壮度 sss。每头牛都有一个崩溃风险,该风险等于在她上面的所有奶牛的总重量减去她本身的强壮度。所以每头牛都要找到合适自己的位置。求:确定所有奶牛的位置,从而使任何奶牛中的最大风险最小。思路芜湖~~先贪心试一下。将每头牛按照 w+sw+sw+s 从小到大排序,这样就得到正确的答案啦哈哈哈哈哈哈。贪心证明:设最优解为 real_ansreal\_ansreal_ans,自己方原创 2020-09-02 23:36:44 · 483 阅读 · 0 评论 -
NUMBER BASE CONVERSION(高精度模拟短除法+思维)
题面:POJ 1220题目大意给定两个整数 a,ba,ba,b,且 0<a,b<620<a,b<620<a,b<62,并给出一个 aaa 进制的数。要我们将该数转化成 bbb 进制的数。思路高精度模拟短除法。第一反应会想到高精度先将 aaa 进制转化成 101010 进制数,最后转化成 bbb 进制数,其中过程要不断求余。这里其实只要转变一下思路,让被除数上的每一位先加上之前的余数乘以 aaa 进制数,再去除以除数 bbb ,最后得出的数就是 aaa 进制原创 2020-09-02 16:16:21 · 347 阅读 · 0 评论 -
糖果传递(环形均分/中位数)
题面:糖果传递【Acwing】思路我们可以假定糖果是单向传递的,即都是逆时针(顺时针)传给某个孩子。#mermaid-svg-waRziq1ZTt8vNIUH .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-waRziq1ZTt8vNIUH .label text{fill:#333}#mermaid-sv原创 2020-09-02 14:53:32 · 327 阅读 · 0 评论 -
【POJ2083】Fractal(分形、递归)
题面:Fractal题目大意分形,具有以非整数维形式充填空间的形态特征。通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。现在,定义“盒子分形”如下:一级盒子分形: X\\XX二级盒子分形:X X XX X\\X\ X\\\ \ X\\X\ XX X XX X如果用B(n - 1)代表第n-1级盒子分形,那么第n级盒子分形即为:B(n原创 2020-09-02 10:12:07 · 768 阅读 · 0 评论 -
占卜DIY(模拟)
题面:占卜DIY思路:没什么好说的,就纯粹的模拟。注意:000 代表的是 101010代码:#include <bits/stdc++.h>#define sc scanf#define pf printfusing namespace std;deque<string> q[20];map<string, int> vis;int check(string x){ if(x == "A") return 1; if(x ==原创 2020-09-02 09:55:11 · 340 阅读 · 0 评论 -
The Pilots Brothers‘ refrigerator(思维)
题面:The Pilots Brothers’refrigerator代码#include <bits/stdc++.h>#define sc scanf#define pf printfusing namespace std;typedef pair<int, int> PII;string str[5];bool mark[5][5];vector<PII> ans;int main(){ memset(mark, false, size原创 2020-09-01 23:56:21 · 157 阅读 · 0 评论 -
Corral the Cows(二分、前缀和、离散化)
题面:Corral the Cows【牛客】题目大意有 nnn 个单位的三叶草,每单位三叶草占据一个 1×11×11×1 的土地,每块土地的位置由其左下角的下标确定,并且下标 xxx 和 yyy 都是整数,且 1≤x,y≤100001\leq x,y\leq100001≤x,y≤10000。农夫约翰希望为他的奶牛们建立一个畜栏。其中畜栏必须是正方形,且至少要包含 CCC 单位的三叶草。要求出至少包含 CCC 单位的三叶草情况下,畜栏的最小边长。注意:每个区域可能会有多个单位的三叶草,所以输入的时候原创 2020-09-01 22:52:08 · 401 阅读 · 0 评论 -
Running Median(动态维护中位数问题,对顶堆)
题面:Running Median题目大意顺序输入 nnn 个数,当下标为奇数时,就输出一次当前序列的中位数。例如,当遍历或输入到第 iii 个数时,iii 恰好为奇数,则就要在序列 a[1]a[1]a[1] 到 a[i]a[i]a[i] 之间找到一个中位数,并输出出来。思路这题是对顶堆的板子题。用两个小根堆和大根堆来动态维护序列。其中,大根堆维护较小的一半元素,小根堆维护较大的一半元素。即:序列中从小到大次序为 [1,len/2][1,len/2][1,len/2] 的整数存储在大根堆中原创 2020-09-01 21:43:25 · 1234 阅读 · 1 评论 -
防线(二分)
原题链接:防线题意给定 NNN 组防具,并给出每组防具放置的起始点 startstartstart 、终点 endendend 和防具与防具之间的距离 ddd。每个位置的防具数量可以由不同组的防具叠加。求防具数量为奇数的位置和该位置的防具数量。(题目给定防具数量为奇数的位置唯一)思路题目给出起始点、终点和防具之间的距离,可以很直观的看出,每组防具的位置分布是一个等差数列 an=a1+(n−1)∗da_n=a_1+(n-1)*dan=a1+(n−1)∗d。所以,在一维坐标上,我们可以很快的算出每原创 2020-09-01 09:53:03 · 175 阅读 · 0 评论 -
CH0503 奇数码问题(逆序对)
题面:奇数码问题思路:找了好久,没有找到奇数码问题和 n∗mn*mn∗m 数码问题的详细证明。先记个结论。奇数码游戏两个局面可达,当且仅当两个局面下网络中的数依次写成不含零的 111 到 n∗n−1n*n-1n∗n−1 的序列后,逆序对个数的奇偶性相同。结论必要性证明:空格(即 000 )左右移动的时候,我们列出出来的序列是不变的;空格上(下)移动时,相当于某个数与它后(前)边 n−1n-1n−1 个数交换了位置,因为 n−1n-1n−1 是偶数,所以逆序对数的变化也是一个偶数。拓展到 nnn 为原创 2020-08-08 11:00:02 · 328 阅读 · 0 评论 -
64位整数乘法(龟速乘板子)
题面:64位整数乘法方法一:类似于快速幂的思想,把整数 bbb 用二进制表示,有:b=ck−12k−1+ck−22k−2+...+c020b=c_{k-1}2^{k-1}+c_{k-2}2^{k-2}+...+c_{0}2^{0}b=ck−12k−1+ck−22k−2+...+c020于是,a∗ba*ba∗b 就有:a∗b=ck−1∗a∗2k−1+ck−2∗a∗2k−2+...+c0∗a∗20a*b=c_{k-1}*a*2^{k-1}+c_{k-2}*a*2^{k-2}+...+c_{0}*a*原创 2020-08-03 00:34:21 · 298 阅读 · 0 评论 -
a^b (快速幂板子)
题面:a^b快速幂思想:每个正整数都可以唯一表示为若干指数不重复的 222 的次幂的和。如果 bbb 在二进制表示下有 kkk 位,其中第 i(0≤i<k)i(0\leq i<k)i(0≤i<k) 位的数字是 cic_ici,那么有:b=ck−12k−1+ck−22k−2+...+c020b=c_{k-1}2^{k-1} + c_{k-2}2^{k-2} +...+c_02^0b=ck−12k−1+ck−22k−2+...+c020所以:ab=ack−12k−1∗ack−原创 2020-08-03 00:21:01 · 215 阅读 · 0 评论 -
Fractal Streets(经典分形递归+坐标旋转)
原题链接:Fractal Streets题面:思路:本题关键要解决:求编号为MMM的房屋在NNN级城市中的位置。把该问题记为 calc(N,M)calc(N, M)calc(N,M) ,本题就是求 calc(N,A)calc(N, A)calc(N,A) 和 calc(N,B)calc(N, B)calc(N,B) 之间的距离。该题每一级的图像都是由上一级的图像变换得来的。具体的变换如下:假设当前为 NNN 级城市,将其对称的分成房屋数量完全相等的四个小块,即左上、右上、右下、左下。而这四个方原创 2020-08-02 23:59:59 · 837 阅读 · 0 评论 -
Tallest Cow(基础差分思想)
原题题面:Tallest Cow题目大意:有 NNN 头牛站成一排。两头牛能看见彼此,当且仅当它们中间的所有牛都比它们矮。现已知最高的牛是第PPP头,且它的身高为HHH,不知其他剩下 N−1N-1N−1 头牛的身高。题目还给出了 MMM 对关系,每队关系都有两头牛AAA和BBB能互相看见。求每头牛的身高最大可能是多少。思路:如果两头牛之间看得见,那么 Ai+1Ai+1Ai+1 到 Bi−1Bi-1Bi−1之间的牛比 AiAiAi 和 BiBiBi 都小1,也就是让这个区间内的牛身高都减1,可以简单想原创 2020-08-02 15:48:33 · 528 阅读 · 0 评论 -
The Luckiest Number(POJ 3696,模板)
原题题面:The Luckiest Number思路:这题是非常好的一个模板题,考察了欧拉定理,快乘,快速幂,欧拉函数,筛质因数,xxx 个 888 连在一起组成的正整数等价于 8(10x−1)9\cfrac{8(10^x - 1)}{9}98(10x−1) 。其中 xxx 就是该正整数的十进制位数。而题目就是让我们求出这样一个 xxx,满足 L∣8(10x−1)9L|\cfrac{8(10^x - 1)}{9}L∣98(10x−1)。在这里,我们令 d=gcd(L,8)d=gcd(L, 8)d原创 2020-07-16 23:10:33 · 134 阅读 · 0 评论 -
Easy Integration(逆元、数学)
原题题面:Easy Integration思路:一开始跟队友小伙伴推了蛮久,大概推出来了,我没化简出来,他们化简成功了。(抱大腿)正经公式是一个叫做贝塔函数的东西。贝塔函数:B(x,y)=∫01xa−1∗(1−x)b−1 dxB(x, y)=\int_{0}^{1} x^{a-1}*(1-x)^{b-1}\, dxB(x,y)=∫01xa−1∗(1−x)b−1dx当 aaa 和 bbb 同时为自然数时,有:B(a,b)=(a−1)!∗(b−1)!(a+b−1)!B(a, b)=\dfrac{(a原创 2020-07-12 23:43:43 · 408 阅读 · 0 评论 -
Visible Lattice Points(可见的点)
原题题面:Visible Lattice Points思路:分析题面,可以发现,其中给出的 nnn,在平面直角坐标系上,由点 (x,y)∈[0,n](x, y) \in[0, n](x,y)∈[0,n] 围城的平面图形是一个正方形。由此可以看出 (0,0)(0, 0)(0,0)、(0,1)(0, 1)(0,1) 和 (1,1)(1, 1)(1,1) 是必然可以被看到的,排除这三点之后,边界的情况就可以忽略了。而其他点能被发现,(即不会与除自己以外的点与原点构成的线段撞车),当且仅当 1≤x,y≤n1\原创 2020-07-12 22:17:19 · 478 阅读 · 1 评论 -
余数之和(数论、数学题)
题目描述给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值。例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7。输入格式输入仅一行,包含两个整数n, k。输出格式输出仅一行,即j(n, k)。数据范围1≤n,k≤1e9输入样例5 3输出样例7思路:这题,纯数学题。已知 k mod i=k−⌊k/i⌋原创 2020-07-11 11:56:30 · 1590 阅读 · 0 评论 -
Hankson的趣味题(暴搜、数论)
原题题面:Hankson的趣味题思路:在没想到纯数学逻辑前,容易想到一个朴素算法:用试除法求出 b1 的所有约数,之后逐一检验是否满足条件,该暴搜的时间复杂度大概是O(n*b1\sqrt b1b1 * log b1)。实际测试会有一个测试数据过不了。那么就是优化问题了。由唯一分解定理可知:如果 x 是 b1 的约数,则x所有的质因数都是b1的质因数。由此我们可以先预先处理出 1 ~ b1\sqrt b1b1 的所有质数,然后用这些质数去试除 b1,得到相应的质因子及其数量。最后用DFS枚举出每原创 2020-07-10 16:21:29 · 451 阅读 · 0 评论 -
阶层分解(线性筛法)
题面:阶层分解思路该题很容易就想到要把[1, N]中每个数包含的质因子p的个数算出来。但是如果每个数都分解过去再合并,时间复杂度为O(N*sqrt(N)),题目N最大为1e6,必然超时。在1~N中,至少包含1个质因子p的个数有 ⌊N / p⌋ (向下取整)个,而至少包含2个质因子p的个数有 ⌊N / p ^ 2⌋ 个,依次类推,直到 1 ~ N 中取不到是p的倍数的数。所以,N!中质因子p的总个数为:这样,对于N中每一个质因子p,计算上式,时间复杂度为O(log N),而对于N!分解质因子的时原创 2020-07-07 17:18:21 · 174 阅读 · 0 评论 -
Prime Distance(质数距离)
DescriptionThe branch of mathematics called number theory is about properties of numbers. One of the areas that has captured the interest of number theoreticians for thousands of years is the question of primality. A prime number is a number that is has n原创 2020-07-07 16:50:49 · 674 阅读 · 0 评论 -
贪吃的大嘴(多重背包问题)
Description有一只特别贪吃的大嘴,她很喜欢吃一种小蛋糕,而每一个小蛋糕有一个美味度,而大嘴是很傲娇的,一定要吃美味度和刚好为m的小蛋糕,而且大嘴还特别懒,她希望通过吃数量最少的小蛋糕达到这个目的.所以她希望你能设计一个程序帮她决定要吃哪些小蛋糕.Input先输入一行包含2个整数m、n,表示大嘴需要吃美味度和为m的小蛋糕,而小蛋糕一共有n种,下面输入n行,每行2个整数,第一个表示该种小蛋糕的美味度,第二个表示蛋糕店中该种小蛋糕的总数Output输出一行包含一个整数表示大嘴最少需要吃的小蛋糕原创 2020-06-14 10:44:17 · 404 阅读 · 0 评论 -
实现指数型枚举的普遍方法
原题链接:递归实现指数型枚举题目描述:从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。输入格式输入一个整数n。输出格式每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。对于没有选任何数的方案,输出空行。本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。数据范围1≤n≤15输入样例:3输出样例:322 311 31 21 2 3...原创 2020-05-12 17:28:31 · 232 阅读 · 0 评论