위 문제를 아래 코드와 같이 풀었습니다.
#include <iostream>
#include <algorithm>
using namespace std;
int st[1000010];
int en[1000010];
int main(int argc, char* argv[]) {
cin.tie(0);
ios::sync_with_stdio(0);
int n, k;
cin >> n >> k;
for (int i = 0; i < n; i++) {
int a, b;
cin >> a >> b;
st[a]++; en[b]++;
}
pair<int, int> ans = {0, 0};
int lo = 0, hi = 0;
int add = 0, sub = 0;
long long cnt = 0;
// [lo,hi)
while (lo < n || hi < n) {
if (cnt < k) {
add += st[hi];
add -= en[hi++];
cnt += add;
}
else if (cnt > k) {
sub += st[lo];
sub -= en[lo++];
cnt -= sub;
}
else {
ans = {lo, hi};
break;
}
}
cout << ans.first << " " << ans.second;
}
시작점과 끝점의 좌표의 갯수를 배열에 저장하여 투포인터를 이용해 풀었습니다.
하지만 도저히 27%의 벽을 넘을수가 없었습니다..
아니 대체 왜안되노??ㄹㅇ
부족한 저를 위하여 부디 반례를 찾아주십시오..
- dc official App
댓글 0