กำหนดให้มีรายการพิกัด N จุด P ในรูปแบบ (xi, yi) โดยค่า x และ y เป็นการเรียงสับเปลี่ยน (permutation) ของจำนวนธรรมชาติ N ตัวแรก สำหรับแต่ละ k ตั้งแต่ 1 ถึง N เราอยู่ที่เมือง k สามารถทำการดำเนินการได้ไม่จำกัดครั้ง การดำเนินการ: ย้ายไปเมืองอื่นที่มีพิกัด x น้อยกว่าและ y น้อยกว่า หรือ x มากกว่าและ y มากกว่าเมืองปัจจุบัน ต้องการหาจำนวนเมืองที่สามารถไปถึงได้จากเมือง k
ตัวอย่าง
Input: P = [[1, 4], [2, 3], [3, 1], [4, 2]]
Output: [1, 1, 2, 2]
อัลกอริทึม
- สร้างอาร์เรย์ 2 มิติ
lstเก็บ{x, y, index}และเรียงตาม x - ใช้ตัวแปร
y_minติดตามค่า y ต่ำสุดที่เจอมา - ใช้ Set
seเก็บ index ของเมืองในกลุ่มปัจจุบัน - เมื่อ
y_min + i == nแสดงว่าจบกลุ่มหนึ่ง กำหนดคำตอบให้ทุกเมืองในกลุ่ม = ขนาดของกลุ่ม - ล้าง Set และต่อไปกลุ่มถัดไป
โค้ดตัวอย่าง (C++)
#include <bits/stdc++.h>
using namespace std;
void solve(vector<vector<int>> P) {
int n = P.size();
vector<vector<int>> lst;
for (int i = 0; i < n; i++) {
vector<int> v = { P[i][0], P[i][1], i };
lst.push_back(v);
}
sort(lst.begin(), lst.end());
int y_min = 1e9;
set<int> se;
vector<int> ans(n, 0);
for (int i = 0; i < n; i++) {
y_min = min(y_min, lst[i][1]);
se.insert(lst[i][2]);
if (y_min + i == n) {
for (auto j : se)
ans[j] = se.size();
se.clear();
}
if (i == n - 1) {
for (auto j : se)
ans[j] = se.size();
}
}
for (int i = 0; i < n; i++)
cout << ans[i] << ", ";
}
int main() {
vector<vector<int>> P = { { 1, 4 }, { 2, 3 }, { 3, 1 }, { 4, 2 } };
solve(P);
}
ผลลัพธ์
1, 1, 2, 2,