HDU 3193

最近做题心不在焉,总是犯很低级错误,而且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\n", sz);
		for (int i= 0; i< sz; ++i){
			printf("%d %d\n", htl[ans[i]].p, htl[ans[i]].d);
		}
	}

	return 0;
}
posted @ 2021-05-14 23:46  IdiotNe  阅读(35)  评论(0编辑  收藏  举报