洛谷 P1908 逆序對

2022-05-21 20:48:09 字數 1458 閱讀 9721

p1908 逆序對

法一:歸併排序求逆序對(不好理解,記一下)

(此處用的是從大到小排序,畢竟求的是序列中ai>aj且i

在二路歸併的時候,設l<=i<=mid,mid+1<=j<=r,要歸併的是a[l]到a[mid]還有a[mid+1]到a[r]。只考慮a[l]到a[r]間產生的逆序對。

在某時刻,要將a[i]或a[j]放入a1[k]位置時,顯然i<=k<=j,當a[i]<=a[j]時,不產生逆序對;而a[i]>a[j]時,a[j]放在a[i]之前,a[l]到a[mid]中比a[i]大的數都比a[j]大,這樣的數有mid-i+1個,將a[j]放在a[i]前面的話,逆序數要加上mid+1-i。

#includeint a[40001];

int a1[40001];

int num,n;

void merge(int start,int mid,int end)

}while(k1<=mid)

a1[k++]=a[k1++];

while(k2<=end)

a1[k++]=a[k2++];

for(int i=start;i<=end;i++)

a[i]=a1[i];

}void merge_sort(int start,int end)

return sum1;

}int main()

sort(a+1,a+n+1);

int id=1;

co[a[1].num]=1;

for(i=2;i<=n;i++)

//至此為止是離散化,就是使各個數字間差更小並且不改變順序

//例如1,1,2,7,5,9,11可以離散化為1,1,2,4,3,5,6

int ans=0;

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

printf("%d",ans);

return 0;

}

法三:其他做法

這題不用樹狀陣列的n^2演算法是這樣的

首先我們把序列存進q陣列裡,再開乙個陣列c,然後倒著掃瞄一遍陣列

對於q[i],我們從1~i橫掃一遍c陣列

如果c[j]為真,說明 j 這個值比

i 這個值先被掃到,即原序列q中, j 在 i 後面

而且我們是從1~i掃的c陣列 所以毋庸置疑的j的值比i小

哈哈滿足逆序對條件 於是ans+=c[j]

完成之後c[i]++最後輸出ans

這題不用樹狀陣列的n^2演算法是這樣的

首先我們把序列存進q陣列裡,再開乙個陣列c,然後倒著掃瞄一遍陣列

對於q[i],我們從1~i橫掃一遍c陣列

如果c[j]為真,說明 j 這個值比

i 這個值先被掃到,即原序列q中, j 在 i 後面

而且我們是從1~i掃的c陣列 所以毋庸置疑的j的值比i小

哈哈滿足逆序對條件 於是ans+=c[j]

完成之後c[i]++最後輸出ans

洛谷 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個數...