Re: [閒聊] 每日leetcode
2940.
昨天寫不出來
今天邊寫邊吐
想這個樹怎麼建想好久
寶可夢直接+20勝==
動態開點MLE
看hint不知道怎麼用BIT建
改smart pointer還是MLE
最後改成先離散化再開點才過的
要離散化的話
應該不要動態開點更快ㄅ
但是我腿了:(
class Solution {
public:
// segment tree
class Node{
public:
int idx;
Node *l, *r;
Node(){
idx = INT_MAX;
l = nullptr;
r = nullptr;
};
Node(int i){
idx = i;
l = nullptr;
r = nullptr;
};
};
class Segment_tree{
public:
Node* root;
int idx;
Segment_tree(){
root = new Node();
idx = INT_MAX;
}
Segment_tree(int i){
root = new Node(i);
idx = i;
}
void update(Node* nd, int& val, int& idx, int tl = 0, int tr = 1e9){
if(val < tl || tr < val) return;
if(val == tl ){
nd->idx = idx;
}
else{
int mid = (tl + tr) / 2;
if(nd->l == nullptr){
nd->l = new Node();
}
if(nd->r == nullptr){
nd->r = new Node();
}
update(nd->l, val, idx, tl, mid);
update(nd->r, val, idx, mid+1, tr);
nd->idx = min(nd->l->idx, nd->r->idx);
}
}
int query(Node* nd, int& val, int tl = 0, int tr = 1e9){
// (val, inf]
if(nd == nullptr or tr <= val) return INT_MAX;
int idx = INT_MAX;
if(val < tl){
idx = min(idx, nd->idx);
}
else{
int mid = (tl + tr) / 2;
idx = min(idx, query(nd->l, val, tl, mid));
idx = min(idx, query(nd->r, val, mid+1, tr));
}
return idx;
}
};
vector<int> leftmostBuildingQueries(vector<int>& H, vector<vector<int>>& Q) {
// range: val [1, 1e9]
// get min idx
Segment_tree tree;
int n = H.size(), m = Q.size();
// seperate H
vector<int> sp(n);
for(int i = 0; i < n; i++){
sp[i] = i;
}
ranges::sort(sp, [&](int& a, int& b){return H[a] < H[b]; });
int cur = -1, cnt = 0;
for(int& i: sp){
if(H[i] == cur) H[i] = cnt;
else{
cur = H[i];
cnt++;
H[i] = cnt;
}
}
int mx = cnt * 4;
vector<int> order(m), res(m, -1);
// Q[i][1] order
for(int i = 0; i < m; i++){
if(Q[i][0] > Q[i][1]) swap(Q[i][0], Q[i][1]);
order[i] = i;
}
ranges::sort(order, [&](int& a, int& b){ return Q[a][1] < Q[b][1]; });
for(int i = n-1, oi = m-1; i >= 0, oi >= 0; i--){
// H: i, order: oi
//cout << i << ": \n";
while(oi >= 0 and Q[ order[oi] ][1] >= i){
//cout << oi << " " << Q[ order[oi] ][1] << " ";
int &ai = Q[ order[oi] ][0], &bi = Q[ order[oi] ][1];
if(ai == bi or H[ai] < H[bi] ){
res[order[oi]] = bi;
//cout << "no q: " << bi << '\n';
}
else{
int q = tree.query(tree.root, H[ai], 0, mx);
if(q != INT_MAX) res[order[oi]] = q;
//cout << "q: " << q << '\n';
}
oi--;
}
tree.update(tree.root, H[i], i, 0, mx);
}
return res;
}
};
※ 引述《dont (dont)》之銘言:
: 2940. Find Building Where Alice and Bob Can Meet
: ## 思路
-----
Sent from JPTT on my iPad
--
很姆的咪
姆之咪
http://i.imgur.com/5sw7QOj.jpg

--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.205.121.194 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1734967608.A.28B.html
→
12/23 23:28,
11月前
, 1F
12/23 23:28, 1F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 1220 之 1554 篇):