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; }
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; }
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); }
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; }
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; }
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)); } }