HDU 5821(乙個數列變換成另乙個數列)

2021-07-16 14:20:38 字數 1084 閱讀 3801

a:  4 6  5 9

b:  5 6  9  4

以上兩個數列a和b,問你可以通過交換a中數的位置實現a變成b數列嗎?

解決方法:把a中每個值應該放在位置的左邊寫出,對應如下

a:       4 6 5 9

mov: 4 2 1 3(表示應該放的位置)

然後把(4,2,1,3)排一下序得到1 2 3 4正好與原先遍歷a陣列的循序1 2 3 4相同(即1=1,2=2,3=3,4=4)所以可以實現

那麼本題目則是對於每個query的可交換區間內的座標進行排序,操作完所有的query,如果mov序列可以為(1,2,3,4)則可以實現,則yes,否則no

#include using namespace std;

typedef pairp;

typedef long long ll;

#define inf 0x3f3f3f3f

#define pi acos(-1)

#define max_n 10000

//#define local

int a[1005], b[1005];

int ab[1005];

int vis[1005];

p p[1005];

int main()

for(int i = 1; i <= n; i++)

for(int i = 1; i <= n; i++)}}

for(int i = 0; i < q; i++)

// for(int i = 1; i <= n; i++)

// cout << ab[i] << " ";

// cout << endl;

bool ans = 0;

for(int i = 1; i <= n; i++)

}if(ans)

cout << "no" << endl;

else

cout << "yes" <

輸出乙個數列的逆序數

1,這個問題演算法導論講歸併排序時,提到過。找到乙個實現 思路還是蠻清晰的。核心 對於兩個有序序列,找逆序對,遍歷一次即可。2,實現 include include using namespace std int inv int data,int n ret j tmp i j data i 不是逆...

遞減左旋數列中查詢乙個數

題目 乙個陣列是由乙個遞減數列左移若干位形成的,比如是由克移兩位形成的,在這種陣列中查詢某乙個數。思路 在此序列不斷二分的過程中,由於原序列是乙個遞減序列經過旋轉得到的,將它從任何位置分開,都會得到兩個序列,其中乙個是遞減序列,另乙個可以通過乙個遞減序列通過旋轉得到。這樣在不斷地二分查詢時,我們處理...

演算法題 求乙個數列中的逆序對個數

乙個數列,如果左邊的數大,右邊的數小,則稱這兩個數字乙個逆序對。求出乙個數列中有多少個逆序對。利用歸併排序的過程完成求逆序對問題。已知歸併過程如下 1 首先劃分劃分劃分,一直劃分到不能劃分,即每個組都只有乙個數值。2 然後合併,合併的過程就是每個二劃分排序的過程。3 在合併的時候,開闢乙個輔助陣列,...