可以用一下二分
遍历第一名到D的前一名。对第i个遍历到的人,二分找他能被D超过的最大新成绩。找到一个成绩就删去一个成绩,同时用计数器sum去记录能被D超过的人数,D超过了几个人就上升几名。D的成绩直接取原成绩加最大的新成绩就好,原成绩排名在D后面的再怎么加也不可能超过D。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
int s[maxn], n, D, ds;
vector<int> p;
bool check(int x, int mid) {
return s[x] + p[mid] < ds;
}
void solve() {
ds = s[D] + p[0];// 小D之后的成绩
p.erase(p.begin());
int sum = 0;// 比小D小的
n --;
for(int i = 1; i <= D - 1; i ++ ) { // 第一名到D
int l = 0, r = n - 1;
int mid;
while(l < r) {
mid = (l + r) / 2;
if(check(i, mid)) {
r = mid;
}else {
l = mid + 1;
}
}
if(s[i] + p[l] <= ds) {
sum ++;
p.erase(p.begin() + l);
n --;
}
}
cout << D - sum << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> D;
for (int i = 1; i <= n; i ++) {
cin >> s[i];
}
for (int i = 1; i <= n; i ++) {
int a; cin >> a;
p.push_back(a);
}
solve();
}