题目描述
题解
首先知道从初状态转移到末状态和从末状态转移到初状态是一样的,那么我们可以构造出末状态,然后计算转移到初状态的最小代价。
可以知道转移的代价一定为不在应该在的位置上的人的数量,那么就要使最多的人在位置上。考虑到环的情况,我们假设对于一个数i的目标是将它放到i这个位置,那么如果有若干个数距离各自的目标需要移动的步数相等的话,说明令其中的一个数在位置上,那么其他的数也在位置上。假设这些数是一个组,找出有最多人数的那个组,那么ans=n-组内人数。
注意没有规定是顺时针还是逆时针,所以要正反做两次。
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int max_n=5e4+5;
int n,L,R,t,ans;
int a[max_n],b[max_n],l[max_n],r[max_n],pre[max_n],nxt[max_n];
bool flag,vis[max_n];
int cnt1[max_n],cnt2[max_n];