思考方式的Change 鬼腳圖

就是這個鬼腳圖!!!

傳送門: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;
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章