Codeforces beta round #6 e_exposition

Published: by Creative Commons Licence

  • 숫자 범위가 k이하 차이나는 범위 중 가장 긴 범위를 구하는 문제.
  • 투포인터와 set을 결합하여 문제를 해결하였다.
  • 처음에는 투포인터로만 해결이 가능할 거 같았지만 TLE가 났다.
  • 자료구조를 잘 활용해야 풀수 있는 문제.
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
using namespace std;

int arr[100010],n,k,cnt,diff,ans[100010];

set<pair<int, int> > s;
int max_period, period;
int main() {
	scanf("%d %d", &n, &k);
	for (int i = 0; i < n; i++) {
		scanf("%d", &arr[i]);
	}
	int max_idx = -1;
	for (int r = 0; r < n; r++) {
		s.insert({ arr[r],r });
		auto head = s.begin();
		auto tail = --(s.end());
		while (abs(head->first - tail->first) > k) {
			max_idx = max(max_idx, min(head->second, tail->second));
			if (head->second < tail->second) s.erase(head);
			else s.erase(tail);
			head = s.begin(), tail = --(s.end());
		}
		ans[r] = max_idx + 1;
		//cnt = max(cnt, ans[r]);
		if (diff < r - ans[r]) {
			cnt = 0,diff = r - ans[r];
		}
		if (diff == r - ans[r]) cnt++;
	}
	printf("%d %d\n", diff + 1,cnt);
	for (int i = 0; i < n; i++) {
		if (i - ans[i] == diff) {
			printf("%d %d\n", ans[i] + 1, i + 1);
		}
	}
	return 0;
}