最近做题心不在焉,总是犯很低级错误,而且debug也很久,需要非常关注改进这方面的问题。
题目思路还是比较巧妙的,只需要先对酒店排出关于价格的一个偏序,然后,遍历过程中,查看价格低于(严格小于)当前酒店的酒店中距离是否也严格低于当前酒店。编码一定要注意细节,这次因为sparse table第二个维度开的不够一直WA,若是poj Runtime Error还能查出,可是这次就被一直卡,对于数据范围预估是后面训练一直需要注意的一点
#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <stack>
#include <map>
#include <set>
#include <deque>
using namespace std;
const int maxn= 1e4+5;
struct Record
{
int p, d;
}htl[maxn];
int mm[maxn], dv[maxn][20];
vector<int> ans;
void InitRMQ(int n, Record b[])
{
mm[0]= -1;
for (int i= 1; i<= n; ++i){
mm[i]= i & (i-1) ? mm[i-1] : mm[i-1]+1;
dv[i][0]= b[i].d;
}
for (int j= 1; j<= mm[n]; ++j){
for (int i= 1; i+(1<<j)-1<= n; ++i){
dv[i][j]= min(dv[i][j-1], dv[i+(1<<(j-1))][j-1]);
}
}
}
int Query(int l, int r)
{
int k= mm[r-l+1];
return min(dv[l][k], dv[r-(1<<k)+1][k]);
}
bool cmp(Record lhs, Record rhs)
{
return lhs.p< rhs.p || (lhs.p== rhs.p && lhs.d < rhs.d);
}
int main()
{
int n;
while (~scanf("%d", &n)){
ans.clear();
for (int i= 1; i<= n; ++i){
scanf("%d %d", &(htl[i].p), &(htl[i].d));
}
sort(htl+1, htl+1+n, cmp);
InitRMQ(n, htl);
int id= 1;
for (int i= 1; i<= n; ++i){
if (htl[i].p!= htl[id].p){
id= i;
}
if (1== id || htl[i].d<= Query(1, id-1)){
ans.push_back(i);
}
}
int sz= ans.size();
printf("%d
", sz);
for (int i= 0; i< sz; ++i){
printf("%d %d
", htl[ans[i]].p, htl[ans[i]].d);
}
}
return 0;
}