首页 > 其他分享 >[ABC299G] Minimum Permutation

[ABC299G] Minimum Permutation

时间:2023-10-27 19:46:28浏览次数:53  
标签:复杂度 链表 Minimum 答案 Permutation 考虑 ABC299G 单调

ABC229G洛谷链接
atcoder链接

  • 容易发现如果最终答案有两个相邻的数 \(b_i,b_{i+1}\) 满足 \(b_i>b_{i+1}\) 且 \(b_i\) 之后出现过,则显然可以找到另一个不劣的答案不满足这个性质
  • 先说一个错误的结论:从前往后考虑,用链表维护答案,对于加入的一个数 \(a_i\) ,如果之前在 \(a_j\) 出现过,并且答案中这个的下一个数 \(< a_j\) 则在链表中删除这个位置,并在插入在链表末尾
  • 这个思路是错误的,Hack: 2 3 1 2 3 ,因为 \(2\) 认为自己比 \(3\) 小,因此并不会替换到链表的末尾。
  • 上面思路错误的原因是没有考虑到自这个数之后对答案的影响。但如果我们暴力考虑后面每一个数复杂度就变成了 \(O(n^2)\)
  • 既然让前面的往后考虑不行,那我们试着让后面的向前考虑。考虑单调栈(这里并不是狭义上求左右第一个最大值位置的单调栈,而是参照了单调栈的思路),对于加入的数 \(a_i\) ,如果这个数没在栈中出现过,则把栈顶所有不满足上述条件的弹出,并把 \(a_i\) 加入栈中,直到考虑完前 \(n\) 个,此时栈中显然有 \(m\) 个元素,便利输出答案即可
  • 最终复杂度 \(O(n)\)

标签:复杂度,链表,Minimum,答案,Permutation,考虑,ABC299G,单调
From: https://www.cnblogs.com/fox-konata/p/17793021.html

相关文章

  • #dp,二项式反演,容斥#CF285E Positions in Permutations
    题目问有多少个长度为\(n\)的排列\(P\)满足\(|P_i-i|=1\)的\(i\)的个数恰好为\(k\)个分析设\(dp_{i,j,k}\)表示前\(i\)个数钦定\(j\)个数满足上述条件且现在\(i\)和\(i+1\)因此被占用的方案数。那么第\(i\)个满足上述条件无非就是放入\(i-1\)或者\(......
  • CF1887C Minimum Array
    一个很直接的思路是,维护当前可行决策集合\(S\in\{0,\dots,q\}\),从\(1\)到\(n\)分别考虑每一个\(a\),排除一些决策,最终得到答案。既然要排除决策,我们当然需要知道对于当前的\(a_i\),前\(j\)个操作之后的值都是多少,如果能得到这个,且这些值都在线段树上呈现,我们直接在线段树......
  • CF1887C Minimum Array
    CF1887CMinimumArray小丑做法。首先差分一下,转化成两次单点加。每次考虑前\(i\)位,然后一直维护当前合法的时刻区间,这个东西怎么做呢?可以离线下来记录每个点被那些操作波及,然后算一遍前缀和,对于合法的区间区间打标记。需要支持区间加\(1\)和查询最大值,用线段树维护。复杂度......
  • CF1542E2 Abnormal Permutation Pairs (hard version) 题解
    AbnormalPermutationPairs(hardversion)两个限制:字典序小、逆序对大,一个显然的想法就是确保一对关系,统计另一对关系。确保哪一对呢?我们想了想,决定确保字典序小,因为字典序是可以贪心的。具体而言,我们考虑两个排列自第\(i\)位开始出现了不同。这样子,我们便将两个排列各自划......
  • Codeforces Round 884 (Div. 1 + Div. 2) B. Permutations & Primes
    给一个正整数\(n\),你需要构造一个\(n\)的排列\(p_1,p_2,\cdots,p_n\)。对于排列\(p\)的每个子段\([l,r]\),\(mex_{i=l}^{r}a_i\)的结果为质数的次数尽可能多。此处的\(mex\)最小排除值最低为\(1\)而非\(0\)。不难想到,小质数\(2,3\)容易构造。于是有......
  • 【前缀和优化 dp】CF1542E2 Abnormal Permutation Pairs (hard version) 题解
    CF1542E2首先时间复杂度肯定是\(\mathcal{O}(n^3)\)的。容易想到先枚举最长公共前缀,然后枚举\(p_{len+1}\)和\(q_{len+1}\),再枚举逆序对数进行统计。令\(f_{i,j}\)表示有\(j\)个逆序对的\(i\)阶排列的个数。易得转移\(f_{i,j}=\sum\limits_{k=\max(j-i+1,0)}^{j}f......
  • Codeforces Round 893 (Div. 2) C. Yet Another Permutation Problem
    有一个\(gcd\)游戏,按以下步骤进行:选择一个\(n\)的排列\(p_1,p_2,\cdots,p_n\)。对于每个\(i\),\(d_i=gcd(p_i,p_{i\%n+1})\)排列\(p\)的\(score\)为数组\([d_1,d_2,\cdots,d_n]\)中不同数的个数。给一个\(n\),需要构造一个排列\(p\),使得\(sco......
  • [ARC167D] Good Permutation 题解
    题意对于一个长度为\(N\)的排列\(Q\),定义其为好的,当且仅当对于任意整数\(i\in\left[1,N\right]\),在进行若干次操作\(i\leftarrowQ_i\)后可以得到\(i=1\)。给定一个排列\(P\),定义一次操作为交换两个数。定义\(M\)为可以将\(P\)变为一个好的的排列的最小操......
  • ARC167D Good Permutation 题解
    题意给定一个长度为\(N\)的排列\((P_1,P_2,\cdots,P_N)\)。称一个排列\(P\)为“好排列”当且仅当对于所有\(1\leqx\leqN\),都能通过不停地使\(x\leftarrowP_x\)将\(x\)变成\(1\)。通过最小次数操作将\(P\)变成“好排列”,每次操作为交换\(P\)中的两个数\(P_i\)......
  • Codeforces Round 903 (Div. 3) F. Minimum Maximum Distance(图论)
    CodeforcesRound903(Div.3)F.MinimumMaximumDistance思路对标记点更新fg,从0开始进行bfs,更新d1为所有点到0的距离获得到0最远的标记点L,从L开始bfs,更新d2为所有点到L的距离获得距离L最远的标记点R,从R开始bfs,更新d3为所有点到R的距离遍历所有点,这个点与标记点的最大距......