在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
28
ll a[500005],tem[500005],ans; //a為要求的序列,tem是臨時存放的陣列void
divide
(int low,int high)
//子串行
else
tem[k++]=a[i++];
}while(i<=mid) tem[k++]=a[i++]; //將剩下的存入陣列
while(j<=high) tem[k++]=a[j++];
for(int t=low;t<=high;t++) a[t]=tem[t]; //更新a陣列
return;
}
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
4041
4243
4445
4647
4849
5051
5253
5455
5657
#include#include
#include
using
namespace
std;
#define crl(a) memset(a,0,sizeof(a))
#define lowbit(x) (x&(-x))
#define inf 0xffffffff
typedef
long
long ll;
const
int n=5e5+5;
int tr[n],b[n],n;
typedef pair int> pp;
pp a[n];
void
update
(int x)
//插入x
}int
query
(int x)
//查詢序列中比x小的有多少個
return sum;
}int
main
()sort(a+1,a+n+1);
for(int i=1;i<=n;i++) b[a[i].second]=i; //離散化結束,b陣列即是離散化後的陣列
ll ans=0;
for(int i=1;i<=n;i++)
cout
}return0;}
求陣列的逆序數
題目 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。現在,給你乙個n個元素的序列,請你判斷出它的逆序數是多少。比如 1 3 2 的逆序數就是1。方法1 o n 2 這個就不說了。方法2 借助歸併排序達到o...
分治演算法 求陣列逆序數
題目 在陣列中的兩個數字如果前面乙個數字大於後面乙個數字 則這兩個數字組成乙個逆序對 輸入乙個陣列 求這個陣列中逆序對的個數 先把陣列分割成子陣列 先統計出子陣列內部的逆序對的數目 然後再統計出兩個相鄰子陣列之間的逆序對的數目 統計逆序對的過程中 還需要對陣列進行排序 這類似與歸併排序 演算法的時間...
輸出乙個數列的逆序數
1,這個問題演算法導論講歸併排序時,提到過。找到乙個實現 思路還是蠻清晰的。核心 對於兩個有序序列,找逆序對,遍歷一次即可。2,實現 include include using namespace std int inv int data,int n ret j tmp i j data i 不是逆...