
《算法竞赛进阶指南》
Brute Force Kevin
这个作者很懒,什么都没留下…
展开
-
POJ3468 A Simple Problem with Integers 分块
题目链接http://poj.org/problem?id=3468分析将原序列划分成若干段长度为 ⌊n⌋\lfloor \sqrt{n} \rfloor⌊n⌋ 的区间进行维护;设 a[i]a[i]a[i] 以表示原序列每个元素, b[i]b[i]b[i] 表示每个元素所属的区间,sum[i]sum[i]sum[i] 表示每个区间的元素之和,add[i]add[i]add[i] 表示每...原创 2019-10-25 15:46:34 · 410 阅读 · 0 评论 -
洛谷P4556 雨天的尾巴 树上差分+权值线段树
题目链接https://www.luogu.org/problem/P4556分析对于树上链的操作,可以用树上差分来做;由于粮食有种类,树上每个节点建一棵权值线段树来记录答案;树上差分后要合并,用线段树合并来实现。AC代码#include <cstdio>#include <iostream>#include <algorithm>usin...原创 2019-10-25 10:42:38 · 396 阅读 · 0 评论 -
POJ2482 Stars in Your Window 线段树
题目链接http://poj.org/problem?id=2482分析题面很感人,撩妹子的小trick;依旧是扫描线法,在此之前需要一步转化,考虑对于每颗星星,能将其覆盖的矩形右上角的轨迹所组成的矩形,显然答案变为求一块区域,使得矩形在其上覆盖产生的权值和最大,建一棵线段树支持区间加和区间查询最大值,从左往右扫描即可,注意边缘的星星不算。AC代码#include <cs...原创 2019-10-24 18:54:10 · 262 阅读 · 0 评论 -
POJ1151 Atlantis 线段树
题目链接http://poj.org/problem?id=1151分析扫描线求矩形面积并,以从左向右扫描为例,将矩形拆成 2n2n2n 条竖直线段,用线段树来维护当前有效长度,遇到某个矩形左侧的线段,则尝试增加有效长度,右侧则尝试减小有效长度;每次用有效长度乘线段间隔来累加答案。AC代码#include <cstdio>#include <algorithm&...原创 2019-10-24 11:24:06 · 148 阅读 · 0 评论 -
CH4302 Interval GCD 线段树
题目链接http://noi-test.zzstep.com/contest/0x40%E3%80%8C%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E8%BF%9B%E9%98%B6%E3%80%8D%E4%BE%8B%E9%A2%98/4302%20Interval%20GCD分析根据更相损减术,区间 [l,r][l, r][l,r] 的最大公约数等于 lll...原创 2019-10-23 17:51:44 · 300 阅读 · 0 评论 -
CH4301 Can you answer on these queries III 线段树
题目链接http://noi-test.zzstep.com/contest/0x40%E3%80%8C%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E8%BF%9B%E9%98%B6%E3%80%8D%E4%BE%8B%E9%A2%98/4301%20Can%20you%20answer%20on%20these%20queries%20III分析线段树节点记录...原创 2019-10-23 11:24:38 · 349 阅读 · 0 评论 -
POJ2182 Lost Cows 树状数组
题目链接http://poj.org/problem?id=2182分析对于第 nnn 头牛,若在其前面有 AnA_nAn 头牛比他矮,则其高度为 An+1A_n + 1An+1;在此之前的牛也类似,不过要考虑后面的牛可能已占用了某些高度;问题可以转化为对于一个长度为 nnn 的 010101 序列,每次找到第 kkk 个 111,且找到后需要将其置为 000;树状数组 +++ ...原创 2019-10-23 09:32:17 · 213 阅读 · 0 评论 -
NOI2001 食物链 扩展域并查集
题目链接http://poj.org/problem?id=1182分析由于吃与被吃关系构成了一个环,所以我们可以用扩展域并查集来维护关系;对于每种动物,建三个节点分别保存自身,能吃的与会被吃的。AC代码#include <cstdio>inline int read() { int num = 0; char c = getchar(); while (c &l...原创 2019-10-22 11:13:16 · 182 阅读 · 0 评论 -
NOI2001 食物链 带权并查集
题目链接http://poj.org/problem?id=1182分析用带权并查集来维护每种动物之间吃与被吃的关系,具体来说,每个节点指向其父亲的有向边的权值表示了这种关系,000 表示是同类,111 表示吃父亲,222 表示被父亲吃,确定某两点之间边的权值时要注意参与运算的各边的方向。AC代码#include <cstdio>inline int read() ...原创 2019-10-22 10:26:26 · 326 阅读 · 0 评论 -
POJ1733 Parity game 扩展域并查集
题目链接http://poj.org/problem?id=1733分析与程序自动分析那道题不同,a≠ba \neq ba=b,b≠cb \neq cb=c,并不意味着 a=ca = ca=c;而本题和关押罪犯类似,aaa 与 bbb 不在一间牢房,bbb 与 ccc 不在一间牢房,则 aaa 与 ccc 必在一间牢房;可以额外开一倍节点来记录不等关系,分析与带权并查集做法类似。...原创 2019-10-22 07:42:42 · 199 阅读 · 0 评论 -
POJ1733 Parity game 带权并查集
题目链接http://poj.org/problem?id=1733分析若 (l,r)(l, r)(l,r) 结果为奇数,说明前缀和 sum[r]sum[r]sum[r] 和 sum[l−1]sum[l - 1]sum[l−1] 奇偶性相反;反之则说明二者奇偶性相同;用并查集的节点表示每个位置的前缀和,维护每个节点与父亲的异或和即可。AC代码#include <cstdio&g...原创 2019-10-21 21:23:58 · 174 阅读 · 0 评论 -
NOI2002 银河英雄传说 带权并查集
题目链接http://noi-test.zzstep.com/contest/0x40%E3%80%8C%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E8%BF%9B%E9%98%B6%E3%80%8D%E4%BE%8B%E9%A2%98/4101%20%E9%93%B6%E6%B2%B3%E8%8B%B1%E9%9B%84%E4%BC%A0%E8%AF%B4分析...原创 2019-10-21 20:08:24 · 525 阅读 · 0 评论 -
【NOI2015】程序自动分析 并查集
题目链接https://www.luogu.org/problem/P1955分析很显然可以用并查集来维护关系;先处理相等关系再处理不等关系;对于相等关系则合并,对于不等关系,若两个操作数已在同一集合则无法满足;数据范围过大需要离散化,此题不可以像关押罪犯那样用补集维护不等关系。AC代码#include <cstdio>#include <algorithm>...原创 2019-10-21 18:30:48 · 229 阅读 · 0 评论 -
POJ1456 Supermarket 并查集
题目链接http://poj.org/problem?id=1456分析除了堆可以来实现贪心做法,并查集也可行;先将商品按利润不增排序,依次考虑每件商品,尽量将其放在不过期且靠后时卖出;用并查集来维护每天及此前最靠后的空闲位置,每选定一天,则将其加入到其前一天所在集合。AC代码#include <cstdio>#include <algorithm>us...原创 2019-10-21 19:16:30 · 190 阅读 · 0 评论 -
POJ2311 Cutting Game 博弈论
题目链接http://poj.org/problem?id=2311分析和Nim游戏有异曲同工之妙,只不过最终局面的胜负规定不同,所以需要一步转化,易知,若长或宽为 111,则先手必胜,而 2×22 \times 22×2、2×32 \times 32×3 和 3×23 \times 23×2 则是必败;故设上面三个必败态的SG函数为 000,而某张纸对应的SG函数则是来源于将其剪开后...原创 2019-10-20 16:00:42 · 195 阅读 · 0 评论 -
POJ1958 Strange Towers of Hanoi 递推
题目链接https://www.acwing.com/activity/content/problem/content/330/1/分析对于 nnn 个圆盘 333 座塔的情况我们是熟悉的,由于只有 333 座塔,且小盘必须在大盘上面,所以操作过程可以概括为先将 n−1n - 1n−1 个盘子借助 CCC 塔从 AAA 塔移动到 BBB 塔,再将最底层的盘子移动到 CCC 盘,再将 BBB ...原创 2019-08-14 10:56:03 · 182 阅读 · 0 评论 -
BZOJ1218 激光炸弹 前缀和
题目链接https://www.lydsy.com/JudgeOnline/problem.php?id=1218分析O(n2)O(n ^ 2)O(n2) 复杂度枚举选中矩形右下角,根据 RRR 即可确定选中矩形,在借助二维前缀和 O(1)O(1)O(1) 求出此时答案AC代码#include <cstdio>#include <algorithm>usin...原创 2019-08-14 11:22:10 · 156 阅读 · 0 评论 -
POJ3263 Tallest Cow 差分
题目链接http://poj.org/problem?id=3263分析差分,初始数组中元素均为 000,对于每个 (A,B)(A, B)(A,B),将 A+1A + 1A+1 位置 −1- 1−1,将 BBB 位置 +1+ 1+1,表示区间 [A+1,B−1][A + 1, B - 1][A+1,B−1] 每个位置均 −1- 1−1,差分数组中最终每个位置的前缀和 +H+ H+H 即为答案...原创 2019-08-14 12:07:46 · 104 阅读 · 0 评论 -
CH0301 递归实现指数型枚举 DFS
题目链接https://www.acwing.com/problem/content/94/分析跑DFS,每次分选当前元素和不选递归下去AC代码#include <cstdio>const int maxn = 20;int n, a[maxn], cnt;void dfs(int i) { if (i == n + 1) { for (int j = 1;...原创 2019-08-14 18:00:26 · 184 阅读 · 0 评论 -
CH0302 递归实现组合型枚举 DFS
题目链接https://www.acwing.com/problem/content/95/分析相比指数型枚举,加上限制选出数个数的剪枝AC代码#include <cstdio>const int maxn = 30;int n, m, a[maxn], cnt;void dfs(int i) { if (cnt > m || n - i + 1 + cn...原创 2019-08-14 18:31:20 · 212 阅读 · 0 评论 -
CH0303 递归实现排列型枚举 DFS
题目链接https://www.acwing.com/problem/content/description/96/分析枚举未选取的数,递归下一位置,回溯后要清除记录是否选取的标记AC代码#include <cstdio>const int maxn = 15;int n, a[maxn], vis[maxn];void dfs(int i) { if (i =...原创 2019-08-14 19:23:47 · 199 阅读 · 0 评论 -
CH0101 a ^ b 快速幂
题目链接https://www.acwing.com/problem/content/91/分析快速幂模板,注意中间结果可能会溢出,以及要考虑 b=0,p=1b = 0, p = 1b=0,p=1 的特殊情况。AC代码#include <cstdio>int a, b, p;inline int qpow(int a, int b, int p) { int ans...原创 2019-09-16 08:27:54 · 1329 阅读 · 0 评论 -
CH0102 64位整数乘法 数学
题目链接https://www.acwing.com/problem/content/92/分析直接乘会爆 longlonglong longlonglong,一种方法是类比快速幂,将一个因数按二进制位拆解,但每次操作复杂度是 logloglog 的;另一种方法是借助 a∗b mod p=a∗b−⌊a∗b/p⌋∗pa * b \ \ mod \ \...原创 2019-09-23 14:42:29 · 594 阅读 · 0 评论 -
CH0103 最短Hamilton路径 状压DP
题目链接https://www.acwing.com/problem/content/description/93/分析状压DP,状态 f[i][j]f[i][j]f[i][j] 用 nnn 位二进制数 iii 来表示每个点是否被经过,同时 jjj 记录当前路径终点,每次枚举 jjj 的前一个点,确定上一状态,转移即可,注意求最小值,先将 fff 数组置为正无穷,令 f[1][0]=0f[1...原创 2019-09-23 14:43:20 · 319 阅读 · 0 评论 -
CH0302 非递归实现组合型枚举 模拟
题目链接https://www.acwing.com/problem/content/95/分析递归实现组合型枚举是非常简单的,而此处的非递归版其实是手动模拟栈。所以先来了解下“堆栈结构”实现函数调用的基本过程:先把函数所需的第 kkk 个,第 k−1k - 1k−1 个,…,第 111 个参数依次入栈,然后将函数调用的下一条语句的地址入栈,再跳转到调用函数处继续执行指令。AC代码#...原创 2019-08-23 18:41:31 · 523 阅读 · 0 评论 -
POJ2018 Best Cow Fences 二分答案
题目链接https://www.acwing.com/problem/content/104/分析对于求平均值的问题,往往是转化为每个数值减去平均值后,求最大区间和是否大于 000 即可本题同理,只是所选区间长度要不小于 FFF注意输出格式的处理,题目要求相当于保留三位小数AC代码#include <cstdio>inline int read() { int nu...原创 2019-08-23 20:09:07 · 455 阅读 · 0 评论 -
AcWing113 Innovative Business 二分
题目链接https://www.acwing.com/problem/content/description/115/分析手动举个简单例子模拟一下可以发现,本题二分可做,具体来说,就是二分一个元素,使得当前元素可放置在其后若不存在,则表明当前元素要放在序列开头这样即可保证询问次数不会超出限制,总时间复杂度需不超过 O(n2)O(n ^ 2)O(n2)另外本题是一道交互式试题,注意格式...原创 2019-08-23 21:05:25 · 494 阅读 · 0 评论 -
CF670C Cinema 离散化
题目链接http://codeforces.com/problemset/problem/670/C分析离散化语言编号,开数组统计会每种语言的人,然后遍历每部电影找答案即可。AC代码#include <cstdio>#include <algorithm>using namespace std;inline int read() { int num =...原创 2019-08-24 18:18:38 · 236 阅读 · 0 评论 -
CH0501 货仓选址 中位数
题目链接https://www.acwing.com/problem/content/106/分析可以证明,NNN 为奇数时,货仓选在最中间的商店处距离之和最小;NNN 为偶数时,货仓选在最中间的两个商店之间的任意位置距离之和最小AC代码#include <cstdio>#include <cmath>#include <algorithm>u...原创 2019-08-24 19:53:53 · 234 阅读 · 0 评论 -
BZOJ3032 七夕祭 中位数
题目链接https://www.lydsy.com/JudgeOnline/problem.php?id=3032分析上下交换不会改变每列的情况,左右交换不会改变每行的情况,行和列互相独立。假如不考虑第一个位置和最后一个位置相邻,则本题类似于经典的“均分纸牌”问题,考虑每行时有解当且仅当 N∣TN | TN∣T,考虑每列时同理。以考虑每行为例,最少操作步数为 ∑i=1N∣i∗TN−G[i...原创 2019-08-24 22:50:26 · 203 阅读 · 0 评论 -
POJ1845 Sumdiv 递归
题目链接http://poj.org/problem?id=1845分析将 AAA 分解质因数为 p1c1∗p2c2∗...∗pncnp_1 ^ {c_1} * p_2 ^ {c_2} * ... * p_n ^ {c_n}p1c1∗p2c2∗...∗pncn,则 ABA ^ BAB 为 p1B∗c1∗p2B∗c2∗...∗pnB∗cnp_1 ^ {B * c_1} * p_2...原创 2019-08-15 21:31:38 · 251 阅读 · 0 评论 -
lowbit求整数二进制表示下所有是1的位
lowbitlowbitlowbit 运算求的是整数最后一位 111 及之后的所有 000 所构成的数值,假如我们要知道最后一位 111 是第几位,就需要对 lowbitlowbitlowbit 运算结果以 222 为底取 logloglog 或者借助 HashHashHash。可以直接令 H[2k]=kH[2 ^ k] = kH[2k]=k,但对空间会造成不小的浪费。《算法竞赛进阶指南》中提到一...原创 2019-08-12 11:04:31 · 189 阅读 · 0 评论 -
CH0201 费解的开关 枚举
题目链接https://www.acwing.com/problem/content/description/97/分析容易想到,对同一位置按两次相当于没按,因此每个位置最多被按一次;另外,一旦我们固定了第一行的按法,那么为使得最终状态全为 111,第二行的按法也是固定的。因此,枚举第一行的按法共 323232 种,之后每一行递推即可。AC代码#include <cstdio>...原创 2019-08-12 13:23:11 · 333 阅读 · 0 评论 -
POJ3784 Running Median 对顶堆
题目链接http://poj.org/problem?id=3784分析动态维护序列中位数可用对顶堆实现,即用大根堆维护序列前一段,用小根堆维护序列后一段。保证大根堆内元素均比小根堆内元素小,且两堆元素个数差不超过 111。每次输出时,元素个数较多的堆的堆顶元素即为当前序列中位数。AC代码#include <cstdio>#include <vector>...原创 2019-08-25 17:29:36 · 264 阅读 · 0 评论 -
POJ2299 Ultra-QuickSort 逆序对
题目链接http://poj.org/problem?id=2299分析每次交换均可消除一个逆序对,最终目标逆序对数为 000,故该问题等价于求解给定序列逆序对数。AC代码#include <cstdio>inline int read() { int num = 0; char c = getchar(); while (c < '0' || c > ...原创 2019-08-25 17:45:27 · 146 阅读 · 0 评论 -
POJ3889 Fractal Streets 递归
题目链接http://poj.org/problem?id=3889分析分治,递归处理。由于要对区域大小取模,所以从 000 开始编号会更方便。对于每个编号,递归求出其在子区域的坐标,再根据题目的规定,推出其在当前区域的坐标。#include <cstdio>#include <cmath>#include <iostream>using n...原创 2019-08-25 18:33:19 · 176 阅读 · 0 评论 -
POJ2893 M * N Puzzle 逆序对
题目链接http://poj.org/problem?id=2893分析此处有一结论:将数码按原有顺序写成一列并除去 000 后,若 NNN 为奇数,则初始状态和目标状态逆序对数奇偶性相同;若 NNN 为偶数,则初始状态逆序对数加上 000 在两种状态下行数之差与目标状态逆序对数奇偶性相同。AC代码#include <cstdio>#include <cstrin...原创 2019-08-25 22:41:56 · 143 阅读 · 0 评论 -
CH0601 Genius ACM 倍增
题目链接https://www.acwing.com/problem/content/111/分析每次设定一段长度为 111 的初始区间(一定合法),倍增来扩展区间右端点。求“校验值”需要排序,只需排新加入的一段,再像归并排序那样合并两段。注意每次扩展还要保证新的右端点不超过 NNN。AC代码#include <cstdio>#include <algorithm...原创 2019-08-26 21:15:08 · 154 阅读 · 0 评论 -
IncDec Sequence
题目链接https://www.acwing.com/problem/content/102/分析差分,最终目的是差分序列中第 222 到 NNN 个数为 000。每次操作是将一个位置 +1+ 1+1,另一个位置 −1- 1−1,最少操作次数则是贪心地抵消正数和负数。正负数抵消完后,剩余需要靠第 111 个位置和第 N+1N + 1N+1 个位置上的数来抵消,分别对应操作整个区间前半段和...原创 2019-08-27 10:17:43 · 222 阅读 · 0 评论 -
POJ3614 Sunscreen 贪心
题目链接http://poj.org/problem?id=3614分析贪心,将奶牛按 minSPF 降序排序,依次考虑每头奶牛,在能用的防晒霜中选择 SPF 最大的使用。假设选择 SPF 较小的使用,则可能会出现后来 SPF 最大的防晒霜无法再使用,造成浪费。一瓶防晒霜最多使一头奶牛满足要求,当前奶牛放弃不用答案也不会更优。AC代码#include <cstdio>#...原创 2019-08-27 10:50:57 · 207 阅读 · 0 评论