Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <vector>
- #include <iostream>
- using namespace std;
- unsigned long long n, m, a, b, summ = 0;
- unsigned int cur = 0;
- unsigned long long ch_l[10000000], ch_r[10000000];
- void Merge(unsigned int l, unsigned int m, unsigned int r, unsigned int *a, unsigned int *buffer) {
- unsigned int i = 0, right = m, left = l;
- while ( left != m && right != r) {
- if (*(a + left) < *(a + right)){
- buffer[i] = (*(a + left));
- // ch_l[*(a+left)]+=m-left;
- ch_r[*(a+left)]+=right-m;
- left++; i++;
- // if (left-1 != l)
- // summ += (m - left)*(right - m);
- }
- else{
- buffer[i] = (*(a + right));
- // cout << *(a + left) << " "<< *(a + right) << " " << (m - left)<<"*" <<(right - m)<<" "<<endl;
- // if (right == n/2)
- // summ += (m - left)*(right+1 - m);
- //else
- ch_l[*(a+right)]+=m-left;
- //ch_r[*(a+right)]+=right-m;
- // summ += (m - left)*(right - m);
- right++;i++;
- // if (right-1 != r)
- }
- // for(int i = 0; i < n; ++i)
- // cout << *(a + i);
- // cout << endl;
- }
- if (left != m) {
- while (left != m) {
- buffer[i] = (*(a + left));
- ch_r[*(a+left)]+=right-m;
- i++;
- left++;
- }
- }
- else {
- while (right != r){
- buffer[i] = (*(a + right));
- i++;
- ch_l[*(a+right)]+=m-left;
- //ch_r[*(a+right)]+=right-m;
- right++;
- }
- }
- for (unsigned int u = 0; u < r - l; u++) {
- *(a + l + u) = *(buffer + u);
- }
- }
- void MergeSort( unsigned int l, unsigned int r, unsigned int *a, unsigned int *buffer) {
- if (r - l <= 1) return;
- int m = (l + r) / 2;
- MergeSort(l, m, a, buffer);
- MergeSort(m, r, a, buffer);
- Merge(l, m, r, a, buffer);
- }
- int main() {
- freopen("text.in", "r", stdin);
- // freopen("mega.out", "w", stdout);
- cin >> n;
- unsigned int x;
- vector <unsigned int> vec;
- for (int i = 0; i < n; i++) {
- cin >> b;
- vec.push_back(b);
- // cout << vec[i] << " ";
- }
- // cout << endl;
- unsigned int *a;
- a = &vec[0];
- unsigned int bupp[vec.size()];
- unsigned int *buffer;
- buffer = &bupp[0];
- unsigned int l = 0, r = n;
- MergeSort(l, r, a, buffer);
- for (int i = 1; i <= n; i++) {
- summ+= ch_l[i]*ch_r[i];
- cout << i << " " << vec[i-1] << " -> " << ch_l[i] << " " << ch_r[i] << endl;
- }
- // cout << endl;
- cout << summ;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement