86pts求hack,实在看不出什么错
查看原帖
86pts求hack,实在看不出什么错
206423
焚魂楼主2024/9/11 19:12

思路即先排序贪心去重后再遍历计算最少个数

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std;

int n,t;
vector<pair<int,int> > a;
pair<int,int> ta[25010];
int tot;
int f[25010],las[25010],minn = 0x3ffffff,maxn = -1;

bool cmp(pair<int,int> x,pair<int,int> y) {
	return x.first == y.first ? x.second < y.second : x.first < y.first;
}

int main() {
	cin >> n >> t;
	for(int i = 1;i <= n;i++) {
		int t,tt;
		cin >> t >> tt;
		a.push_back(make_pair(t,tt));
	}
	sort(a.begin(),a.end(),cmp);
	for(int i = 0;i < n;i++) {
		if(a[i].first == a[i+1].first) continue;
		if(i > 0 && a[i].second <= a[i-1].second) continue;
		ta[++tot] = make_pair(a[i].first,a[i].second);
		maxn = max(maxn,ta[tot].second);
	}
	
	for(int i = 1;i <= tot;i++) {
		cout << ta[i].first << " " << ta[i].second << endl;
	}
	if(ta[1].first > 1 || maxn < t) {
		cout << -1;
		return 0;
	}
	f[1] = 1,las[1] = ta[1].second;
	if(ta[1].second == t) {
		cout << 1;
		return 0;
	}
	maxn = ta[1].second;
	for(int i = 2;i <= tot;i++) {
		if(maxn < ta[i].first-1) {
			cout << -1;
			return 0;
		}
		maxn = max(maxn,ta[i].second);
		int key = lower_bound(las+1,las+i-1,ta[i].first-1)-las;
		f[i] = f[key] + 1;
		las[i] = ta[i].second;
		if(ta[i].second == t) minn = min(minn,f[i]);
	}
	cout << minn;
	
	return 0;
}
2024/9/11 19:12
加载中...