上一页 1 ··· 15 16 17 18 19 20 21 22 23 ··· 27 下一页
摘要: 传送门 解题思路 对于每一条路,很显然只有两种情况,一种是走一次,一种是走无限次,而第二种情况的条件是这条边在一个环中。 所以先用Tarjan缩点,每个点的权值更新为这个环上所有边一直摘的蘑菇数的和。 然后跑一边既有边权也有点权的DAG上的dp即可。 //数据有锅,后四个点答案有误,用double存 阅读全文
posted @ 2020-10-23 21:06 尹昱钦 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 传送门 缩点 在一个有向图上缩点就是指把有向图上的环变成一个点。 具体实现用Tarjan。 先求强联通分量,每次遇到新点是把这个点进栈,最后若dfn[i]==low[i]则i这个点一定在环上,而且栈中i之后进入的元素也在这个环上(证明略)。 即一直出栈,知道出栈元素等于i。在出栈过程中维护信息即可。 阅读全文
posted @ 2020-10-22 23:28 尹昱钦 阅读(140) 评论(0) 推荐(1) 编辑
摘要: 传送门 解题思路 g[i][j][k]表示i到j这个点有没有长度为2^k的路径,若有为1,若没有为0。答案可以由g[i][x][k-1]&&g[x][j][k-1]更新(Floyd传递闭包)。 倍增求一遍后,把所有g[i][j][k] = 1 的 i j之间连一条长度为1的边(因为可以一步到达)。 阅读全文
posted @ 2020-10-20 23:31 尹昱钦 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 很显然的树形dp,设dp[i][j]表示在子树i上保留j条边的最大苹果树,从儿子节点转移过来即可,注意若某个儿子不选,则以此儿子为根的子树都不能选。 还有就是因为是二叉树,可以提前遍历一遍求出每个点的两个或零个儿子,就不用在求dp时倒序枚举了,算是一个小技巧趴。 AC代码 1 #i 阅读全文
posted @ 2020-10-19 23:51 尹昱钦 阅读(122) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 显然是区间dp,判断a[i]是否等于a[j],然后再枚举中间节点k即可。 关键是玄学错误: 一份代码提交后间接性AC? (就是一会显示AC,一会再提交就WA掉,一会又AC?) 莫非是因为用了班主任名字当变量? AC记录 WA记录 感谢 @rcxkk 解答并提供hack数据。 32行 阅读全文
posted @ 2020-10-19 00:23 尹昱钦 阅读(88) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 每行互不影响,所以分开处理,对于每一行,很显然是个区间dp,我们用dp[i][j]表示区间[i..j]的得分和的最大值,注意每次加一个数的顺序是先加上数再集体乘2。 恶心的地方在于需要写高精(学校比赛懒得写,所以只拿了60分),需要一个高精度+int,一个高精度*2,一个高精度+高 阅读全文
posted @ 2020-10-18 23:24 尹昱钦 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 很显然是dp(因为标签是dp)。 设dp[i][j]表示放到第i个原料,放完后的原料数量为j个最大的耐久度。 可以用dp[i-1][k]转移而来,其中k:j-1<=k<=min(w,j+s-1)。 你发现了什么,可以用单调队列优化! 即维护一个长度为s的单调队列。 //把这个题当做 阅读全文
posted @ 2020-10-18 00:05 尹昱钦 阅读(210) 评论(0) 推荐(1) 编辑
摘要: 传送门 解题思路 因为可以大整数分解为l*10k+(l+1)*10k-1+(l+2)*10k-3+……+r*100,而10k%9=1,所以原整数在模9意义下等于l+(l+1)+(l+2)+(l+3)+……+r=(l+r)*(r-l+1)/2。 因为有除法,所以我们算出2在%9意义下的逆元为5,即可解 阅读全文
posted @ 2020-10-17 21:42 尹昱钦 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 设dp[i][j]表示选出了第i个电塔,上一个选出的是第j个电塔的方案数。 枚举i,j,转移方程为: 找一个k,使得h[k],h[j],h[i]构成等差数列,并且k<j。 dp[i][j]+=dp[j][k]; 对于确定的i,j,h[k]是确定的,所以我们可以用vector a[i 阅读全文
posted @ 2020-10-17 00:28 尹昱钦 阅读(90) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 先说我的思路:枚举中间的那个人,然后在左边序列、右边序列分别做一次LIS,时间复杂度为n^3。 看题解后才发现有更优的做法,我们可以先预处理出正向和反向的LIS,然后枚举i统计答案即可,时间复杂度为n^2。 AC代码 1 #include<iostream> 2 #include< 阅读全文
posted @ 2020-10-16 23:33 尹昱钦 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 先按照l为第一关键字,w为第二关键字从大到小排序,保证前面的l一定比后面的大于等于,这样就能排除一维影响。 然后问题就变成了在排好序的序列中找最长不上升子序列的个数,根据狄尔沃斯定理(导弹拦截定理),我们得知最长不上升子序列的个数就等于最长上升子序列的长度。 所以这里O(n^2)求 阅读全文
posted @ 2020-10-16 23:17 尹昱钦 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 因为正序不好推,所以我们倒序: dp[i]表示从时间i到最终时刻n的最大休息时间,所以我们可以推出以下的状态转移方程: 若i时刻无任务,则dp[i]=dp[i+1]+1; 若i时刻有至少一个任务,则枚举这些任务k,dp[i]=dp[a[k]+b[k]];(a,b为题目中读入的每个任 阅读全文
posted @ 2020-10-16 22:46 尹昱钦 阅读(113) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 很显然的LIS板子题,找一个最长不上升子序列和最长上升子序列即可。 关于LIS(O(n^2)和O(nlogn)) AC代码 1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstdio> 阅读全文
posted @ 2020-10-16 00:02 尹昱钦 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 很显然的一道类似01背包的dp,每个人选择打或不打。 状态转移方程为 dp[i][j]=max(dp[i-1][j]+lose[i],dp[i-1][j-num[i]]+win[i]) 但这个题还是比较细节的,要注意一下几点: 数组要用long long,否则最后一个点会炸(因为答 阅读全文
posted @ 2020-10-15 22:50 尹昱钦 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 传送门 解题思路 显然的用到类似树形dp的思想,在一个有向无环图上做dp。 状态转移方程就是dp[v]加起来。 AC代码 //其实不用long long也可以 1 #include<iostream> 2 #include<algorithm> 3 #include<cmath> 4 #includ 阅读全文
posted @ 2020-10-15 00:07 尹昱钦 阅读(168) 评论(0) 推荐(0) 编辑
上一页 1 ··· 15 16 17 18 19 20 21 22 23 ··· 27 下一页