题目大意:找出一个旅馆,确保没有其他旅馆的 价格和距离 都比这个旅馆小,找出所有的这样旅馆
思路:RMQ模版,先用sort按照价格排序,然后用RMQ求出距离区间的最小值,枚举每一个点x,找出x这个旅馆前面价格更小的旅馆中距离最小的y,如果y不比x的距离短,那么x就符合没有其他旅馆 价格和距离 都比x小。
WA:思路错误,本来想用sort排序,然后后面的点依次和第一个点比较结果没有考虑(2,10)(5,8)(6,9)这种情况
AC代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#define N 10010
using namespace std;
struct node
{
int x,y;
}nd[N];
int dp[N][30];
int cmp(node a, node b)
{
if(a.x == b.x)
return a.y < b.y;
return a.x < b.x;
}
void RMQ(int n)
{
for(int i = 1; i <= n; i++)
dp[i][0] = nd[i].y;
for(int j = 1; (1<<j) <= n; j++)
for(int i = 1; i+(1<<j)-1 <= n; i++)
dp[i][j] = min(dp[i][j-1], dp[i+(1<<(j-1))][j-1]);
}
int query(int l,int r)
{
if(l > r)
return 0x3f3f3f3f;
int k = (int)(log10(r-l+1)/log10(2));
return min(dp[l][k], dp[r-(1<<k)+1][k]);
}
int main()
{
int n,ans;
while(~scanf("%d", &n))
{
for(int i = 1; i <= n; i++)
scanf("%d%d", &nd[i].x, &nd[i].y);
sort(nd+1,nd+n+1,cmp);
RMQ(n);//x已经拍好序,求出区间中nd.y的最小值
ans = 1;
nd[0].x = nd[0].y = 0x3f3f3f;
node num[N];
int p = 1;
for(int i = 1; i <= n; i++)
{
if(nd[i].x != nd[p].x)
p = i;
int m = query(1,p-1);
if(m >= nd[i].y)
num[ans++] = nd[i];
}
printf("%d\n",ans-1);
for(int i = 1;i <= ans-1; i++)
printf("%d %d\n",num[i].x, num[i].y);
}
return 0;
}