首页 > 其他分享 >Codeforces Round 892 (Div. 2)

Codeforces Round 892 (Div. 2)

时间:2024-03-04 15:24:59浏览次数:22  
标签:892 text 可以 Codeforces DP max Div dp 绝对值


\[\large \text{Round 7 : Codeforces Round 892 (Div. 2) (VP)} \]

一言:
所谓人,无论是谁到了最后,都会形单影只。
——悠久之翼2

最令人无语的是最后三分钟交代码的时候把 \(\text{D}\) 题交到了 \(\text{E}\) 题,结果能过的代码直接没有过。。

\(\text{D: Andrey and Escape from Capygrad}\)

这题乍一看每一个东西有四个要输入的,好像还挺复杂的,但仔细想想你就会发现,实际上只有 \(l_i,b_i\) 是有用的。(后面会讲为什么)

仔细想想,我们可以把 \([l_i,b_i]\) 当作一个区间,然后将所有有交集的区间合并在一起,最后输出的时候直接看 \(x\) 在那个区间里面,然后直接输出这个区间的右端点。

接下来我们仔细想想为什么。

首先可以发现,如果有一次传送是在向前面传送,那一定不是最优的(至少除去这些传送必然还会留下最优解)。可能你到了前面可以到达更大的 \(b_i\),但是这样的 \([l_i,r_i]\) 肯定是包含当前操作的这个点的,所以我们可以直接在这一次传送时向后面传送,不需要向前。

然后对于 \(b_i\) 右边那一部分,可以发现,它即使有可能处于 \([l_i,r_i]\) 这个区间里面,但他此时如果跳到 \(b_i\) 实际上是在往后面退的,可以保证这个一定不是最优解,对于 \([l_i,a_i]\) 这一部分,可以发现,他最多也只能到 \(b_i\),所以刚刚那个贪心策略就是对的了。

\(\text{Submission}\)

\(\text{E: Maximum Monogonosity}\)

首先我们可以想到一个 \(\text{DP}\),即 \(dp_{i,j}\) 表示前 \(i\) 个数,已经选了长度和为 \(j\) 的不相交的区间可以得到的价值总和的最大值。(假设 \(f_{l,r}\) 表示一个区间 \([l,r]\) 的价值,感觉这个状态也不是很好想啊)

可以考虑枚举一个 \(k\) 表示选了区间 \([i-k+1,i]\)(当然可以不选),那么显然有 \(\text{DP}\) 转移:\(dp_{i,j}=\max \{ dp_{i-k-1,j-k} + f_{i-k+1,i}\}\)。

但是这样的时间复杂度是 \(O(n \times k ^2)\),显然不符合我们的要求。

可以发现,最难处理的是 \(f_{l,r}\) 的那两个绝对值。由于绝对值满足性质 \(|x| \in \{ x,-x\},|x| \ge \max\{x,-x\}\),所以我们可以把两个绝对值每个差一个正负号,合在一起就是 \(4\) 个,且可以发现只有合法的那个才有可能成为最大值。那么我们就可以重新写一次 \(\text{DP}\):

\[\begin{aligned} dp_{i,j}=\max \{ dp_{i-k,j-k} + a_i-b_{i-k+1}+b_i-a_{i-k+1}\} \\ dp_{i,j}=\max \{ dp_{i-k,j-k} - a_i+b_{i-k+1}+b_i-a_{i-k+1}\} \\ dp_{i,j}=\max \{ dp_{i-k,j-k} + a_i-b_{i-k+1}-b_i+a_{i-k+1}\}\\ dp_{i,j}=\max \{ dp_{i-k,j-k} - a_i+b_{i-k+1}-b_i+a_{i-k+1}\}\\ \end{aligned} \]

由于 \(a_i,b_i\) 是定值,整理一下就可以得到:

\[\begin{aligned} dp_{i,j}=\max \{ dp_{i-k,j-k} -b_{i-k+1}-a_{i-k+1}\}+a_i+b_i \\ dp_{i,j}=\max \{ dp_{i-k,j-k} +b_{i-k+1}-a_{i-k+1}\}-a_i+b_i \\ dp_{i,j}=\max \{ dp_{i-k,j-k} -b_{i-k+1}+a_{i-k+1}\}+a_i-b_i\\ dp_{i,j}=\max \{ dp_{i-k,j-k} +b_{i-k+1}+a_{i-k+1}\}-a_i-b_i\\ \end{aligned} \]

可以发现,对于中间那一坨最大值,他好像可以在求出 \(dp_{i-k,j-k}\) 的时候进行更新,可以发现 \(dp_{i-k,j-k},dp_{i,j}\) 的一个共同点就是他们的第一维坐标减去第二维坐标的差是一定的,所以我们可以定义一个 \(f_{x,0-3}\) 表示当前枚举到的所有的 \(i-j=x\) 的 \(\max\) 里面那一坨的最大值。所以每次求 \(dp_{i,j}\) 时,就是 \(f_{i-j,0-3}\) 在加上 \(a_i,b_i\) 对应的贡献再求个最大值,且每次求完 \(dp_{i,j}\) 之后,要记得对对应的 \(f_{i-j,0-3}\) 进行更新。

\(\text{Submission}\)

\(\text{What I learned:}\)

  • 当你发现每个东西里面的一些相关条件有些是无关紧要的时候,可以考虑把他删去来降低题目的复杂程度。

  • 当出现绝对值的运算并且要求最值时,一定要想一想如果不考虑绝对值是否有可能让一些错误的值成为最值。如果否,那么你就可以直接把绝对值这东西删去了,这样更能方便推式子。

  • 当你优化 \(\text{DP}\) 的时间复杂度时,一定要思考一下当前状态与他之前的所有状态是否都有共同点(比如 \(dp_{i,j}\) 与 \(dp_{i-k,j-k}\) 的共同点就是两维之差都是 \(i-j\)),且把转移式中只跟当前这个数相关的部分去掉,如果是,那么可以通过这个共同点维护一个东西(比如维护一个 \(f_x\) 维护此前所有 \(i-j=x\) 的所有状态最值),使得你能够快速找到是从哪个状态转移来是最优的,并且在求出一个 \(\text{DP}\) 式后,更新这个共同点维护的东西,从而优化复杂度。

标签:892,text,可以,Codeforces,DP,max,Div,dp,绝对值
From: https://www.cnblogs.com/SFsaltyfish/p/18051869

相关文章

  • Educational Codeforces Round 120
    \[\large\text{Round1:EducationalCodeforcesRound120(VP)}\]一言:孤独的人不会伤害别人,只会不断地伤害自己罢了。——我的青春恋爱物语果然有问题\(\text{C:SetorDecrease}\)后四题唯一场切题,(别问我为什么只有这一道)。读完题之后,理一下思路,可以很容易的想到......
  • Codeforces Round 893 (Div. 2)
    \[\large\text{Round3:CodeforcesRound893(Div.2)(VP)}\]一言:从你站在桥上看我的那一刻起你就是我的世界——火影忍者不是很满意,还是没有突破\(\text{D}\)题,确实是没有想到这题竟然如此毒瘤。。\(\text{D:TreesandSegments}\)首先不难想到一种思路,就是枚举......
  • Codeforces Round 806 (Div. 4) A-G(补题)
    A.YESorYES?思路:一次判断三个字母是否是y、e、s的大小写即可。这题是很久前写的,哈哈,马蜂改了不少。。#include<bits/stdc++.h>usingnamespacestd;intn;chars[5];intmain(){ scanf("%d",&n); for(inti=1;i<=n;i++){ scanf("%s",s+1); if......
  • 光标自动定位到起始位置contenteditable="true" ,v-html绑定内容,div可编辑时,光标移到最
    出现这个问题原因:(1)通过打断点可以看到,当你输入的时候触发input事件,提交值给父组件中的v-model;(2)但因为在子组件中又监听了v-model的值,所以整体形成了闭环;(3)还需要重点说明的是光标问题,contenteditable与v-html所在的元素值的改变如果不是通过输入而是通过赋值实现,光标就会跑到最......
  • 16 Educational Codeforces Round 142 (Rated for Div. 2)C. Min Max Sort(递归、思维
    C.MinMaxSort很不错的一道题目,不过脑电波和出题人每对上,\(qwq。\)正难则反。我们考虑最后一步是怎么操作的。最后一步一定是对\(1\)和\(n\)进行操作那么上一步呢?上一步应该是对\(2\)和\(n-1\)以此类推第一步应该是对\(\frac{n}{2}\)和\(\frac{n}{2}+1\)我们的答案应该......
  • Educational Codeforces Round 143 (Rated for Div. 2)C. Tea Tasting(前缀和+二分、
    C.TeaTasting思路这里枚举有三种思路然后经过考虑3是最可行的,然后接着考虑如何计算贡献这里在实现的时候用了一个差分数组,因为我们需要记录第i个茶师它喝了多少个\(b_i\)以及不满\(b_i\)的用\(c_i\)记录,最后计算一下答案即可。#include<bits/stdc++.h>#defineintlon......
  • Codeforces Round 930 (Div. 2)
    目录写在前面ABCDEF写在最后写在前面比赛地址:https://codeforces.com/contest/1937。被交互杀死的一集。赛时卡C明天有早八就直接睡大觉了,第二天看看D一眼秒了,最困的一集。A签到发现1会被先后交换到2,4,8,16……输出\(2^{\left\lfloor\logn\right\rfloor}\)即可。......
  • D - Diversity of Scores
    D-DiversityofScoreshttps://atcoder.jp/contests/abc343/tasks/abc343_d 思路准备两个map第一个存储,每个分数作为key,以及得此分数的运动员列表作为value这样,可以非常快速统计出某一时刻所有分数总数。第二个存储,每个运动员作为key,以及此运动员当前的分......
  • Codeforces Round 931 (Div. 2) A-D2
    A.TooMinTooMax贪心、排序。对数组排序后,显然当下标\(i\)、\(j\)、\(k\)、\(l\)分别选择\(1\)、\(n\)、\(2\)、\(n-1\)时求得最大值。时间复杂度:\(O(nlogn)\)。#include<bits/stdc++.h>usingnamespacestd;#definecctieios::sync_with_stdio(0);cin.tie(0)......
  • Codeforces Round 926 (Div. 2)
    A-SashaandtheBeautifulArray难度:⭐题目大意给定一个长度为n的数组,其分数为An-An-1+An-1-An-2...+A2-A1;问如何排列可以让该数组的分数最大;解题思路就是让An-A1最大;神秘代码#include<bits/stdc++.h>#defineintlonglong#defineIOSio......