前置知识
解法
最小值最大,考虑二分答案。
关于 check
函数的书写,比 luogu P1182 数列分段 Section II 多了个对位置的判定,注意对当前是第一次展出时进行特判。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define sort stable_sort
#define endl '\n'
struct node
{
int x,v;
}a[100001];
bool cmp(node a,node b)
{
return a.x<b.x;
}
bool check(int mid,int n,int m,int d)
{
int ans=0,last=0,i;
for(i=1;i<=n;i++)
{
if((last==0||a[i].x-a[last].x>=d)&&a[i].v>=mid)
{
last=i;
ans++;
}
}
return ans>=m;
}
int main()
{
int n,m,d,l=0,r=0,mid,ans=-1,i;
cin>>n>>m>>d;
for(i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].v;
r=max(r,a[i].v);
}
sort(a+1,a+1+n,cmp);
while(l<=r)
{
mid=(l+r)/2;
if(check(mid,n,m,d)==true)
{
ans=mid;
l=mid+1;
}
else
{
r=mid-1;
}
}
cout<<ans<<endl;
return 0;
}
标签:joig2021,node,int,题解,long,sort,Exhibition,ans,define
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18049566