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