Skip to main content
  1. Posts/
  2. title/

BOJ 24535 둘레길

·266 words·2 mins
Jiho Kim
Author
Jiho Kim
달려 또 달려

📝 문제 정보
#

🧐 관찰 및 접근
#

  • 점이 500개가 주어진다.
  • 적당한 사각형 하나를 잡아서, 사각형 위에 점이 최대로 올라가게 하자.
  • 흠, 일단 좌표압축하면 x, y좌표 각각 500개로 줄일 수 있겠다.
  • 나이브하게 돌리면? 대충 $O(N^4)$가 되는거같은데…
    • 2초에 $N = 500$이니까, 세제곱까지만 줄여도 어떻게 될거같긴 하다.
  • 변 하나를 결정하는 경우의수가 $O(N^3)$개 인거같고, 그때 나머지 변 세개 최댓값을 잘 하면 되는데..
    • 이것도 아래서부터 잘 긁으면서 올라오면 될거같은데?
    • 아니 50퍼에서 틀린다고?? 머지
      • 아하 세로 한줄로 오는거 약간 걱정했었는데 역시 오류가 있었다. 이것만 고치면 되네
      • 가로는 잘 처리 되더라

💻 풀이
#

  • 코드 (C++):
void solve(){
    int N; cin >> N;
    vector<pii> points(N);
    vector<int> xs, ys;
    rep(i, 0, N){
        int x, y; cin >> x >> y;
        points[i] = {x, y};
        xs.push_back(x);
        ys.push_back(y);
    }
    sort(all(xs)); xs.erase(unique(all(xs)), xs.end());
    sort(all(ys)); ys.erase(unique(all(ys)), ys.end());

    rep(i, 0, N){
        points[i].first = lower_bound(all(xs), points[i].first) - xs.begin();
        points[i].second = lower_bound(all(ys), points[i].second) - ys.begin();
    }

    vector<vector<bool>> isPoint(xs.size(), vector<bool>(ys.size()));
    for(auto [x, y] : points) isPoint[x][y] = true;

    int ans = 0;
    vector<vector<int>> DP(ys.size(), vector<int>(ys.size()));
    rrep(i, 0, xs.size()){
        vector<vector<int>> cur_cnt(ys.size(), vector<int>(ys.size())); // cur_cnt[j][k] = j, k 사이에 있는 점의 개수
        rep(j, 0, ys.size()){
            if(isPoint[i][j]) cur_cnt[j][j]++;
            rep(k, j+1, ys.size()) cur_cnt[j][k] = cur_cnt[j][k-1] + isPoint[i][k];
        }

        rep(j, 0, ys.size()) rep(k, j+1, ys.size()){
            ans = max(ans, cur_cnt[j][k] + DP[j][k]);
            DP[j][k] = max(DP[j][k] + isPoint[i][j] + isPoint[i][k], cur_cnt[j][k]);
        }
    }

    // 세로 한줄 처리
    rep(i, 0, ys.size()){
        int cnt = 0;
        rep(j, 0, xs.size()) if(isPoint[j][i]) cnt++;
        ans = max(ans, cnt);
    }
    cout << ans;
}
🔒

구현 코드 잠금

아래 쿠팡 링크를 방문하시면 코드가 공개됩니다.
광고 수익이 블로그 운영에 도움이 됩니다 🙏

🛒 쿠팡 방문하고 코드 보기

방문 후 잠금이 자동으로 해제됩니다