Untitled
#include <iostream> #include <set> #include <utility> using namespace std; set<pair<int, int>> user[101]; // Mỗi mảng đại diện cho một user, chứa các cặp giá trị (user khác, Y) void init() { for (int i = 1; i <= 100; i++) { user[i].clear(); // Xóa sạch dữ liệu của từng user } } void add(int mX, int mY) { user[mX].insert(make_pair(mX + 1, mY)); // Thêm mối quan hệ giữa mX và mX+1 user[mX + 1].insert(make_pair(mX, mY)); // Thêm mối quan hệ ngược lại giữa mX+1 và mX } void remove(int mX, int mY) { user[mX].erase(make_pair(mX + 1, mY)); // Xóa mối quan hệ giữa mX và mX+1 user[mX + 1].erase(make_pair(mX, mY)); // Xóa mối quan hệ ngược lại giữa mX+1 và mX } int numberOfCross(int mID) { int id = mID; int res = 0; auto it = user[id].upper_bound(make_pair(id, 0)); // Tìm cặp có giá trị Y lớn hơn 0 while (it != user[id].end()) { res++; int next_id = it->first; it = user[next_id].upper_bound(make_pair(next_id, it->second)); // Chuyển sang user tiếp theo id = next_id; } return res; // Trả về số lần cross } int participant(int mX, int mY) { int id = mX; auto it = user[id].lower_bound(make_pair(mX, mY)); // Tìm cặp có giá trị Y >= mY while (it != user[id].begin()) { --it; int prev_id = it->first; it = user[prev_id].lower_bound(make_pair(prev_id, it->second)); // Di chuyển ngược lại user trước đó id = prev_id; } return id; // Trả về ID của participant }
Leave a Comment