可以用一下二分


遍历第一名到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();
}