就是這個鬼腳圖!!!
傳送門: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;
}