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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章