AT_joig2021_d 展覧会 2 (Exhibition 2) 题解

题目传送门

前置知识

二分答案

解法

观察到要使价值最小值最大,考虑二分答案。

二分所能得到的华丽度,基本与 luogu P1182 数列分段 Section II 一致。具体地,依次枚举 \(1 \sim n\) 对距离和画的价值进行判定,注意对当前是第一次展出时进行特判。

代码

#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;
}
posted @ 2024-03-03 06:40  hzoi_Shadow  阅读(12)  评论(0编辑  收藏  举报
扩大
缩小