[AGC014F]Strange Sorting

Posted StaroForgin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[AGC014F]Strange Sorting相关的知识,希望对你有一定的参考价值。

Strange Sorting

题解

首先可以发现,是一定有解的。
我们在第一次移动后肯定可以使得 n n n在最后一个位置,第二次移动后一定可以使得 n − 1 n-1 n1在倒数第 2 2 2个位置。我们每次操作肯定可以使得某些数回到它原本应该在的位置,所以是一定有解的。

根据上面的考虑,我们可以发现,我们不妨倒着来考虑,因为较小的数不会对较大数的相对顺序产生影响,也不会影响其是否能够移动。所以当我们 ( i , n ] (i,n] (i,n]的已经有序后, i i i在那里都不会产生影响。
那我们可以定义 t i t_i ti表示我们使得区间 [ i , n ] [i,n] [i,n]变得有序的最小操作次数。
显然, t i + 1 ⩽ t i ⩽ t i + 1 + 1 t_i+1\\leqslant t_i\\leqslant t_i+1+1 ti+1titi+1+1,但我怎么判断 t i t_i ti该取那一个呢?显然,根据 i i i t i + 1 t_i+1 ti+1时刻的位置呗。
求出 i i i t i + 1 t_i+1 ti+1时刻的位置,当然就需要知道 t i + 1 − 1 t_i+1-1 ti+11时序列的状况。我们记 [ i , n ] [i,n] [i,n] t i − 1 t_i-1 ti1时刻的序列首位为 f i f_i fi
那么显然,那个时刻 i , i + 1 , f i + 1 i,i+1,f_i+1 i,i+1,fi+1的相对关系有 3 3 3种可能, i , f i + 1 , i + 1 i,f_i+1,i+1 i,fi+1,i+1 f i + 1 , i , i + 1 f_i+1,i,i+1 fi+1,i,i+1 f i + 1 , i + 1 , i f_i+1,i+1,i fi+1,i+1,i
只有第二种可能会使得 t i = t i + 1 t_i=t_i+1 ti=ti+1,但即使是 t i + 1 − 1 t_i+1-1 ti+11时刻的序列形状我们也会是不可能维护出来的,但我们知道初始的序列形状啊。
初始序列显然是 i , i + 1 , f i + 1 i,i+1,f_i+1 i,i+1,fi+1的某个排列,我们发现这个排列无论怎么操作都会处于一种循环位移的状态,比如 i , i + 1 , f i + 1 → f i + 1 , i , i + 1 → i , i + 1 , f i + 1 i,i+1,f_i+1\\rightarrow f_i+1,i,i+1\\rightarrow i,i+1,f_i+1 i,i+1,fi+1fi+1,i,i+1i,i+1,fi+1
事实上,在 f i + 1 f_i+1 fi+1处在首位时,能够使得 i i i f i + 1 f_i+1 fi+1 i + 1 i+1 i+1之间的初始排序只有 3 3 3 f i + 1 , i , i + 1 f_i+1,i,i+1 fi+1,i,i+1 i , i + 1 , f i + 1 i,i+1,f_i+1 i,i+1,fi+1 i + 1 , f i + 1 , i i+1,f_i+1,i i+1,fi+1,i
所以我们通过这三者的初始位置就可以进行转移了。

时间复杂度 O ( n ) O\\left(n\\right) O(n)

源码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200005
#define lowbit(x) (x&-x)
#define reg register
#define pb push_back
#define mkpr make_pair
#define fir first
#define sec second
typedef long long LL;
typedef unsigned long long uLL; 
typedef long double Ld;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;
const int mo=998244353;
const int mod=1e5+7;
const int inv2=499122177;
const double jzm=0.999;
const int zero=2000;
const int n1=150;
const int orG=3,ivG=332748118;
const double Pi=acos(-1.0);
const double eps=1e-8;
template<typename _T>
_T Fabs(_T x)return x<0?-x:x;
template<typename _T>
void read(_T &x)
	_T f=1;x=0;char s=getchar();
	while(s>'9'||s<'0')if(s=='-')f=-1;s=getchar();
	while('0'<=s&&s<='9')x=(x<<3)+(x<<1)+(s^48);s=getchar();
	x*=f;

template<typename _T>
void print(_T x)if(x<0)putchar('-'),print(-x);if(x>9)print(x/10);putchar(x%10+'0');
LL gcd(LL a,LL b)return !b?a:gcd(b,a%b);
int add(int x,int y,int p)return x+y<p?x+y:x+y-p;
void Add(int &x,int y,int p)x=add(x,y,p);
int qkpow(int a,int s,int p)int t=1;while(s)if(s&1)t=1ll*t*a%p;a=1ll*a*a%p;s>>=1;return t;
int n,a[MAXN],pos[MAXN],f[MAXN],t[MAXN];
signed main()
	read(n);for(int i=1;i<=n;i++)read(a[i]),pos[a[i]]=i;
	t[n]=0;f[n]=n;
	for(int i=n-1;i>0;i--)
		if(!t[i+1])
			if(pos[i]<pos[f[i+1]])f[i]=i;
			else t[i]=1,f[i]以上是关于[AGC014F]Strange Sorting的主要内容,如果未能解决你的问题,请参考以下文章

学习笔记[AGC044C] Strange Dance

ACM Strange fuction

如何在为音频会议混合音频时自动增益控制 (AGC)

HDU.2899.Strange fuction(牛顿迭代)

如何对包含嵌套 JSON 字符串的 NSSArray 进行排序?

AGC025简要题解