就是这个鬼脚图!!!
传送门:https://nanti.jisuanke.com/t/17353
然鹅,我压根没看出来是交换位置,准确来说,我,,理解题理解了好久,然后交换位置?不存在的,考试的时候完全不知道怎么做!!!然后我的小伙伴们全A了,哈哈(强颜欢笑
题是不错的,可想不出来啊?
总之很巧妙,下次可以考虑一下交换模拟!
然后从一个数列弄成有序数列的最少交换次数即是
求逆序对
很巧妙的一个题,补了一下思维的盲区?
T1这样还是很新鲜的
题解这么说的:
........没错,一条横线就是一次对相邻两个元素的交换操作
.........考察了选手洞察游戏本质的能力........
还是要多思考,嗯?
计蒜客也许和我犯冲,,至今没A,不过考试数据是过了的,哪里不对,竟格式错误?
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
inline int wread(){
char c=getchar ();int flag=1,wans=0;
while (c<'0'||c>'9'){if (c=='-') flag=-1;c=getchar ();}
while (c>='0'&&c<='9'){wans=wans*10+c-'0';c=getchar ();}
return wans*=flag;
}
inline void OUT (int x){
if (x>9) OUT(x/10);
putchar (x%10+'0');
}
inline void init (){
freopen ("draw.in","r",stdin);
freopen ("draw.out","w",stdout);
}
int n,m;
int a[1000006];
int ans[1000006];
int pr;
int lin[1000006];
void merge_sort_W (int l,int r){
if (l==r) return ;
int mid (l+r>>1);
merge_sort_W (l,mid);
merge_sort_W (mid+1,r);
int i(l),j(mid+1),k(l);
while (i<=mid && j<=r){
if (ans[i]<=ans[j])
lin[k++]=ans[i++];
else {
lin[k++]=ans[j++];
pr+=mid-i+1;
}
}
while (i<=mid)
lin[k++]=ans[i++];
while (j<=r)
lin[k++]=ans[j++];
for (int i(l);i<=r;++i)
ans[i]=lin[i];
return ;
}
int main (){
// init ();
n=wread();m=wread();
for (int i(1);i<=m;++i){
a[i]=wread(),ans[i]=i;
}
for (int i(1);i<=m;++i){
swap(ans[a[i]],ans[a[i]+1]);
}
for (int i(1);i<=n;++i){
printf("%d ",ans[i]);
}puts("");
merge_sort_W (1,n);
printf("%d",pr);
return 0;
}