![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
0412
ACM题解
timidcatt
永远不要放弃战斗
展开
-
Coins hdu2844
思路:多重背包问题,dp[i][j]表示表示前i种硬币能否拼成金额j,能为1,不能为0,第一种情况用前i-1种硬币能拼出来的,前i种也是能得,所以如果dp[i-1][j]=1,那么dp[i][j]也等于1,第二种情况,i相等时,如果当前已经得到金额j-vi,且当前硬币还有剩余,则dp[j]=1,即如果dp[j-v[i]]=1,则dp[j]=1,所以我们用一个num数组统计当前种类硬币已选取的数量,然后如果当前位置没有转移过且我们转移过来了,就令答案+1。原创 2022-10-28 19:00:30 · 121 阅读 · 0 评论 -
The more, The Better HUD1561
状态表示:dp[u][j]表示在以节点u为根的子树中选择j个节点获得的最大价值 状态转移:对节点u的每一个子节点v,若在以v为根的子树内选择k个节点获得的最大价值为dp[v][k],则在以节点u为根的其余部分获得的最大价值为dp[u][j-k],两部分求和之后在与当前状态取最大值,方程:dp[u][j]=max(dp[u][j],dp[v][k]+dp[u][j-k])(k原创 2023-05-23 21:40:43 · 50 阅读 · 0 评论 -
ACboy needs your help hdu 1712
思路:我们用dp[j]表示上了j天的收益,对于第i门课程,可以选择不上,dp[j]就等于dp[j],或者我们枚举要上的天数,上k天的收益从k天前转移到j,dp[j]=dp[j-k]+a[i][j],对于每门课程的花费天数k,直接两种方案取最大值即可。原创 2022-10-29 14:06:17 · 292 阅读 · 0 评论 -
Perfect Service poj3398
思路:我们用dp[u][0]表示u是服务器,dp[u][1]表示u不是服务器但父结点是服务器,dp[u][2]表示u不是服务器且父结点也不是服务器。如果u不是服务器,且父结点也不是服务器,那么子节点里至少有一个是服务器,需要枚举每个节点是服务器,其他节点不是时的最小值,即dp[u][2]=dp[v其他]+dp[v][0],但我们已经算出v都不是服务器的情况了,所以我们可以直接用所有子节点都不是服务器的情况减去dp[v][2],即dp[u][2]=dp[v][1]-dp[v][2]+dp[v][0]原创 2022-11-06 18:13:50 · 79 阅读 · 0 评论 -
Party at Hali-Bula hdu2412
思路:我们用dp[u][0]表示选择u这个点,do[u][1]表示不选u这个点,f[u][0]表示不选这个点是否方案数是否唯一,f[u][1]表示选择这个点时方案数是否唯一,我们从下向上遍历,如果选择这个点,那么他的子节点可选可不选,我们在两者之间取最大,然后如果子节点选和不选的结果是一样的,那就更新f[u][0]=1,否则只有子节点对应状态f为1时再上传,如果我们选这个点,那么子节点都不能选,dp[u][1]+=dp[v][0],同时维护f,我们建立一个超级源点连接1号点,dp[0][0]即为答案。原创 2022-11-03 22:48:41 · 87 阅读 · 0 评论 -
Strategic game poj1463
思路:对于每个点,我们可以选择放棋子或不放,如果放的话,那么他的子节点放不放都行,取最小值,如果不放,那么他的子节点就必须都要放,我们从下向上遍历,对于每个节点,放的话dp[u][1]=min(dp[v][1],dp[v][0]),不放的话dp[u][0]+=dp[v][1]题目大意:树上有n个点,每个点都可以放一枚棋子,每枚棋子可以影响到监管相邻的格子,问要使每个格子都受监管,最少需要多少棋子。原创 2022-11-03 22:06:28 · 89 阅读 · 0 评论 -
C. Bulmart codeforces 730C
思路:因为每个超市可以任意选择数量,所以我们肯定优先选取单价最便宜的那个,那么我们可以二分答案,先dfs找出顾客所在位置到所有超市的最短距离,然后再判断在二分枚举的距离内的超市按照价格从小到大的顺序拿,直到拿够商品然后判断实际价格有没有超过预算,没超过,即可以把预设距离缩短试试,如果商品那不够,或者超出预算,就要加大预设距离。原创 2022-11-19 20:32:24 · 103 阅读 · 0 评论 -
2022 ICPC 杭州 C. No Bug No Game codeforces gym104090C
题目大意:有n个物品,背包容量为k,每个物品重量为pi,取的重量不同,获得的价值也不同,从1到pi分别为wj,如果当前背包容量足够,则必须取完整的重量,否则才可以取部分重量来填满剩余的背包容量,问能取得的最大价值是多少。原创 2023-01-03 14:32:02 · 1239 阅读 · 5 评论 -
Piggy-Bank hdu1114
思路:完全背包在01背包的基础上一种物品可以取多个,所以拿第i中物品的状态转移方程为dp[i][j]=dp[i][j-w[i]+v[i],所以与01背包唯一的不同就是变为了从i到i转移,那么我们将其优化为一维数组后,直接正向更新,也就模拟了之前的i向之后的i转移的过程。题目大意:存钱罐的空重为e,现称重为f,已知有n种硬币,每种硬币的价值为vi,重量为wi,问这些硬币的重量符合称重的重量吗,符合的话求存钱罐里装的钱最少价值多少。原创 2022-10-28 16:30:19 · 120 阅读 · 0 评论 -
Bone Collector HDU 2602
思路:我们定义dp[i][j]为前i个物品,装了j的体积时的最大价值,对于第i个物品,我们只有两种选择,要么拿,要么不拿,如果不拿,当前的总价值就为前i-1个物品的价值,dp[i][j]=dp[i-1][j],如果拿,问题就转化成了将前i-1个物品放入j-w[i]的容量里的最大价值+当前物品价值v[i],dp[i]=dp[i-1][j-w[i]]+v[i]。题目大意:有n个物品和一个容量为W的背包,每种物品最多只能拿一个,给出每种物品的价值和体积,问能拿取的最大价值是多少。原创 2022-10-28 13:05:08 · 386 阅读 · 0 评论 -
C. Least Prefix Sum codeforces 1779C
所以从m开始向左累加的每一个和都应该是小于等于0的,那么我们从m开始向左遍历,如果当前遇到的数本身就是小于等于0的,直接累加即可,如果不是,我们先将其放入优先队列中,因为我们之后操作肯定是对最大的数进行操作取得的收益最大,然后我们加上这个数,判断如果当前的累加和已经大于0了,就要-2倍的优先队列堆顶的数,直到累加和小于等于0,特殊的是a1不需要任何处理。对于m右边的数,我们同样用之前的方法可以推出从第m+1个数开始,向右累加的每一个和都要大于等于0,向右遍历的操作也有上面类似,不再赘述。原创 2023-01-04 16:56:52 · 244 阅读 · 0 评论 -
D. Triangle Coloring codeforces1795D
或者两个三角形1红+2蓝和1蓝+2红,因为只有连接颜色不同的点的边才会被记录,所以显然后者权值才能最大,那么对于每个三角形,都可以将两条边的权值计入整幅图的权值中,要想选最大,也就是每个三角形要选出两个权值最大的边,我们暂时先不考虑这个三角形是1蓝2红还是1红2蓝的问题,如果这个三角形的三条边是形如4,2,2这样两条小边相等的情况,那我们可以选择1,2两条边或1,3两条边有两种情况,如果这个三角形是形如2,2,2这样三条边都相等的情况,那么我们可以选择1,2;原创 2023-02-18 17:30:01 · 324 阅读 · 0 评论 -
C. Fools and Roads codeforces 191C
思路:树上边差分题,先将边权下放到点权,令每条边的终点的点权为边权,然后要统计边的访问次数,就将起点和终点的计数分别+1,因为起点和终点的lca为这个子树的根,所以计数应该为0,也就要-2,这样该子树以外的点的计数就都不变。题目大意:有一棵n个点的树,给出m个数对,每次从一个点出发到另一个点,问每条边被访问的次数。原创 2023-05-16 13:06:18 · 58 阅读 · 0 评论 -
松鼠的新家 51Nod - 3116(点差分)
题目大意:有一棵n个点的树,给出一长度为n的数组a,依次沿简单路径访问a[1],a[2],a[3]...a[n]号点,问每个点被访问的次数是多少。原创 2023-05-16 09:27:21 · 88 阅读 · 0 评论 -
C. Tea Tasting codeforces 1795C
题目大意:有两个长度为n的数组a,b,每一轮操作,ai减去对应位置上的bi,最小减为0,然后删除b1,b数组所有元素都向左移,直到b数组中所有数都被删除,问原b数字的每个数分别使a数组减去了多少。原创 2023-02-18 16:17:18 · 464 阅读 · 0 评论 -
CCPC2022桂林 C. Array Concatenation(gym 104008C)
sum2的值等于2^i*2^i*sum2,再进行m-i次操作1,在枚举i时维护最大值。题目大意:又一个长度为n的数组和规定的m次操作数,有两种操作,操作一是将当前的数组复制到数组的末尾,操作二是将数组翻转后放到数组的前面,问操作m次后最大的前缀和的和是多少,要求求出对1e9+7求余后的余数的最大。我们发现sum2的数量为等差数列的和,于是我们可以得到进行了i次操作1的数组的前缀和的和为(2^i-1)*2^(i-1)*sum2+2^i*sum;原创 2022-11-01 14:22:01 · 583 阅读 · 0 评论 -
B. Balanced Substring
Problem - 873B - Codeforces题目大意:有一个长度为n的由0和1组成的字符串,找一个最长的子串,使子串中0和1的数量相同。思路:用前缀和数组统计1和0的个数,遍历字符串,如果遇到1,则前缀和数组+1,如果遇到0,则-1。建立好前缀和数组后,再遍历数组,如果当前位置的前缀和在前面没有出现过,就记录这个位置,如果当前位置的前缀和不是第一次出现,那么当前的位置减去之前记录的的位置就是对应合法子串的长度,维护最大值即可。...原创 2022-07-07 15:04:47 · 254 阅读 · 0 评论 -
D. Reset K Edges codeforces 1739D
思路:因为n的范围是2e5,所以我们可以二分最小层数,每次二分遍历整棵树,按照最小层数的限制对树进行修改,然后比较实际进行的修改次数和限制次数k,但我们可以发现在下图中,如果我们从根开始向下统计每个点的深度,深度等于>限制深度就将点连接1,如果当前的限制深度为2,按照如上操作应该将3,4,6,8四个点连到1上,而实际上如果将7,9,5连到1上,操作次数少1,也就是我们从上向下遍历的时候,我们选择哪个点连接到1对后面的结果是有后效性的,所以无法考虑所有情况。原创 2022-10-06 22:03:33 · 314 阅读 · 0 评论 -
D. Permutation Addicts codefoeces1738D
然后我们考察b数组怎么还原a数组,我们发现对于b数组,如果bi!=n+1或,那么bi在a数组中一定在i左边,因为在a构造b时无论规则1还是2都是去左边找这个数,又因为a数组是n的排列,也就是数字不重复,所以我们只要找到a中数字的顺序即可,那么我们可以把a数组看成一个森林,如果bi=n+1或0,那么可知他们是不满足规则12的前半部分的,也就是无法得知i在a中左边的数,所以可以把这样的i设为树的根节点,对于其他的数,我们从bi到i建一条边,表示bi在i的左边,比如b数组=6,4,4,1,1时得到的树如下。原创 2022-10-27 16:57:42 · 169 阅读 · 0 评论 -
Party - Codeforces 1711B
题目大意有n个人是聚会的候选人,在他们之中有m对朋友(两人为一对),每对朋友都会在聚会上一起吃掉一个蛋糕,但聚会因为某些原因只能提供偶数个蛋糕,只能放弃对一些人的邀请(当然也可能没有人被放弃),如果第i个人被取消参与聚会的资格,聚会会增加a[i]的不满意度,问在确保蛋糕个数为偶数的前提下,最小的不满意度是多少。所以我们考虑两个点有连边的情况,那么这两个点的入度应该为偶数(两个点的入度相加-1等于总边数),所以我们遍历每条边,如果该边两端点的入度都为偶数,就找这两个端点的费用的最小值。...原创 2022-08-02 14:42:52 · 204 阅读 · 0 评论 -
Split Into Two Sets Codeforces 1702E
首先每个数字一定出现了两次,且我们只需要将出现的两个地方中的一个染成白色,同一个数字出现的另一张骨牌上的另一个数字就得被染成黑色比如我们可以把(5,6)中的5染成白色,那么(5,7)中的7就得是黑色,接着(7,8)中的8是白色(8,6)中的6是黑色,这样我们就得到了(5,6)(7,8)和(5,7)(8,6)两副牌,所以我们只需将每张骨牌上。题目大意:每张多米诺骨牌上有1到n之间的两个数字,现给出n张牌,问能不能把骨牌分成两副,使得每一副骨牌中没有重复的数字。的两个数字之间连边,然后用染色法进行二分图检验。.原创 2022-08-03 15:07:49 · 202 阅读 · 0 评论 -
D. Lucky Permutation codeforces1768D
如果我们交换2,1使1被放到排序好的位置,就相当于将1的出边指向自己,然后4的出边指向2,类似于链表删除元素的操作,所以对于有四个元素的环,3次操作就能使所有数排好序,所以要使整个列排好序只需要n-换的数量次操作,然后要有一个逆序对只需再额外交换两个相邻数即可,但是在排序的过程可能出现过两个相邻元素成一个点数为2的环,这样的环不需要拆,操作数不需要+1,而需要-1,所以我们对于在dfs时,对于每个环都用map记录当前访问过的元素,如果遇到过+1或-1的元素,就操作数-1。原创 2023-01-07 14:46:18 · 193 阅读 · 0 评论 -
D. Friendly Spiders codeforces1775D
思路:因为n的范围是3e5,所以建图最大的时间复杂度就是nlogn,这样的话我们对于每个数,将这个数的下标与这个数的所有质因数建边,因为如果两个数的gcd不等于1,那么他们一定有相同的质因数,这样的时间复杂度就是nlogn,因为边权都是1,所以我们从起点开始bfs,第一次找到终点时一定是最短路径,bfs同时保存路径。题目大意:有n个点,如果有两个点的权值ai的gcd不等于1,那么这两个点之间是联通的,问两点之间的最短距离。原创 2023-01-19 21:28:19 · 88 阅读 · 0 评论