训练记录·每天三道

厉教说每天坚持做三道1700难度的题就能提升水平了


3/31

准备蓝桥杯

整数拆分

完全背包dp

题面是给一个数字n,n可以被拆分成一些2的幂次数的和

比如7可以拆分成1 1 1 1 1 1 1或者1 2 4。。。

那么我们可以把n看成是背包的容量,2的幂次的值看成是可以装进背包的物品

3/30

cf-Book

题意有n个章节,要读懂第i个章节前必须先读懂它所规定的章节。每次从头到尾读,问第几次能全部读懂。

有向边,入度···明摆的拓扑排序,答案是拓扑排序中最长的递减链的长度。

开一个数组记录当前点的权值,当这个点可以入队时,遍历它的出点,假如出点下标小于它的下标,则试图更新它的递减链长度。

C. King's Path

简单的set+bfs走迷宫

set.count({x,y});会比较快

D. Colored Rectangles

动态规划,模拟矩形的拼接过程,只有两个颜色的话,同时选最大的就好,而三个颜色不好判断,比如会存在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的前一列)]。

D. Distance in Tree

题意是给一棵树,求树上长度为k的子段数量。

树形dp


3/17

CF-F. Maximum White Subtree

1800树形dp的题

题意是一棵树里有黑的有白的,问每个子连通块里黑白相差最多多少

DFS 找到对于i节点来说它子树能给它的最大的贡献值,再DFS 从上到下比较它父节点能给的最大贡献值(还要排除自身的因素)

A-构造_牛客挑战赛67 (nowcoder.com)

构造一个从2*n到n+1的逆序排列,再构造一个1到n的顺序排列,这样

然后把b移到a位置上

B-数据结构_牛客挑战赛67 (nowcoder.com)

额,可以抽象成求前缀和

0就是+1e6 1就是+1e6+1 2就是-2e6-1

找到区间和为0的区间


3/16

做做图

CF-B. Greg and Graph

floyd的理解

CF-D. Igor In the Museum

1700里非常简单的dfs

CF-C. Link Cut Centroids

题意是让你更改一条边的连接,使得原来的树只有唯一一个中心

一棵树里最多只有两个中心,我们只要找到其中一个中心的子节点,然后把它连接到另外一个中心上就好啦,简单的dfs一下就好了

CF-C. Zero Path

这题看着比较有意思,就是给一张只有-1,1的图表,能不能使从0,0走到n,m的路径和为0

数据范围nm<1e6     那么简单的dp,维护走到i,j的最小值和最大值,区间包括0的话就可以啦


3/14

F-Security Badge

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

二进制贪心

C. Eugene and an array

双指针,把区间和为0的区间看出边界统计剩下的区间数量

Rainbow Roads

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

codeforce-1554B-Cobb

主要是思维

求i*j-k*(a[i]|a[j])的最大值。

i从n-2-2k开始暴力枚举就好了。

牛客Tokitsukaze and Development Task

一看题目就觉得和排位赛第三场那道dfs很像

数据范围也给的小

于是就dfs 加上dp记录最小步数剪枝

G. Alice’s Stamps

dp+思维

dp[i][k]表示到前i个位置用前k个区间最多覆盖的长度


2022/2/29

今天心情好烦躁呐!!!!

Counting Friends

二分+求前缀和,好难说,懒得说乐

Counting Friends

贪心,且利用priority_queue容器

C. Eugene and an array

不行不行静下心来好好说

这道题主要用到双指针以及前缀和思想

统计子区间和不为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

额,质因数分解

Barn Painting

树形dp,两边不能染同一个颜色

dp[fa][0]=累乘dp[soni][1]+dp[soni][2]

B. Mahmoud and Ehab and the bipartiteness

二分图染色 dfs

用一个数组col记录当前点的染色情况,如果这个点没有被染色,那么dfs为这个点以及它的子节点染色。


2022/2/27

可恶忘记保存了!

D. Valid BFS?

BFS的过程中同一批加入队列的次序可以打乱,给一组次序问是否有效

直接模拟的思路,判断下一批是不是上一个人的儿子。

做法:

1.map<int,set<int>>mp;

2.mp[x][y]=1;

The Bovine Shuffle II

判断自环,拓扑排序,把入度为0的点删光

Reordering the Cows

判断有几个循环,最长的循环

简单的模拟就好了


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

主要是前缀和

codeforce-126-B-passport

KMP,俺其实不太懂

codeforce-474-D-flowers

dp递推式

两种情况一种直接在后面加R,一种在i-k串后面加k个W

dp[i]=dp[i-1]+dp[i-k]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值