这道题如果暴力走 O(n^2) 肯定超时 然后看数据5*10^4 时间1s 呃 O(nlogn)一下是能过的
然后 在想我为什么要O(n^2)走 肯定会有重复的啊 那怎么省略掉这些呢
很简单 如果我这个圆盘往下掉 第一层的宽度小于第二层的宽度 那么很明显 第二层的宽度是没有用处的 那么有用的是什么呢 是上一层的宽度
也就是说
if(w>=Min) width[i]=Min;
else {
Min = w;
width[i]=w;
}
那么 我们就构造出来了一个有序序列
这样我们就能用O(logn)的时间解决这个圆盘到底落在哪了
#include<iostream>
using namespace std;
int width[50005];
int main(){
int n,m;
cin >> n >> m;
cin >> width[0];
int Min = width[0];
int w;
for(int i=1;i<n;i++){
cin >> w;
if(w>=Min) width[i]=Min;
else {
Min = w;
width[i]=w;
}
}
int l=0,r=n;
int plant;
int ans =0;
bool flag=true;
for(int i=0;i<m;i++){
cin >> plant;
if(!flag) continue;
int mid ;
int loc=-1;
l=0;
while(l<=r){
mid = (l+r)/2;
if(width[mid]>=plant) {
l=mid+1;
loc = mid;
}
else{
r=mid-1;
}
}
if(loc==-1){
flag=false;
continue;
}
//cout << "loc : " << mid << endl;
ans++;
r=loc-1;
}
cout << ans << endl;
}