![](https://img-blog.csdnimg.cn/20190927151026427.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
《算法竞赛进阶指南》
刷书笔记
w_uxidixi
nnzncf
展开
-
CodeForces - 1422D - Returning Home 建图
CodeForces - 1422D - Returning Home 建图题意:给出起点和终点和m个跳跃点,跳跃点的定义是:只要主人公当前位置(x,y)(x,y)(x,y)的横坐标或纵坐标最少一个与跳跃点坐标(xi,yi)(x_i,y_i)(xi,yi)的相同就可以直接到跳跃点上。想不出来 又是抄的题解思路:由于在x坐标下,可以随意到达该x坐标下的任何的跳跃点,花费为0,所以将x坐标拆成m个点,只有跳到不同的x坐标下才会产生花费。同理y坐标。拆顶点:规定起点为000,终点为3m+13m+13m原创 2020-10-10 17:06:59 · 197 阅读 · 0 评论 -
Cow Acrobats Page48 贪心
Cow Acrobats Page48 贪心邻项交换的基础题,都快忘了,写篇博客加深一下印象假设现在的排列顺序是1~n,且最大的risk出现在位置i处那么MaxRisk1=∑j=1i−2p[j].w+p[i−1].w−p[i].sMaxRisk_1=\sum_{j=1}^{i-2}p[j].w+p[i-1].w-p[i].sMaxRisk1=∑j=1i−2p[j].w+p[i−1].w−p[i].s假设交换第i项和第i-1项,MaxRiskMaxRiskMaxRisk变大,即变得“不优”此原创 2020-10-04 17:14:32 · 172 阅读 · 0 评论 -
骑士放置 Page435 最大独立集
骑士放置 Page435 最大独立集棋盘问题首先黑白染色马的哈密顿移动距离是3,必然是从白走到黑或者从黑走到白这题折腾了俩小时,就因为递归那里懒得写int,直接用了个全局变量,根本检查不出来,人傻了代码:const int maxn=2e4+7;const int INF=0x3f3f3f3f;const ll INFF=1e18;bool mark[120][120],vis[maxn];int linker[maxn],n,m,t,x,y;int xx[8]={1,1,-1,-1原创 2020-10-02 21:50:51 · 2066 阅读 · 3 评论 -
Ants Page432 二分图最小权匹配
Ants Page432 二分图最小权匹配这个问题居然转换为了求一个二分图最大权匹配的问题,完全想不到当两个线段相交的时候,必然有四个顶点,根据三角形的性质可以将这两条线段重新连起来,这个连法可以达到相同的连接状态,并且两线段之和比原先小了。具体证明在蓝书上,就不说了实在是太神奇了注意最后要做一个小小的转换,他要输出的是左边匹配的情况,而linker[i]表示的是右边的匹配情况。别忘了把边权取负代码:const int maxn=2e3+7;const double INF=1e9;c原创 2020-09-30 20:41:03 · 267 阅读 · 0 评论 -
导弹防御塔 Page428 二分图多重匹配
导弹防御塔 Page428 二分图多重匹配二分时间对于每一个导弹,在限定的时间内可以打出多少弹药是固定的,根据距离可以判断出每一枚子弹是否能够打中敌人,然后连线我是把左边防御塔,右边敌人,也可以变成左边敌人,右边防御塔,由于是拆开来做的多重匹配,所以原理是一样的需要注意这边的T1是秒数,一开始看成了分钟怎么做都错题目范围给的不是很明确,所以开数组的时候开了很大,这时候就不能用memset了,会超时代码:const int maxn=2e6+7;const int INF=0x3f3f3f原创 2020-09-30 18:54:11 · 189 阅读 · 0 评论 -
棋盘覆盖 Page426 二分图最大匹配
棋盘覆盖 Page426 二分图最大匹配对于一个点(i,j),假设在这个点放置一个骨牌,那么显然最多只能放置一个,这是“1要素”将(i,j)和(i,j+1)、(i,j)和(i+1,j)连边,表示两个不同位置放置骨牌,但是其余位置均不与(i,j)相连,基于骨牌的身材为2*1,这是显然的,这是“0要素”直接用二分图最大匹配解最多放置的数量代码:const int maxn=1e2+7;const int INF=0x3f3f3f3f;const ll INFF=1e18;int mapp[m原创 2020-09-30 12:59:21 · 132 阅读 · 0 评论 -
关押罪犯 Page423 并查集/二分图判定
关押罪犯 Page423 并查集/二分图判定一、并查集思路:贪心思想,将怒气值从大到小排序,尽可能把怒气值大的放在不同的监狱,即不同的集合内,一共两个监狱,放在不同的监狱不能表示为unite(a,b),但是可以表示为unite(a,b+n),unite(a+n,b)表示a和b的敌人在一个监狱中,b和a的敌人在一个监狱中,当两人属于同一监狱时直接输出代码:int fa[maxn],n,m;struct node{ int x,y,z;}p[maxn];bool operator<原创 2020-09-30 10:49:36 · 179 阅读 · 0 评论 -
传纸条 Page270 线性dp
传纸条 Page270 线性dp1.如果把来去分开做的话,还得判断是否有重复经过2.从顶点开始假设有两个人在同步走,如果走到同一个点A,想了好久为什么算经过一次,而不是算经过0次。因为能走到那个地方,就必然存在另一种走法,使得一个玩家经过该点A,而另一个玩家走到B点(AB距离出发点的距离相等),假设最坏情况是玩家走到B点的路上权值都是0,这时候恰巧算一次,但是并不是意味着无法到达这个点,所以取0次是不对的。代码:const int maxn=50+7;const int INF=1e9;cons原创 2020-09-22 20:04:20 · 118 阅读 · 0 评论 -
Mobile Service Page269 线性dp
Mobile Service Page269 线性dp1.如果直接做的话是dp[i][pos1][pos2][pos3]dp[i][pos1][pos2][pos3]dp[i][pos1][pos2][pos3],显然超时,将冗余信息除掉后,降了个维度就可以做了。(根本想不到)2.要注意,同一个点不能两个人同时到达,所以要加个判断语句。代码:int dp[1007][maxn][maxn],cost[maxn][maxn],n,m,x[1007];int main(){ scanf("%原创 2020-09-22 17:40:25 · 123 阅读 · 0 评论 -
Making the Grade Page267 线性dp
Making the Grade Page267 线性dpdp[i]dp[i]dp[i]表示处理完前i个的构造,且bi=aib_i=a_ibi=ai(对于非递减的B序列)dp[i]=min{dp[j]+cost(i,j)∣1≤j≤i,a[j]≤a[i]}dp[i]=min\{dp[j]+cost(i,j)|1\leq j\leq i,a[j]\leq a[i]\}dp[i]=min{dp[j]+cost(i,j)∣1≤j≤i,a[j]≤a[i]}其中,cost(i,j)cost(i,j)cost原创 2020-09-22 17:36:53 · 96 阅读 · 0 评论 -
LCIS Page266 线性dp
LCIS Page266 线性dpLIS复习int dp[maxn],n,a[maxn],ans=0;int main(){ scanf("%d",&n); rep(i,1,n)scanf("%d",&a[i]),dp[i]=1; rep(i,1,n)rep(j,1,i-1)if (a[i]>a[j])dp[i]=max(dp[i],dp[j]+1); rep(i,1,n)ans=max(ans,dp[i]); W(ans); r原创 2020-09-22 17:18:47 · 94 阅读 · 0 评论 -
Mr. Young‘s Picture Permutations Page265 线性dp
Mr. Young’s Picture Permutations Page265 线性dp1.一开始直接建了一个30^5的dp数组,爆空间了,然后用map+哈希处理一下,题解用的是dp[maxn][maxn/2][maxn/3][maxn/4][maxn/5],因为队伍的人数限制a1>=a2>=a3>=a4>=a5a_1>=a_2>=a_3>=a_4>=a_5a1>=a2>=a3>=a4>=a5,且a1+a2+a3+a4+a原创 2020-09-22 17:02:22 · 145 阅读 · 0 评论 -
数组实现邻接表的原理和细节
数组实现邻接表的原理细节学的不太到位,几个月没写就立刻忘记了,系统的整理一下首先简单说一下自己对邻接表的理解:邻接表其实就是所有顶点的链表例如下图所示:以111为起点的边:111->222以222为起点的边:222->555,222->333以333为起点的边:333->555以555为起点的边:555->111,555->444数据结构:int tol=1,head[maxn];struct node{ int to,next;}edg原创 2020-07-06 00:36:42 · 865 阅读 · 0 评论 -
树状数组应用总结
前言做个总结,忘记之后再翻翻首先明确一下树状数组的结构性质:1.每个内部节点c[x]c[x]c[x]保存以它为根的子树中所有叶节点的和2.每个内部节点c[x]c[x]c[x]的子节点个数等于lowbit(x)lowbit(x)lowbit(x)的位数,即位为1的数量例如:x=9=23+21x=9=2^3+2^1x=9=23+21,分为[1,8],[9,9][1,8],[9,9][1,8],[9,9]两个区间,区间和分别为c[8],c[9]c[8],c[9]c[8],c[9]x=13=23+22原创 2020-07-03 23:31:56 · 185 阅读 · 0 评论 -
楼兰图腾 Page205 树状数组求逆序对
楼兰图腾 Page205 树状数组求逆序对1.树状数组写起来感觉比归并好理解多了2.求^和v的形状,求出任意一个后,可以采用将数组“倒过来”的方法,即将数组的大小关系重置一下3.不仅是逆序对,正序对也很好求,改变遍历方向即可代码:/** * Author1: low-equipped w_udixixi * Author2: Sher丶lock * Date :2020-07-03**Zz:overint or overarrayXx:overwatch to 5e8Ss:un原创 2020-07-03 17:20:47 · 145 阅读 · 0 评论 -
Nightmare Ⅱ Page123 双向BFS
Nightmare Ⅱ Page123 双向BFS一开始错在写BFS的时候写了while(!q.empty()){ ... q.push(..);}这样写就相当于是从这个点一直搜索到任何可达点,错的很离谱但是题意是让队列中的每一个位置移动一个位置所以是让当前队列的所有数参与移动。故写成c=q.size();while(c--){ ... q.push(..);}...原创 2020-04-23 14:35:09 · 108 阅读 · 1 评论 -
电路维修 Page120 双端队列BFS
电路维修 Page120 双端队列BFS出了小问题,代码很不美观而且很繁琐,看了别人的代码,原因是自己的理解不太够,只能靠强行草过去对于拓展代价为0或1的问题,还可以使用最短路算法直接进行操作,这题用最短路就没那么多屁事了代码:#pragma GCC optimize(1)#pragma GCC optimize(2)#pragma GCC optimize(3,"Ofast","in...原创 2020-04-22 02:15:29 · 121 阅读 · 1 评论 -
送礼物 Page111 双向搜索+二分
送礼物 Page111 双向搜索+二分真是无语,一开始取[1,n/2],[n/2+1,n][1,n/2],[n/2+1,n][1,n/2],[n/2+1,n]一直TLE过不了,就很纳闷后来取了[1,n/2+2],[n/2+3,n][1,n/2+2],[n/2+3,n][1,n/2+2],[n/2+3,n]就过了,很玄学。双向搜索降低指数复杂度,得满足始态,终态搜索到一半会发生交互的条件代码...原创 2020-04-19 23:08:13 · 125 阅读 · 0 评论 -
可达性统计 Page99 拓扑排序+bitset
可达性统计 Page99 拓扑排序+bitset一开始看到题解的状态压缩,寻思30000的数据应该如何压缩STL的bitset支持位运算的修改,提供了简单的解决方法bitset<5> b;b.count();//返回所有位中1的个数b.size();//返回长度b[i]=1;//修改某位为1代码:#pragma GCC optimize(1)#pragma GCC...原创 2020-04-15 21:51:18 · 138 阅读 · 0 评论 -
双栈序列 Page91 二分图染色
双栈序列 Page91 二分图染色一开始用贪心做,优先往第一个栈放,这时候出现的一个问题就是不得不往第二个栈放的情况无法判断,这是一个前后关联的放置过程。看了题解,理解了好久。1−n1-n1−n的每个数字都必须入一次栈(栈1或栈2),什么情况下两个数字不可以入同一个栈?当存在kkk满足i<j<ki<j<ki<j<k,且a[k]<a[i]<a[...原创 2020-04-14 15:33:24 · 141 阅读 · 2 评论 -
括号画家 Page90 栈
括号画家 Page90 栈从前往后遍历,会出现以下两种情况:1.对于任何的′(′,′[′,′{′'(','[','\{'′(′,′[′,′{′,只能与后面的元素匹配,故直接入栈2.对于任何的′)′,′]′,′}′')',']','\}'′)′,′]′,′}′,只能与栈顶匹配,若匹配成功,则出栈,若匹配不上,则当前元素入栈。根据定义,只要ok[i]ok[i]ok[i]连续标记的地方,合起来一...原创 2020-04-02 23:40:32 · 1696 阅读 · 0 评论 -
The XOR Largest Pair Page79 字典树
The XOR Largest Pair Page79 字典树因为异或操作的性质“不同得1”,每一步尝试往反方向走巧妙之处:将异或操作转化为字符串检索,再将检索结果转化为异或操作的值代码:#pragma GCC optimize(1)#pragma GCC optimize(2)#pragma GCC optimize(3,"Ofast","inline")#include<c...原创 2020-04-01 23:43:18 · 104 阅读 · 0 评论 -
前缀统计 Page79 字典树
前缀统计 Page79 字典树初学字典树如果仅将结尾标记,是不严谨的,多个相同字符串的情况就会被默认视为1个字符串代码:#pragma GCC optimize(1)#pragma GCC optimize(2)#pragma GCC optimize(3,"Ofast","inline")#include<cstdio>#include<cstring>...原创 2020-04-01 23:06:26 · 136 阅读 · 0 评论 -
后缀数组 Page69 哈希+二分
后缀数组 Page69 哈希+二分将字典序排序转化为两者最大公共前缀部分的后一个字母的比较代码:#pragma GCC optimize(1)#pragma GCC optimize(2)#pragma GCC optimize(3,"Ofast","inline")#include<cstdio>#include<cstring>#include<a...原创 2020-03-31 15:11:19 · 567 阅读 · 0 评论 -
Palindrome Page69 哈希+二分/马拉车
Palindrome Page69 哈希+二分最大回文串还可以用马拉车算法求解,时间更优一些分析:对于一个回文串,一共会有两种情况:长度为奇数,s[i−p,i]=reverse(s[i,i+p])s[i-p,i]=reverse(s[i,i+p])s[i−p,i]=reverse(s[i,i+p])长度为偶数,s[i−p,i−1]=reverse(s[i,i+p−1])s[i-p,i-1...原创 2020-03-29 02:22:44 · 114 阅读 · 0 评论 -
Team Queue Page55 队列
Team Queue Page55 队列简单来讲其实就是一个双层队列,第一层是队伍,第二层是队伍里的人代码:/** * Author1: low-equipped w_udixixi * Author2: Sher丶lock * Date :2020-03-24**Zz:overint or overarrayXx:overwatch to 5e8Ss:unordered...原创 2020-03-27 22:54:06 · 104 阅读 · 0 评论 -
Largest Rectangle in a Histogram Page53 记忆化/单调栈
Largest Rectangle in a Histogram Page53 记忆化预处理出每个矩形可以拓展到最远的地方(左边界和右边界的极限位置)如果直接暴力两遍For(1,n)循环,复杂度会到达O(n2)O(n^2)O(n2),但是如果处理左边界的时候从左往右遍历,处理右边界的时候从右到左遍历,打个比方,处理右边界时,需要从posipos_iposi开始往右找第一个比它小的高度,发现右...原创 2020-03-27 22:53:20 · 119 阅读 · 0 评论 -
Editor Page50 对顶栈
Editor Page50 对顶栈活了一辈子好像没用过栈的size函数…就当现在学到了吧PS:由于插入的整数可以为负数,所以一定要将f[0]f[0]f[0]初始化为-INF代码:#pragma GCC optimize(1)#pragma GCC optimize(2)#pragma GCC optimize(3,"Ofast","inline")#include<cstdio...原创 2020-03-27 22:53:01 · 97 阅读 · 0 评论 -
Prime Distance Page138 区间质数
Prime Distance Page138 区间质数由于L,R太大,一开始想到用map表示该值是否为质数,后来一直T,把质数筛选过程优化到(R−L)loglog(R)(R-L)loglog(R)(R−L)loglog(R)还是过不了,怀疑应该是map的原因修改后用isprime[i−L]isprime[i-L]isprime[i−L],即可用数组存,一个细节就是如果L是1的话,它不会被mmm...原创 2020-03-16 18:49:06 · 119 阅读 · 0 评论 -
占卜DIY Page48 模拟
占卜DIY Page48 模拟数组模拟链表,取头取尾加头加尾四种操作把区间在一开始定义为[100,100][100,100][100,100]可以不用考虑区间边界取到负数,比如p[i].a[−2]p[i].a[-2]p[i].a[−2]#pragma GCC optimize(1)#pragma GCC optimize(2)#pragma GCC optimize(3,"Ofast",...原创 2020-03-14 19:12:22 · 145 阅读 · 0 评论 -
Radar Installation Page43 贪心
Radar Installation Page43 贪心题意:选出最少的点,使得每一个区间都包含最少一个点贪心思想:如果把所有区间按照右端点排序,遍历,记录下当前最右位置若左端点大于这个最右位置,则需要添加一个点,并修改最右位置;反之,则可以用之前的范围来覆盖此区间代码:#include<cstdio>#include<cstring>#include&...原创 2020-03-11 22:20:23 · 125 阅读 · 0 评论 -
Stall Reservations Page43 贪心+优先队列
Stall Reservations Page43 贪心+优先队列题意:给出N个区间,将其不重叠地放在数轴上,至少需要几个数轴? [1, 2],[2, 3]算作重叠贪心思想:将区间左端点从小到大排序,在遍历的同时,用优先队列记录下当前所有数轴的最小右端点,如果该区间能放进其中一个数轴,就放进去,并修改最右端点,如果放不进去,那么就新建一个数轴代码:#include<cstdio>...原创 2020-03-11 20:38:01 · 174 阅读 · 0 评论 -
RMQ问题 Page 41 ST算法
RMQ问题 Page 41 ST算法http://www.51nod.com/Challenge/Problem.html#!#problemId=1174第一次写博客 这是51nod上一个简单的基础题。大致题意:给一组数组 让你判断T个[l,r][l,r][l,r]区间里的最大值(或最小值)。分析:暴力肯定会TLE。根据倍增思想,需要引入2的整数次幂用来简化时间和空间,那么具体该怎么做...原创 2020-03-11 12:49:51 · 135 阅读 · 0 评论 -
奇数码问题 Page38 归并排序计算逆序对
奇数码问题 Page38 归并排序计算逆序对逆序对问题树状数组也可解决如何转化为逆序对的奇偶性问题??证明:空格的水平移动不会影响逆序对数空格的上下移动会将一个数xxx与空格交换,即将xxx移动到n−1n-1n−1个元素之后或之前。现在假设移动到n−1n-1n−1个元素之前假设这n−1n-1n−1个元素中有kkk个比xxx小,那么移动之后逆序对数变化量为∣(n−1−k)−k∣=∣n−...原创 2020-03-11 12:09:00 · 228 阅读 · 0 评论 -
Cinema Page33 离散化
Cinema Page33 离散化离散化都忘光了,是个很有用的东西,从基础开始学一下读入的时候没有看清楚把bc两个数组一起读了,一直没发现,以为离散化写错了vector去重也不会了sort(V.begin(),V.end());V.erase(unique(V.begin(),V.end()),V.end());代码:#pragma GCC optimize(1)#pragma ...原创 2020-03-06 23:27:35 · 96 阅读 · 0 评论 -
Best Cow Fences Page29 实数域二分
Best Cow Fences Page29 实数域二分不得不说真的是道好题把数列中每个值都减去二分值,转化为判定是否存在子段和非负,这个转化很巧妙对于限制长度型的最大子段和提供了O(n)O(n)O(n)解的思路第一次写实数域二分,区别没啥,形式稍作修改代码:#include<cstdio>#include<cstring>#include<algor...原创 2020-03-05 23:20:29 · 109 阅读 · 0 评论 -
To the Max Page30 一维/二维最大字段和
To the Max Page30 一维/二维最大字段和对于一维最大字段和的推导过程设dp[i]dp[i]dp[i]为以第iii个元素为结束的子段的最大子段和其转移方程为:dp[i]=max(a[i],dp[i−1]+a[i])dp[i]=max(a[i],dp[i-1]+a[i])dp[i]=max(a[i],dp[i−1]+a[i])也就是说: if (dp[i-1]>=0)d...原创 2020-03-05 12:58:04 · 172 阅读 · 0 评论 -
Tallest Cow Page24 差分
Tallest Cow Page24 差分可能是看了标签的原因,想起来还是比较简单的但是实在是没有想到m次条件中可能会有重复条件,因此需要map或者哈希判断一下是否出现过这个条件代码:#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#inclu...原创 2020-03-04 19:51:20 · 109 阅读 · 0 评论 -
Sumdiv Page17 分治/逆元
Sumdiv Page17 分治/逆元书上的分治方法就不提了加深一下这题的数论解法先将A做唯一分解对于p1bk1−1p1−1%9901{{p_1^{bk_1}-1}\over p_1-1}\%9901p1−1p1bk1−1%9901,可以求出p1−1p_1-1p1−1在模990199019901意义下的逆元(由于p1p_1p1肯定是个质数,所以可以用费马小定理求解逆元)但是有...原创 2020-03-04 11:02:32 · 251 阅读 · 1 评论 -
费解的开关 Page15 优化枚举
费解的开关Page15 优化枚举如果暴力枚举复杂度是O(232)O(2^{32})O(232)根据性质可以先确定第一层,层层递推过去,复杂度被优化到了O(25×52)O(2^5×5^2)O(25×52)#pragma GCC optimize(1)#pragma GCC optimize(2)#pragma GCC optimize(3,"Ofast","inline")#includ...原创 2020-03-03 15:07:54 · 152 阅读 · 0 评论