Submission #500676

# Submission time Handle Problem Language Result Execution time Memory
500676 2021-12-31T18:40:32 Z 600Mihnea Sails (IOI07_sails) C++17
70 / 100
1000 ms 2308 KB
#include <bits/stdc++.h>

using namespace std;

#define int long long

int gauss(int x) {
  return x * (x + 1) / 2;
}

struct Data {
  int total;
  int need;
};

bool operator < (Data a, Data b) {
  return a.total < b.total;
}

const int N = (int) 1e5 + 7;
const int INF = (int) 1e18;
int n;
int cnt[N];
Data guys[N];

signed main() {
  ios::sync_with_stdio(0); cin.tie(0);
  //freopen ("input", "r", stdin);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> guys[i].total >> guys[i].need;
  }
  sort(guys + 1, guys + n + 1);

  for (int i = 1; i <= n; i++) {
    int total = guys[i].total;
    int need = guys[i].need;
    /// cnt e in ordine ordine descrescatoare
    int L = total - need + 1;
    int R = total;
    int cntL = cnt[L];
    int Lfirst = L, Llast = L;
    /// binary search to find them
    {
      int low = 1, high = L;
      while (low <= high) {
        int mid = (low + high) / 2;
        if (cnt[mid] == cnt[L]) {
          Lfirst = mid;
          high = mid - 1;
        } else {
          low = mid + 1;
        }
      }
    }
    {
      int low = L, high = total;
      while (low <= high) {
        int mid = (low + high) / 2;
        if (cnt[mid] == cnt[L]) {
          Llast = mid;
          low = mid + 1;
        } else {
          high = mid - 1;
        }
      }
    }
    int cntOfL = Llast - L + 1;
    int firstActual = Lfirst;
    int lastActual = Lfirst + cntOfL - 1;
    for (int j = firstActual; j <= lastActual; j++) {
      cnt[j]++;
    }
    for (int j = Llast + 1; j <= R; j++) {
      cnt[j]++;
    }
    for (int j = 2; j <= total; j++) {
      assert(cnt[j - 1] >= cnt[j]);
    }
  }

  int total = 0;

  for (int i = 1; i < N; i++) {
    total += gauss(cnt[i] - 1);
  }

  cout << total << "\n";

  return 0;
}

Compilation message

sails.cpp: In function 'int main()':
sails.cpp:41:9: warning: unused variable 'cntL' [-Wunused-variable]
   41 |     int cntL = cnt[L];
      |         ^~~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 0 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 332 KB Output is correct
2 Correct 26 ms 1076 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 105 ms 740 KB Output is correct
2 Correct 67 ms 800 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 406 ms 988 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 769 ms 1536 KB Output is correct
# Verdict Execution time Memory Grader output
1 Execution timed out 1089 ms 2188 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 1099 ms 2012 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 1099 ms 2308 KB Time limit exceeded
2 Halted 0 ms 0 KB -