简单题。
按照顺序二分一下每一个圆盘跌落的位置,然后进行计算即可。时间复杂度 O ( n log n ) \mathcal O(n\log n) O(nlogn)。
#include <bits/stdc++.h>
#include <bits/extc++.h>
#include <bits/stdtr1c++.h>
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
using namespace __gnu_debug;
using namespace tr1;
const int N = 3e5 + 10;
int r[N], p[N];
signed main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> r[i];
p[0] = 1e9;
for (int i = 1; i <= n; i++)
p[i] = min(p[i - 1], r[i]);
int ed = n + 1;
for (int i = 1; i <= m; i++)
{
int x;
cin >> x;
int l = 1, r = ed - 1, best = -1;
while (l <= r)
{
int mid = l + r >> 1;
if (p[mid] >= x)
best = mid, l = mid + 1;
else
r = mid - 1;
}
if (best == -1)
{
cout << "0\n";
return 0;
}
ed = best;
}
cout << ed << '\n';
return 0;
}