long long inversions(It lo, It hi) {
  if (hi - lo < 2) {
    return 0;
  }
  It mid = lo + (hi - lo - 1)/2, a = lo, c = mid + 1;
  long long res = 0;
  res += inversions(lo, mid + 1);
  res += inversions(mid + 1, hi);
  typedef typename std::iterator_traits<It>::value_type T;
  std::vector<T> merged;
  while (a <= mid && c < hi) {
    if (*c < *a) {
      merged.push_back(*(c++));
      res += (mid - a) + 1;
    } else {
      merged.push_back(*(a++));
    }
  }
  if (a > mid) {
    for (It it = c; it != hi; ++it) {
      merged.push_back(*it);
    }
  } else {
    for (It it = a; it <= mid; ++it) {
      merged.push_back(*it);
    }
  }
  for (It it = lo; it != hi; ++it) {
    *it = merged[it - lo];
  }
  return res;
}
Exemple #2
0
long long inversions(long start, long end)
{
    long mid;
    
    if (end - start < 2)
        return 0;
    mid = (start + end) / 2;
    return inversions(start, mid) + inversions(mid, end) + merge(start, mid, end);
}
int main() {
  {
    int a[] = {6, 9, 1, 14, 8, 12, 3, 2};
    assert(inversions(a, a + 8) == 16);
  }
  {
    int a[] = {6, 9, 1, 14, 8, 12, 3, 2};
    assert(inversions(8, a) == 16);
  }
  return 0;
}
int main(const int argc, const char* const argv[]) {

  const Input_types mode =
    (argc == 1) ? sin : (argc >= 3) ? s2m(argv[2]) : rdm;
  index_t N;
  try {
    N = (argc >= 2) ? std::stoul(argv[1]) : 0;
  }
  catch (const std::invalid_argument& e) {
    std::cerr << err << " N not a number: \"" << argv[1] << "\"\n";
    return err_N1;
  }
  catch (const std::out_of_range& e) {
    std::cerr << err << " N not in range: \"" << argv[1] << "\"\n";
    return err_N2;
  }

  std::cout << "Mode = " << m2s(mode) << "." << std::endl;
  if (mode != sin) std::cout << "N = " << N << "." << std::endl;

  vec_t V;
  try { V.reserve(N); }
  catch(const std::bad_alloc& e) {
    std::cerr << err << " N too large for memory: " << argv[1] << "\n";
    return err_N3;
  }

  switch (mode) {
    case sin :
      for (int_t i; std::cin >> i; ++N) V.push_back(i);
      std::cout << "N = " << N << "." << std::endl;
      break;
    case rdm :
      std::srand(std::time(0));
      for (index_t i = 0; i != N; ++i) V.push_back(std::rand());
      break;
    case ord :
      for (index_t i = 0; i != N; ++i) V.push_back(i);
      break;
    case invord : {
      index_t i = N;
      while (i != 0) V.push_back(--i);
      break;
    }
  }

  std::cout << "Inversion count by definition: "; std::cout.flush();
  auto start = std::chrono::system_clock::now();
  std::cout << inversions_bydef(V) << "\n";;
  std::cout << std::chrono::duration<double,std::milli>(std::chrono::system_clock::now() - start).count() << "ms" << std::endl;
  std::cout << "Fast inversion count: "; std::cout.flush();
  start = std::chrono::system_clock::now();
  std::cout << inversions(V, 0, V.size()) << "\n";
  std::cout << std::chrono::duration<double,std::milli>(std::chrono::system_clock::now() - start).count() << "ms" << std::endl;
}
Exemple #5
0
long int inversions(long int arr[],long int high)
{
	if(high<1)
		return 0;
	 
	long int mid=(high+1)/2;
	long int left[mid];
	long int right[high-mid+1];
	 
	long int i,j;
	for(i=0;i<mid;i++)
		left[i]=arr[i];
	 
	 
	for(i=high-mid,j=high;j>=mid;i--,j--)
		right[i]=arr[j];
	 
	return inversions(left,mid-1) + inversions(right,high-mid) + merge(arr,left,right,mid,high-mid+1);
 
}
Exemple #6
0
int main(void)
{
    long i, n;

    while(scanf("%ld", &n) != EOF && n > 0) {
        a = malloc(sizeof(*a) * n);
        aa = malloc(sizeof(*a) * n);
        for (i = 0; i < n; i++)
            scanf("%lld", &a[i]);
        printf("%lld\n", inversions(0, n));
        free(a);
        free(aa);
    }

    return 0;
}
Exemple #7
0
int main()
{
    printf("Asf");
    FILE *fp;
    int nums[100000];
    int nums_index=0;
    fp = fopen("/home/vamshi/int.txt","r");

    int i;
    int temp_num[10];
    int temp_index=0;

    int a;
    while((a = (int)getc(fp))!=EOF)
    {
        if(a==13)
        {
            int num = 0;
            for(i=0;i<temp_index;i++)
            {
                num = num + (temp_num[i]* pow(10,temp_index-i-1));
            }
            nums[nums_index++] = num;
            temp_index = 0;
            a = (int)getc(fp);
        }
        else
        {
            temp_num[temp_index++] = a-48;
        }
    }
    int num = 0;
    for(i=0;i<temp_index;i++)
    {
        num = num + (temp_num[i]* pow(10,temp_index-i-1));
    }

    nums[nums_index++] = num;
    printf("Started.......!");
    printf("ld",inversions(nums,100000));
    return 1;
}
Exemple #8
0
int main() {
    int t;
    scanf("%d\n",&t);
    
    while(t--)
    {
        int n;
        scanf("%d\n",&n);
        
        long int *arr=(long int*)malloc(sizeof(long int)*n);
        for(int i=0;i<n;i++)
            scanf("%ld\n",&arr[i]);
        
        printf("%ld\n",inversions(arr,n-1));
        
        free(arr);
    }
    
    return 0;
}
int main() {
  {
    vector<int> t = {4, 6, 1, 2, 3, 9, 11, 7, 8, 101, 33, 22, 121, 24, 4};
    EXPECT_EQ(inversionsNaive(t), inversions(t));
  }
}