摘要:
挺有意思,主要是仔细观察这个数列和题目所给的信息,CF题目的解法经常就隐藏在题目信息和案例中 首先我们肯定是关注题目所给的merge的定义,发现首位是一个与其他不同的特殊信息。其实不难发现,如果一个数能成为某个小数组的开头来合并的话 在他后面的比他小的数,一定要跟他成为一个集合。否则不成立,因为如果 阅读全文
摘要:
合并显然可以想到使用双向链表,而对于如何找到最大值,可以用优先队列,两重排序。 有一些细节就是涉及到合并,合并完后需要将原有的两个状态删除,但是优先队列做不到,因此用set记录一下 #include<bits/stdc++.h> using namespace std; typedef long l 阅读全文
摘要:
答案具有连续性,每次的操作可能导致三个结果,+1,不变,-1 我们考虑操作,如果之前存在,那么之前变少的数量要+1,那么就要分是否答案+1 之后,我们考虑现在的贡献,也分两种情况考虑答案是否-1 #include<bits/stdc++.h> using namespace std; typedef 阅读全文
摘要:
显然我们发现,如果出现两个峰,中间必然有点没被全部的区间覆盖,就得出了答案 因此我们只需要正反求一下最长上升子序列即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long l 阅读全文
摘要:
做这题细节比较多,要想清楚实际的含义 首先我们肯定是想着枚举看看把哪些提到最前面 对于这题我们发现我们要维护的有两种情况,一种是相减小于0,一种是相减大于0 因此我们分两种情况讨论,并且注意状态的变化,具体细节看代码注释 #include<bits/stdc++.h> using namespace 阅读全文