首页 > 其他分享 >单调

单调

时间:2023-02-09 15:46:48浏览次数:51  
标签:匹配 texttt 121 123 集合 单调 贪心

超级神仙题。

题意

给你一个序列 \(a_1\dots a_n\),值域为 \([1,3]\) 最大化选择的不交的合法子序列数,一个合法的子序列是 \(1,2,3\) 或 \(3,2,1\), \(n\leq 10^5\),输出方案。

这个题乍一看建不出网络流模型,也没有什么像样的 dp 做法,所以考虑一些神奇的贪心或者结论。


\(\texttt{1\反悔贪心}\)

考虑从左到右处理出每个前缀的答案,加入一个新的数字最多使答案增加 1。

考虑贪心:

直接记录目前 \(1\) 的集合 \(3\) 的集合,\(12\) 的集合 \(32\) 的集合,然后贪心地匹配,来了个 \(2\) 就随便给 \(1\) 或者 \(3\) 凑。

这个也很显然是错的,有两个错点:

第一个是 \(2\) 的问题:\(\texttt{3123}\) 如果把这个 \(2\) 给了 \(3\),后面出现 \(3\) 了本身可以形成 \(\texttt{123}\) 的,对于这个错点我们可以发现目前所有 \(1,3\) 后面的 \(2\) 来说,\(1,3\) 的集合一定都可以公用这些 \(2\),或者都不能接上这些 \(2\),否则一定会形成 \(1,2,3\) 或 \(3,2,1\),于是我只需要记录所有后方的 \(2\) 和前方的 \(2\) 的位置集合。

第二个问题是贪心的形成不一定对:

一个例子是 \(\texttt{123231}\) 。 贪心的匹配出了 \(\texttt{123}\),后面剩下的部分就不合法了,而选择 \(\texttt{12__3_,__32_1}\) 这两个串是更优的。 这启示我们在这个 \(2\) 出现时反悔之前的操作:

若之前有 \(\texttt{123}\) 或 \(\texttt{321}\) 且有单独的未匹配的 \(2\),这一位是 \(1\) 或者 \(3\),则我们可以改变匹配的方式将类似 \(\texttt{123 + 23}\) 变成 \(\texttt{123 + 32}\)。

例:

\(\texttt{123+23}\to\texttt{12__3 + __23_ }\) ,这样是不劣的,因为开始那样 出现在 \(1,3\) 前面的 \(2\) 必定不可能对答案贡献,形成了 \(\texttt{12,32}\) 后可能产生贡献。

于是思路就出来了:

若该数为 \(2\) :

若目前 \(1,3\) 都有对应的 \(2\) 了,就将 \(2\) 放入“单独 \(2\)”集合,可能在后方被已经形成的串用作反悔,否则放入“已用 \(2\)”集合,可以被目前所有 \(1,3\) 共用。

若该数为 \(1\) :

(优先级最高)若能形成一个 \(1,2,3\) 一定不劣。

(优先级次高)若在“单独 \(2\)”集合非空,从其中前面拿出一个 \(2\),找到其对应的合法串做反悔形成 \(12\),这样一定不必放单独的 \(1\) 劣。

(优先级最低)放入单独的 \(1\) 中为后面做匹配。

该数为 \(3\) 的情况与 \(1\) 中心对称。

实现较为复杂,适当使用队列可以做到 \(O(n)\) ,一个很大的优点是它可以处理出每个前缀的答案且是复杂度线性。


\(\texttt{2\神奇结论}\)

一个好像很显然又无法想到的结论是:

对于每一对 \(\texttt{121},\texttt{323}\) 无论位置关系总存在一种方案调整配对关系形成两个合法串,具体讨论可以在纸上模拟一下。

也就是说我们先把 $\texttt{121,123,321,323} $ 全部拿出来,然后将 \(\texttt{323,121}\) 交换至合法,然后对于剩余的 \(\texttt{121 或 323}\) 和剩余的 \(3\) 和 \(1\) 匹配在一起,可以证明这样是正确的,因为 \(\texttt{123}\) 的个数在这种情况下总被 \(1,3\) 及 有意义的 \(2\) 中的至少一者限制。

现在转化后的问题 \(1\) 和 \(3\) 等价了我们把他们都当作 \(1\),然后就是要选择一些以 \(1\) 为端点的线段并匹配中间的一个 \(2\) 。

这个问题可以而二分答案解决:二分答案 \(k\),则一定是将前缀中 \(i\) 个 \(1\) ,后缀中的第 \(i\) 个 \(1\) ,以及能供匹配的最靠前的 \(2\) 匹配,证明可以由两个数的情况归纳推广而来。

好像还可以做到线性,但我不太会。

复杂度 \(O(n\log n)\),实现那个调整 \(\texttt{121,323}\) 可以通过循环顺序较为简单地实现。


\(\text{More:}\)

收录于 超级无敌神仙炫酷无敌原神大王好题

有一说一这种题虽然很好,但是像喵了个喵这种这种难想还难写的题还是少点吧。

标签:匹配,texttt,121,123,集合,单调,贪心
From: https://www.cnblogs.com/Dreamerkk/p/17104783.html

相关文章

  • 【CSP201312-3】最大的矩形,单调栈
    problem201312-3试题名称:最大的矩形时间限制:1.0s内存限制:256.0MB问题描述:问题描述在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1≤i≤n)个矩形的高度......
  • 1.4 单调栈
    84.柱状图中最大的矩形最大矩形的高度瓶颈可能在于各个柱子的高度,如图所示基于以上观察,一个朴素算法是:枚举每种可能的高度瓶颈1.1向左、右扩展宽度1.2擂台更新......
  • 【tyvj1305】最大子序和(单调队列)
    problem给你一个长为n的序列求一个长不超过m的连续子段,使子段和最大solution如果n<=10^3,我们很容易写出枚举(s是前缀和,区间[l,r]的和就是s[r]-s[l-1]。枚举l,r即可。for(int......
  • 重学单调队列优化dp
    再谈单调队列优化dp。题目:CF1077F1&2PictureswithKittens(Easy&hardversion)从n个数中选出m个数,连续k个数至少选出一个,最大化选出数和。easyversion普通dp,hard则......
  • 2019南昌网络赛 I. Max answer(DP或者单调栈+思维)
    Alicehasamagicarray.Shesuggeststhatthevalueofaintervalisequaltothesumofthevaluesintheinterval,multipliedbythesmallestvalueinthein......
  • 单调栈
    顾名思义单调栈就是具有单调性的栈常见模型:找出每个数左边离它最近的比它大/小的数【算法】intstk[N],tt=0; //栈中存数据for(inti=1;i<=n;i++){i......
  • 单调栈及其应用
    目录单调栈简介伪代码应用应用1:Leetcode.496题目分析代码实现复杂度分析应用2:Leetcode.503题目分析代码实现应用4:Leetcode.2454题目分析代码实现应用4:Leetcode.739题目分析......
  • 堆栈、队列、单调栈、单调队列1
    Stack和Queue——栈和队列栈的定义:栈是限定仅在表头进行插入和删除操作的线性表(先进后出)队列的定义:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)......
  • 两个单调栈的问题
    两个单调栈的问题写灵神每日,遇到两个单调栈的经典问题,就放一起了问题一https://codeforces.com/problemset/problem/1691/D输入t(≤1e5)表示t组数据,每组数据输入n......
  • P5858 「SWTR-03」Golden Sword DP+单调队列模板
    P5858「SWTR-03」GoldenSword-洛谷|计算机科学教育新生态(luogu.com.cn) 理解题意后,我们知道贪心和暴力枚举显然是不行的,联想到DP我们设置dp[i][j]表示,第i种......