厉教说每天坚持做三道1700难度的题就能提升水平了
3/31
准备蓝桥杯
完全背包dp
题面是给一个数字n,n可以被拆分成一些2的幂次数的和
比如7可以拆分成1 1 1 1 1 1 1或者1 2 4。。。
那么我们可以把n看成是背包的容量,2的幂次的值看成是可以装进背包的物品
3/30
题意有n个章节,要读懂第i个章节前必须先读懂它所规定的章节。每次从头到尾读,问第几次能全部读懂。
有向边,入度···明摆的拓扑排序,答案是拓扑排序中最长的递减链的长度。
开一个数组记录当前点的权值,当这个点可以入队时,遍历它的出点,假如出点下标小于它的下标,则试图更新它的递减链长度。
简单的set+bfs走迷宫
set.count({x,y});会比较快
动态规划,模拟矩形的拼接过程,只有两个颜色的话,同时选最大的就好,而三个颜色不好判断,比如会存在RGB最大的值相等的情况,但是第二大的值不相等。因为n比较小,只有200,我们可以开一个三维dp来存储rgb的可能情况方案数。
dp[i+1][j+1][k]=max(dp[i+1][j+1][k],dp[i][j][k]+a[1][i+1]*a[2][j+1]);
dp[i+1][j][k+1]=max(dp[i+1][j][k+1],dp[i][j][k]+a[1][i+1]*a[3][k+1]);
dp[i][j+1][k+1]=max(dp[i][j+1][k+1],dp[i][j][k]+a[2][j+1]*a[3][k+1]);
复习一下线段树
处理环形:
if(l<=r)pushdown(1,l,r);
else pushdown(l,1,r);pushdown(1,l,n);
3/29
E-翻转拼图
给定一个3*3的棋盘,每个格子有正反两面。现定义一种翻转操作:指定一个格子,将该格子和与其上下左右相邻(如果存在)的所有格子一同翻面。对于给定的棋盘初始状态,最少需要几步操作才能将棋盘的所有格子都翻转为正面?
给一个初始状态,求到达要求状态的最短步长。
3*3的棋盘,如果能想到初始状态可以用二进制(000000000~111111111)来表示,用异或来表示操作,简单的BFS一下就可以了。
J-RGB
给你一个M*N的网格,用红绿蓝(RGB)三种颜色填充,使得任意两个相邻的格子(上下左右四个方向相邻)颜色不同,请问总共有多少种不同的涂色方案?(1<=M<=8,1<=N<=5000)
由于m最多为8,可以采用状压dp的方法来求,对于一列来说,合法的方案有3*2^7种,对于一种确定合法的列方案,比如01201201(我们用数字表示颜色种类),有不超过55种方案可以成为它的下一个合法列(为啥捏?我也不清楚,打表打出来的)。
因为方案用三进制的8位数表示,值太大,我们可以用一个line存对于一列来说它的合法方案,用一个pair来存对于一个合法列(line[i])来说它的合法匹配(line[j]),注意此时存进去的是{i,j}而非{line i,line j }。
根据状压dp,我们设dp[i][j] 表示第i列的涂色方案为 J 的方案数。
可以得到状态转移方程:dp[i][J]+=dp[i-1][(在pair里存的对应J的前一列)]。
题意是给一棵树,求树上长度为k的子段数量。
树形dp
3/17
1800树形dp的题
题意是一棵树里有黑的有白的,问每个子连通块里黑白相差最多多少
DFS 找到对于i节点来说它子树能给它的最大的贡献值,再DFS 从上到下比较它父节点能给的最大贡献值(还要排除自身的因素)
构造一个从2*n到n+1的逆序排列,再构造一个1到n的顺序排列,这样
然后把b移到a位置上
额,可以抽象成求前缀和
0就是+1e6 1就是+1e6+1 2就是-2e6-1
找到区间和为0的区间
3/16
做做图
对floyd的理解
1700里非常简单的dfs
题意是让你更改一条边的连接,使得原来的树只有唯一一个中心
一棵树里最多只有两个中心,我们只要找到其中一个中心的子节点,然后把它连接到另外一个中心上就好啦,简单的dfs一下就好了
这题看着比较有意思,就是给一张只有-1,1的图表,能不能使从0,0走到n,m的路径和为0
数据范围nm<1e6 那么简单的dp,维护走到i,j的最小值和最大值,区间包括0的话就可以啦
3/14
DFS+离散化
题意是有n个门,门之间有m条有向边,这些边对应一个区间的编号可以通过,总共k个编号,给定s和t,问有多少个编号可以通过边从s走到t。
k给1e9的范围,明显不能通过k暴力,那么可以从m入手。
m条边对应m个区间,我们可以离散化区间,假如编号T可以从s到t,那么必然存在某个区间包含T并且这个区间任意一个编号也可以。
所以我们只需要枚举每个区间的端点,看是否可以从s走到t,假如可以,加上这个区间。
另外,存区间(l,r)的时候,要存(l-1,r)这样可以避免重复
H-Grid Coloring
题意转化过来就是求分界线的可能情况,要求这个分界线必须呈阶梯型递增
然后就是一定要开ll
2023/3/13
D. Little Girl and Maximum XOR
二进制贪心
双指针,把区间和为0的区间看出边界统计剩下的区间数量
DFS
找到相同颜色的长度为2的子段然后把两端的子树去掉
2023/3/12
学到了一个新函数unique
unique(a+1,a+n+1)-(a+1)返回a数组不重复的元素个数
湖南2016B有向无环图
n是1e5的范围,那么暴力枚举必然会超时
dfs记忆化搜索
从入度为0的点开始搜索,用sum[i]存i到其它点的count(i,j)*ai*bj
如果x是i的父节点,那么sum[x]就等于sum[i(对于所有的i)]/a[i] *a[x]
2022/3/11
机房DAY 2
dijkstra有点生疏了,排位赛还因为板子忘存了,不会背算法一道dij题没做出来
所以,刷爆dij!!!
n个点,其中k个点是特殊点,问你n种任意一点到任意特殊点的最短距离。
虚拟源点思想
虚拟0点为起始点,到特殊点的距离为0,dij跑一遍
dij记录最短路径,同时更新最短路径方案数
繁琐的dij板子题
2022/3/10
主要是思维
求i*j-k*(a[i]|a[j])的最大值。
i从n-2-2k开始暴力枚举就好了。
牛客Tokitsukaze and Development Task
一看题目就觉得和排位赛第三场那道dfs很像
数据范围也给的小
于是就dfs 加上dp记录最小步数剪枝
dp+思维
dp[i][k]表示到前i个位置用前k个区间最多覆盖的长度
2022/2/29
今天心情好烦躁呐!!!!
二分+求前缀和,好难说,懒得说乐
贪心,且利用priority_queue容器
不行不行静下心来好好说
这道题主要用到双指针以及前缀和思想
统计子区间和不为0的所有区间个数,双指针找到区间为0的区间[a,b],那么[a,b-1]是合法的,[a,b-2],[i,b-1]也是合法的所以要加上b-i+1
同时用set容器记录出现过的前缀和 区间和为0的区间[i,j]有一特点那就是前缀和i-1和前缀和j相等。
😔焦虑
2022/2/28
D. Another Problem About Dividing Numbers
额,质因数分解
树形dp,两边不能染同一个颜色
dp[fa][0]=累乘dp[soni][1]+dp[soni][2]
B. Mahmoud and Ehab and the bipartiteness
二分图染色 dfs
用一个数组col记录当前点的染色情况,如果这个点没有被染色,那么dfs为这个点以及它的子节点染色。
2022/2/27
可恶忘记保存了!
BFS的过程中同一批加入队列的次序可以打乱,给一组次序问是否有效
直接模拟的思路,判断下一批是不是上一个人的儿子。
做法:
1.map<int,set<int>>mp;
2.mp[x][y]=1;
判断自环,拓扑排序,把入度为0的点删光
判断有几个循环,最长的循环
简单的模拟就好了
2022/2/22
codeforce-977-D-Consecutive Subsequence
求值严格按1递增的最长子序列长度以及下标
我想半天用vector存它们的序列集合,偷看了眼别人的提交发现只要第一遍判断出最长的长度L以及该长度下的最大值MAX,第二遍遍历找等于MAX-(L--)的值就好了。
想太复杂了。
codeforce-467-C. George and Job
仍然是求dp递推式,已经有点轻车熟路了
dp[i][j]表示前i个人已经分配完毕,其一共分好了j组
dp[i][j] = max(dp[i-m][j-1] + sum[i]-sum[i-m] , dp[i-1][j] );
codeforce-349-B-Color the Fence
贪心
首先找到价格最低的那个数,把你有的钱先除以这个最小的数,因为这样能保证你能得到最多的位数
然后,你再试试能不能把最高位上的数替换成9,8,7. .. 能不能把第二高的数替换成9,8,7.....
2023/2/21
codeforce-118-D-Caesar's Legions
求dp递推式
数据范围小,开了个四维dp[i][j][0/1][k]
表示已排 i人,其中j人是步兵,前面一个人是0/1(步兵/骑兵),并且已经连续排了k个
dp[i+1][j+1][0][k+1] = dp[i][j][0][k]
dp[i+1][j+1][0][1] = dp[i][j][1][1~k2]
codeforce-1365-D-Solve The Maze
dfs迷宫
题意求能否把.变成#让G出去不让B出去
不让B出去,直接在B周围围上一圈#(注意假如G在B周围,则题无解;注意出口在B周围,也是一种特殊情况
围好#之后 从出口开始dfs ,看剩下的G能不能走出去
2022/2/20
codeforce-449-B-Jzzhu and Cities
主要是前缀和
KMP,俺其实不太懂
dp递推式
两种情况一种直接在后面加R,一种在i-k串后面加k个W
dp[i]=dp[i-1]+dp[i-k]