题目描述
LH的妹子们排成了1排。
每个妹子有一个颜值ai。由于LH不想让妹子的颜值差距过大,并且他想找出尽可能多的妹子,所以他想找出一段连续的妹子,使得这段妹子最大的颜值减去这段妹子最小的颜值≤k,并且妹子的数量尽可能多。
请聪明的你帮帮LH来找妹子吧。输入
第一行给出2个正整数n,k,表示LH有n个妹子,LH希望找出的妹子最大的颜值减去这些妹子最小的颜值≤k。 第二行输入n个正整数 ai。表示LH的n个妹子的颜值。
输出
输出一行一个整数表示LH能找到的妹子的数量的最大值。
样例输入 Copy
4 2 1 4 2 3样例输出 Copy
3提示
对于30%的数据,n≤100。
对于50%的数据,n≤1000
对于另外20%的数据,ai≤ai+1。
对于100%的数据,n≤100000,ai≤109,k≤109。
向某位大佬要的multiset+二分查找代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
typedef long long ll;
ll n,arr[maxn],k,mp[maxn],cnt;
multiset<ll>st;
int main()
{
cin>>n>>k;
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
ll maxx=-1e9,minx=1e9+5;
int ans=0;
int j=0;
for(int i=0;i<n;i++)
{
maxx=max(maxx,arr[i]);
minx=min(minx,arr[i]);
st.insert(arr[i]);
while(maxx-minx>k)
{
multiset<ll>::iterator it =st.lower_bound(arr[j]);
st.erase(it);
if(st.size())
{
minx=*st.begin();
it=st.end();
it--;
maxx=*it;
}
else
{
maxx=-1e9;
minx=1e9+5;
}
j++;
}
int len=st.size();
ans=max(ans,len);
}
cout<<ans;
return 0;
}
我写的是小根堆大根堆双指针,但是不知道为什么是对的qwq
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const int N=1e5+5;
ll a[N],n,k,mmmax=0,mmax,mmin;
struct node
{
int w,now;
friend bool operator < (node a, node b)
{
return a.w>b.w;//这里注意符号要为'>'
}
};
struct nodes
{
int w,now;
friend bool operator < (nodes a, nodes b)
{
return a.w<b.w;//这里注意符号要为'>'
}
};
priority_queue<nodes>qd;//大
priority_queue<node>qx;//小
ll l=0,r=0;
int main()
{
cin>>n>>k;
for(ll i=0; i<=n-1; i++)
{
cin>>a[i];
}
qd.push((nodes)
{
a[0],0
});
qx.push((node)
{
a[0],0
});
while(r<n)
{
while(qx.top().now<l)
{
qx.pop();
}
while(qd.top().now<l)
{
qd.pop();
};
mmax=qd.top().w;
mmin=qx.top().w;
if(mmax-mmin>k)
{
l++;
}
else
{
mmmax=max(mmmax,r-l+1);
if(r++ ==n-1)
{
break;
}
qd.push((nodes)
{
a[r],r
});
qx.push((node)
{
a[r],r
});
}
}
cout<<mmmax;
return 0;
}