QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#535656#6632. Minimize MedianCarameowWA 70ms7760kbC++202.0kb2024-08-28 12:06:582024-08-28 12:06:59

Judging History

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

  • [2024-08-28 12:06:59]
  • 评测
  • 测评结果:WA
  • 用时:70ms
  • 内存:7760kb
  • [2024-08-28 12:06:58]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;

const int N = 1e6 + 10;

int t, n, m, k;
int a[N], cost[N], mn[N];

void init() {
   cin >> n >> m >> k;
   for(int i = 1; i <= n; ++i) cin >> a[i];
   for(int i = 1; i <= m; ++i) cin >> cost[i];
}

int cnt(int med) {
   int ans = 0, tmp = k;
   for(int i = 1; i <= n; ++i) {
      if(a[i] <= med) ans++;
      else {
         int val = a[i] / (med + 1) + 1;
         if(val > m) continue;
         if(tmp >= mn[val]) {
            tmp -= mn[val];
            ans++;
         }
      }
   }
   return ans;
}

int main() {
   cin.tie(0) -> sync_with_stdio(0);
   if(fopen("Task.inp", "r")) {
      freopen("Task.inp", "r", stdin);
      freopen("WA.out", "w", stdout);
   }

   cin >> t;
   while(t--) {
      init();

      vector<int> vt;
      for(int i = 1; i <= m; ++i) {
         while(!vt.empty() && cost[vt.back()] >= cost[i]) {
            vt.pop_back();
         }
         vt.push_back(i);
      }

      int j = (int) vt.size() - 1;
      for(int i = m; i >= 1 ; --i) {
          if(j >= 0 && vt[j] == i) mn[i] = cost[vt[j--]];
          else mn[i] = mn[i + 1];
      }

      for(int i = 1; i <= m; ++i) {
         if(i * i <= m) {
            for(int j = 2; j <= i; ++j) {
               mn[i * j] = min(mn[i * j], mn[i] + mn[j]);
            }
         }
         else {
            for(int j = 2; i * j <= m; ++j) {
               mn[i * j] = min(mn[i * j], mn[i] + mn[j]);
            }
         }
      }

      mn[m + 1] = 1e9;
      for(int i = m; i >= 1; --i) mn[i] = min(mn[i], mn[i + 1]);
      sort(a + 1, a + n + 1);

      int f = 0, l = m, median = a[n / 2 + n % 2];
      while(f <= l) {
         int mid = f + l >> 1;
         if(cnt(mid) >= n / 2 + n % 2) {
            median = mid;
            l = mid - 1;
         }
         else f = mid + 1;
      }

      cout << median << "\n";

      for(int i = 1; i <= n; ++i) mn[i] = 0;
   }
}

詳細信息

Test #1:

score: 100
Accepted
time: 0ms
memory: 7720kb

input:

3
3 5 0
2 5 2
3 2 4 6 13
3 5 3
2 5 3
3 2 4 6 13
3 5 6
2 5 2
3 2 4 6 13

output:

2
2
1

result:

ok 3 number(s): "2 2 1"

Test #2:

score: -100
Wrong Answer
time: 70ms
memory: 7760kb

input:

100000
5 10 5
3 7 1 10 10
11 6 11 6 1 8 9 1 3 1
5 6 51
2 2 2 5 1
42 61 26 59 100 54
5 10 76
7 5 8 4 7
97 4 44 83 61 45 24 88 44 44
5 8 90
1 1 5 1 3
35 15 53 97 71 83 26 7
5 3 52
1 1 3 1 1
22 6 93
5 6 28
6 6 1 3 1
9 31 2 19 10 27
5 8 31
3 6 2 1 2
32 29 13 7 57 34 9 5
5 6 75
3 3 4 5 4
40 56 38 60 17 3...

output:

0
2
0
0
0
0
0
0
3
4
0
0
0
0
1
1
0
0
0
0
1
1
0
2
2
0
0
0
0
0
2
0
0
1
2
2
0
1
0
0
0
0
1
0
2
4
1
1
0
0
2
0
0
7
1
1
0
0
0
1
1
0
1
0
1
0
0
2
1
0
6
3
1
0
1
0
2
0
0
3
0
1
0
1
0
2
0
0
0
0
1
2
1
4
0
0
1
0
0
0
1
2
2
1
2
2
0
1
1
0
0
0
0
0
1
2
1
4
1
0
4
1
2
1
0
0
0
0
1
2
1
0
0
2
3
1
0
1
1
1
0
1
5
0
1
2
0
2
0
0
...

result:

wrong answer 34th numbers differ - expected: '0', found: '1'