首页 > 其他分享 >AT_arc167_e 题解

AT_arc167_e 题解

时间:2024-01-13 16:47:23浏览次数:31  
标签:cnt 排列 对于 题解 交换 arc167 考虑 收敛

题意

给定 \(k\) 和一个排列 \(P'\),问有多少个排列 \(P\) 以最少步数交换相邻两个元素来进行收敛,最终的排列可能是 \(P'\),一个排列是收敛的当且仅当对于每一个数,在该数前且比这个数大的数的个数不超过 \(k\) 个。

思路

考虑正向的让一个排列收敛,我们设在第 \(i\) 个位置前且比 \(P_i\) 大的数有 \(cnt_i\) 个,最终收敛的条件为 \(\max\{cnt_1,cnt_2,\dots,cnt_n\} \le k\)。

考虑一次交换中 \(cnt\) 数组的变化,由于在 \([1,i-1]\) 区间的贡献对于 \(i\) 和 \(i+1\) 是可以直接交换的,我们只需要考虑 \(P_i\) 对 \(P_{i+1}\) 的贡献即可:

  1. \(P_i > P_{i+1}\),则交换后的 \(cnt_i\) 会少了原来 \(P_i\) 的贡献,故先交换,然后 \(cnt_i=cnt_i-1\);

  2. \(P_i < P_{i+1}\),则交换后的 \(cnt_{i+1}\) 会多了原来 \(P_{i+1}\) 的贡献,故先交换,然后 \(cnt_{i+1}=cnt_{i+1}+1\)。

我们肯定不会对第二种情况进行交换,而对于第一种情况,我们也只会对原来 \(cnt_{i+1}>k\) 的位置进行交换,进一步考虑,发现第一种情况等价于 \(cnt_i < cnt_{i+1}\),故交换的条件为:\(cnt_i < cnt_{i+1}\) 且 \(cnt_{i+1}>k\)。

接下来考虑从 \(P'\) 反着交换回 \(P\) 的情况,相当于前面的逆运算,我们设在第 \(i\) 个位置前且比 \(P_i\) 大的数有 \(cnt'_ i\) 个,则交换的条件为 \(cnt'_ i + 1 > cnt'_ {i+1}\) 且 \(cnt'_ i + 1 > k\),又因为 \(P'\) 一定是已经收敛的数组,所以 \(cnt'_ i\) 一定不大于 \(k\),故条件可进一步简化为 \(cnt'_ i = k\)。

每次交换相当于把这个数往后挪一位并加一,所以我们从后往前算方案数更方便。

对于最后一个满足 \(cnt'_ i = k\) 的 \(i\) ,它往后挪多少位都是可以的,而对于前面的,在它挪到上一个 \(cnt'_ i = k\) 现在所在的位置之前,显然也是可以的,而因为挪的过程中它会自增 \(1\),所以前面来的数一定不会小于后面的数,所以在此时交换也是合法的。综上,对于每一个满足 \(cnt'_ i = k\) 的 \(i\),都能随意往后挪动,至多可以挪动 \(n - i\) 次,故一共有 \(n - i + 1\) 中选择,所以答案为 \(\prod\limits_{cnt'_ i=k}(n-i+1)\)。

对于求 \(cnt'_ i\),直接遍历是 \(O(n^2)\) 的,使用树状数组是 \(O(n\log n)\) 的,都可以通过本题(应该没人会在这里写分块啥的吧)。

标签:cnt,排列,对于,题解,交换,arc167,考虑,收敛
From: https://www.cnblogs.com/BINYU/p/17962537

相关文章

  • AT_agc054_c 题解
    题意给定\(k\)和一个排列\(P'\),问有多少个排列\(P\)以最少步数交换相邻两个元素来进行收敛,最终的排列可能是\(P'\),一个排列是收敛的当且仅当对于每一个数,在该数前且比这个数大的数的个数不超过\(k\)个。思路考虑正向的让一个排列收敛,我们设在第\(i\)个位置前且比\(P......
  • P9754 题解
    题意不难理解,不多赘述。思路首先考虑对于性质A的情况,我们可以这样做:定义一个代表变量的结构体,里面存几个参数:首先肯定要存种类(\(type\))和名称(\(name\)),其次为了方便,我们把该变量的大小(\(siz\)),起始位置(\(fir\))和对齐要求(\(mx\))也存了。操作二\(type\),\(name\),\(siz\)和\(m......
  • AT_cf17_final_j 题解
    题意给定一棵既有点权也有边权的树,构造一个完全图,图中两点间边的边权为树中两点点权之和加上两点间的距离,求该图的最小生成树。思路发现完全图总边数太大,考虑减少边数。这里有一个性质:如果在一个图中选取任意个联通的边集,使得它们的并为全集,则整个图的最小生成树中的边一定在......
  • [AGC022F] Checkers 题解
    题目链接点击打开链接题目解法很妙的题!!!考虑\(x\)是无穷大的数,所以可以认为\(x^i\)的系数是单独的一项,不会和\(x^j(j\neqi)\)合并所以问题转化成了:每个数初始是\(x^i\)(\(x\)可以理解是元),进行题目中的操作,问最后形成的\(n\)次多项式的个数由\(B\)向\(A\)连边,这......
  • CF1006E Military Problem 题解
    CF1006EMilitaryProblem题解题意给定一颗有\(n\thinspace(2\leqn\leq2\times10^5)\)个节点的树,树根为\(1\)。对于每个节点\(i\thinspace(2\leqi\leqn)\)都有它的父节点\(p_i\),并且每个节点的子节点都是按从小到大的顺序排列的的。有\(q\thinspace(1......
  • 【题解】CatOJ C0458C 滑动窗口定期重构
    标题trick的名字我也不知道是什么,就这样吧。link。首先有显然的dp式子:\(f(i)=\min\{f(j)\times\max\{a_{j+1},\dots,a_i\}\}\)。考虑怎么去优化它。有显然的\(\mathcalO(n\logn)\):考虑线段树优化dp。用增的单调栈维护\(a\),若每次弹出顶部一个下标\(p\),则\([p+1,i......
  • 1.11模拟赛 T1题解
    简要题意\(n\le10^3,\sumK_i\le3\times10^5\)思路首先容易想到一个暴力DP,\(f_{l,r,x}\)表示区间中最大值为\(x\)的最大值稍微想亿下可以发现如果这个位置选的不是区间最大值的话,答案一定不优所以我们可以直接\(f_{l,r}\)DP转移,但复杂度还是没变,我们把柿子列出来\(......
  • AT_joisc2018_b 题解
    AT_joisc2018_b题解传送门题意有一个以原点为中心的正方形,有\(n(n\le100)\)条不在正方形内部的线段,你需要画一些不在正方形内部的线段,使得这些线段可以把正方形围起来,要求最小化你画的线段的长度和。思路我们需要画出一条闭合折线,并且能够把正方形包围。考虑我们一定是......
  • 1.11模拟赛 T2题解
    简要题意每个点有一定概率向前面的点连边,求两点之间距离的期望思路推柿子code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineN1000005intn,m,u,v;constintmod=1e9+7;inta[N],sum[N],c[N],dep[N],s[N],f[N],g[N],h[N];intksm(intx......
  • P4103 [HEOI2014] 大工程 题解
    题目链接:大工程先考虑只有一次查询,很显然我们可以暴力树上dp处理出答案。对于每个节点而言,有:容易看出类似点分治逐个遍历子树计算前面一堆子树对后面子树的贡献思想,我们可以很容易的知道:对于路径总和,显然多了一段新的贡献,这段贡献为当前关键点和前面点多的一段\(2\)号路......