单调队列42pts求调
查看原帖
单调队列42pts求调
1373187
Sakura__Tears楼主2024/7/7 16:31

不清楚为什么 但是有时候会输出负数

谢谢大佬()

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 50005;
int n;
int tmp[N];
struct node{
	int x;
	int id;
}a[N];
bool cmp1(node a1, node a2){
	return a1.id < a2.id;
}
bool cmp2(node a1, node a2){
	return a1.x < a2.x;
}
signed main(){
	cin >> n;
	for(int i = 1;i <= n;i++){
		cin >> a[i].x >> a[i].id;
	}
	sort(a+1, a+n+1, cmp1);
	int now = a[1].id, m = 1;
	for(int i = 1;i <= n;i++){
		if(a[i].id != now){
			m++;
			now = a[i].id;
			a[i].id = m;
		}
	}
	if(m == 1){
		cout << "1";
		return 0;
	}
	sort(a+1, a+n+1, cmp2);
	int head = 1, ans = 2e9+5;
	while(head != n){
		for(int i = 1;i <= m;i++) tmp[i] = 0;
		int cnt = 1, now = head;
		tmp[a[now].id] = 1;
		while(1){
			now++;
			if(tmp[a[now].id] == 0){
				tmp[a[now].id] = 1;cnt++;
			}
			if(a[now].id == a[head].id) break;
			if(cnt == m){
				ans = min(ans, a[now].x-a[head].x);
				break;
			}
			if(a[now].x-a[head].x > ans) break;
			if(now > n){
				cout << ans;
				return 0;
			}
		}
		head++;
	}
	cout << ans;
	return 0;
}
2024/7/7 16:31
加载中...