QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#466880#7689. Flipping CardsWater_OR#WA 1ms5656kbC++172.1kb2024-07-08 11:33:462024-07-08 11:33:46

Judging History

你现在查看的是最新测评结果

  • [2024-07-08 11:33:46]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:5656kb
  • [2024-07-08 11:33:46]
  • 提交

answer

#include <bits/stdc++.h>

size_t n;

typedef std::pair<int, int> two;
two input_array[300005];
int worth_low[300005], worth_high[300005];

inline bool check(int mid) {
  int counter_low = 0, counter_high = 0;
  // std::cout << "# " << mid << "\n|";
  for (size_t i = 0; i < n; ++i) { 
    if (input_array[i].first < mid) { ++counter_low; }
    if (input_array[i].first <= mid) { ++counter_high; }
    if (input_array[i].first < mid && input_array[i].second >= mid) { worth_low[i] = 1; }
    if (input_array[i].first >= mid && input_array[i].second < mid) { worth_low[i] = -1; }
    if (input_array[i].first <= mid && input_array[i].second > mid) { worth_high[i] = 1; }
    if (input_array[i].first > mid && input_array[i].second <= mid) { worth_high[i] = -1; }
    // std::cout << " " << worth[i];
  }
  // std::cout << "\n| " << counter << "\n";
  for (size_t i = 1; i < n; ++i) { worth_low[i] += worth_low[i - 1]; worth_high[i] += worth_high[i - 1]; }
  int min_worth_low = 0, min_worth_high = 0;
  for (size_t i = 0; i < n; ++i) {
    if (counter_low - n / 2 <= worth_low[i] - min_worth_low && worth_high[i] - min_worth_high <= counter_high - n / 2) { return true; }

    min_worth_low = std::min(min_worth_low, worth_low[i]);
    min_worth_high = std::min(min_worth_high, worth_high[i]);
  }
  return false;
}

inline void solve() {
  size_t *index_array;
  index_array = new size_t[n];
  for (size_t i = 0; i < n; ++i) { index_array[i] = i; }
  std::sort(index_array, index_array + n, [=](const size_t &x, const size_t &y) { return input_array[x].first < input_array[y].first; });

  int answer = input_array[index_array[n / 2]].first;

  size_t length = INT32_MAX - answer;
  while (length > 0) {
    size_t half = length - (length >> 1);
    int mid = answer + half;
    if (check(mid)) {
      answer = mid;
      length = length - half;
    } else {
      length = half - 1;
    }
  }
  std::cout << answer << std::endl;
}

signed main() {
  std::cin >> n;
  for (size_t i = 0; i < n; ++i) {
    std::cin >> input_array[i].first >> input_array[i].second;
  }
  solve();
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 5644kb

input:

5
3 6
5 2
4 7
6 4
2 8

output:

6

result:

ok 1 number(s): "6"

Test #2:

score: 0
Accepted
time: 1ms
memory: 5656kb

input:

1
2 1

output:

2

result:

ok 1 number(s): "2"

Test #3:

score: -100
Wrong Answer
time: 1ms
memory: 5548kb

input:

1
212055293 384338286

output:

453983836

result:

wrong answer 1st numbers differ - expected: '384338286', found: '453983836'