Exemple #1
0
//-----------------------------------------------------------------------------
int binarySearchForFreePlace(
    const FenwickTree& array_of_sums,
    int left_border,
    int right_border) {
  // Left border inclusive, Right border not inclusive
  if (right_border == 0 || array_of_sums.sum(left_border, right_border - 1) == 
      right_border - left_border) {
    return -2;  // Later -2 + 1 -> -1
  }
  while (right_border - left_border > 1) {
    int middle = left_border + (right_border - left_border) / 2;
    if (array_of_sums.sum(middle, right_border - 1) == 
        right_border - middle) {
      right_border = middle;
      continue;
    }
    if (array_of_sums.sum(left_border, middle - 1) ==
        middle - left_border) {
      left_border = middle;
      continue;
    }
    right_border = middle;
  }
  return left_border;
}
	rep(v, n)
	{
		int d = v + 1 - s, u = 0;
		if(d > 0)
		{
			int i = cnt.find(d);
			u = tot.sum(i) + (d - cnt.sum(i)) * (i + 1);
		}
		ans = min(ans, t + u);
		for(auto x : ord[v]) s--, t -= x, cnt.add(x, 1), tot.add(x, x);
	}
Exemple #3
0
int main(int argc, char *argv[])
{
    int A[MAXN + 16];
    vector<int> AA;
    for (int i = 1; i <= MAXN; i++)
    {
        A[i] = i;
        AA.push_back(i);
    }

    FenwickTree ft;
    ft.prepare(AA);

    for (int i = 1; i <= MAXN; i++)
        add(i, A[i]);

    for (int cases = 1; cases <= 100; cases++) {
        int L = rand() % MAXN + 1, R = rand() % MAXN + 1;
        if (L > R) swap(L, R);
        cout << "S[" << setw(4) << right << L << ", ";
        cout << setw(4) << right << R << "] => ";
        cout << get(R) - get(L - 1) << " = ";
        cout << ft.sum(L - 1, R - 1);
        cout << " = " << (R + L) * (R - L + 1) / 2 << '\n';
    }

    return 0;
}
int main ()
{
    size_t n;
    cin >> n;
    FenwickTree tr (n);
    int res = 0;
    for (size_t i = 0; i < n; ++i)
    {
        int cur;
        cin >> cur;
        tr.modify (cur - 1, 1);
        res += tr.sum (cur, n - 1);
    }

    cout << res;

    return 0;
}
 i64 sum(int pos){
   return delta.sum(pos) * pos - delta_i.sum(pos);
 }