一開始竟然妄想用\(n^2\)的演算法過這題,然而這是不可能的
所以只好寫歸併排序來求逆序対惹
比如將下面兩個區間排序
3 4 7 9 1 5 8 10
首先將右區間的\(1\)取出,放到\(r_k\)中,此時 1 是比每個\(a_i\)中的元素都小,也就是說此時\(i\)的指標指向\(a_1\)的位置,此刻得到的逆序對的數量為\(4\);\(r_k\)= 1;
以此類推,直到進行完歸併排序,每次合併都會求出逆序對的數目,即\(mid-i+1\),最後每次將\(ans\)加上\(mid−i+1\)即可得到
直接上**
#includeusing namespace std;
int n;
int a[500010],t[500010];
long long ans=0;//存逆序對的個數
inline int read()
while(c>='0'&&c<='9')
return tot*f;
}inline void midsort(int l,int r)//歸併排序
} while(i<=mid)t[k++]=a[i++];
while(j<=r)t[k++]=a[j++];//把剩下的合進去
for(int i=l;i<=r;i++)a[i]=t[i];//複製一遍,以便下一波操作
}int main()
洛谷 P1908 逆序對
題目描述 貓貓tom和小老鼠jerry最近又較量上了,但是畢竟都是成年人,他們已經不喜歡再玩那種你追我趕的遊戲,現在他們喜歡玩統計。最近,tom老貓查閱到乙個人類稱之為 逆序對 的東西,這東西是這樣定義的 對於給定的一段正整數序列,逆序對就是序列中ai aj且i var i,n,t longint ...
洛谷P1908 逆序對
貓貓tom和小老鼠jerry最近又較量上了,但是畢竟都是成年人,他們已經不喜歡再玩那種你追我趕的遊戲,現在他們喜歡玩統計。最近,tom老貓查閱到乙個人類稱之為 逆序對 的東西,這東西是這樣定義的 對於給定的一段正整數序列,逆序對就是序列中ai aj且i輸入格式 第一行,乙個數n,表示序列中有n個數。...
洛谷 P1908 逆序對
貓貓tom和小老鼠jerry最近又較量上了,但是畢竟都是成年人,他們已經不喜歡再玩那種你追我趕的遊戲,現在他們喜歡玩統計。最近,tom老貓查閱到乙個人類稱之為 逆序對 的東西,這東西是這樣定義的 對於給定的一段正整數序列,逆序對就是序列中ai aj且i 輸入格式 第一行,乙個數n,表示序列中有n個數...