This commit is contained in:
parent
78b4006392
commit
aeb34bff84
|
@ -0,0 +1,33 @@
|
|||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
|
||||
template <typename T> class Number {
|
||||
template <typename U> friend Number<U> &operator++(Number<U> &);
|
||||
|
||||
public:
|
||||
using iterator_category = forward_iterator_tag;
|
||||
using value_type = T;
|
||||
using difference_type = ptrdiff_t;
|
||||
using pointer = const T *;
|
||||
using reference = const T &;
|
||||
Number(T a) : dat(a) {}
|
||||
bool operator==(const Number<T> &o) const { return dat == *o; }
|
||||
bool operator!=(const Number<T> &o) const { return dat != *o; }
|
||||
const T &operator*() const { return dat; }
|
||||
Number<T> operator+(ptrdiff_t dt) { return Number<T>(dat + dt); }
|
||||
|
||||
private:
|
||||
T dat;
|
||||
void _plusplus() { ++dat; }
|
||||
};
|
||||
|
||||
template <typename T> Number<T> &operator++(Number<T> &it) {
|
||||
it._plusplus();
|
||||
return it;
|
||||
}
|
||||
|
||||
int main() {
|
||||
auto cmp = [](int a, int x) { return a <= x; };
|
||||
cout << *lower_bound(Number(1), Number(5), 3, cmp); // cout << 3 + 1;
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
/**
|
||||
* 作者:力扣官方题解
|
||||
* 链接:https://leetcode.cn/problems/reconstruct-itinerary/solutions/
|
||||
* 来源:力扣(LeetCode)
|
||||
* 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
|
||||
*/
|
||||
|
||||
class Solution {
|
||||
public:
|
||||
unordered_map<string, priority_queue<string, vector<string>, std::greater<string>>> vec;
|
||||
|
||||
vector<string> stk;
|
||||
|
||||
void dfs(const string& curr) {
|
||||
while (vec.count(curr) && vec[curr].size() > 0) {
|
||||
string tmp = vec[curr].top();
|
||||
vec[curr].pop();
|
||||
dfs(move(tmp));
|
||||
}
|
||||
stk.emplace_back(curr);
|
||||
}
|
||||
|
||||
vector<string> findItinerary(vector<vector<string>>& tickets) {
|
||||
for (auto& it : tickets) {
|
||||
vec[it[0]].emplace(it[1]);
|
||||
}
|
||||
dfs("JFK");
|
||||
|
||||
reverse(stk.begin(), stk.end());
|
||||
return stk;
|
||||
}
|
||||
};
|
|
@ -0,0 +1,47 @@
|
|||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
|
||||
int preorder[1010];
|
||||
int inorder[1010];
|
||||
int n;
|
||||
|
||||
struct TreeNode {
|
||||
int val;
|
||||
TreeNode *lc;
|
||||
TreeNode *rc;
|
||||
TreeNode(int v) : val(v) {}
|
||||
TreeNode(int v, TreeNode *l, TreeNode *r) : val(v), lc(l), rc(r) {}
|
||||
};
|
||||
|
||||
TreeNode* dfs(int p_begin, int p_end, int i_begin, int i_end) {
|
||||
if (i_begin >= i_end) {
|
||||
return nullptr;
|
||||
}
|
||||
auto i_mid = find(inorder + i_begin, inorder + i_end, preorder[p_begin]) - inorder;
|
||||
int left_sz = i_mid - i_begin;
|
||||
TreeNode* res = new TreeNode(preorder[p_begin]);
|
||||
res->lc = dfs(p_begin + 1, p_begin + 1 + left_sz, i_begin, i_mid);
|
||||
res->rc = dfs(p_begin + 1 + left_sz, p_end, i_mid + 1, i_end);
|
||||
return res;
|
||||
}
|
||||
|
||||
void print_postorder(TreeNode *node) {
|
||||
if (!node) {
|
||||
return;
|
||||
}
|
||||
print_postorder(node->lc);
|
||||
print_postorder(node->rc);
|
||||
cout << node->val << ' ';
|
||||
}
|
||||
|
||||
int main() {
|
||||
cin >> n;
|
||||
for (int i = 0; i < n; ++i) {
|
||||
cin >> preorder[i];
|
||||
}
|
||||
for (int i = 0; i < n; ++i) {
|
||||
cin >> inorder[i];
|
||||
}
|
||||
print_postorder(dfs(0, n, 0, n));
|
||||
return 0;
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
# @ref https://oi.wiki/ds/fenwick
|
||||
|
||||
n=...
|
||||
c=[0]*(n+1)
|
||||
|
||||
lowbit=lambda x: x&-x
|
||||
|
||||
def prep(a):
|
||||
res=[0]*(n+1)
|
||||
s=0
|
||||
for i in range(1,n+1):
|
||||
s+=a[i]
|
||||
res[i]=s
|
||||
return res
|
||||
|
||||
def init(a):
|
||||
pa=prep(a)
|
||||
for i in range(1,n+1):
|
||||
c[i]=pa[i]-pa[i-lowbit(i)]
|
||||
|
||||
def getsum(x):
|
||||
ans=0
|
||||
while x:
|
||||
ans+=c[x]
|
||||
x-=lowbit(x)
|
||||
return ans
|
||||
|
||||
def add(x,k):
|
||||
while x<=n:
|
||||
c[x]+=k
|
||||
x+=lowbit(x)
|
|
@ -0,0 +1,91 @@
|
|||
// @link https://www.acwing.com/file_system/file/content/whole/index/content/8807719/
|
||||
// Index starts from 1
|
||||
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
#define lson fhq[u].l
|
||||
#define rson fhq[u].r
|
||||
|
||||
const int N = 1e6 + 10;
|
||||
|
||||
struct Node {
|
||||
int l, r;
|
||||
int val, key, size;
|
||||
} fhq[N];
|
||||
int cnt, root;
|
||||
|
||||
void pushup(int u) {
|
||||
fhq[u].size = fhq[lson].size + fhq[rson].size + 1;
|
||||
}
|
||||
|
||||
int node(int val) {
|
||||
fhq[++cnt].val = val;
|
||||
fhq[cnt].key = rand();
|
||||
fhq[cnt].size = 1;
|
||||
return cnt;
|
||||
}
|
||||
|
||||
void split(int u, int val, int &x, int &y) {
|
||||
if (!u) x = y = 0;
|
||||
else {
|
||||
if (fhq[u].val <= val) x = u, split(rson, val, rson, y);
|
||||
else y = u, split(lson, val, x, lson);
|
||||
pushup(u);
|
||||
}
|
||||
}
|
||||
|
||||
int merge(int x, int y) {
|
||||
if (!x || !y) return x + y;
|
||||
if (fhq[x].key <= fhq[y].key) {
|
||||
fhq[x].r = merge(fhq[x].r, y);
|
||||
pushup(x);
|
||||
return x;
|
||||
} else {
|
||||
fhq[y].l = merge(x, fhq[y].l);
|
||||
pushup(y);
|
||||
return y;
|
||||
}
|
||||
}
|
||||
|
||||
int x, y, z;
|
||||
|
||||
void insert(int val) {
|
||||
split(root, val, x, y);
|
||||
root = merge(merge(x, node(val)), y);
|
||||
}
|
||||
|
||||
void del(int val) {
|
||||
split(root, val, x, z);
|
||||
split(x, val - 1, x, y);
|
||||
y = merge(fhq[y].l, fhq[y].r);
|
||||
root = merge(merge(x, y), z);
|
||||
}
|
||||
|
||||
int askRank(int val) {
|
||||
split(root, val - 1, x, y);
|
||||
int res = fhq[x].size + 1;
|
||||
root = merge(x, y);
|
||||
return res;
|
||||
}
|
||||
|
||||
int askNum(int u, int rank) {
|
||||
if (fhq[lson].size + 1 == rank) return fhq[u].val;
|
||||
if (fhq[lson].size >= rank) return askNum(lson, rank);
|
||||
else return askNum(rson, rank - fhq[lson].size - 1);
|
||||
}
|
||||
|
||||
int askPre(int val) {
|
||||
split(root, val - 1, x, y);
|
||||
int u = x;
|
||||
while (rson) u = rson;
|
||||
root = merge(x, y);
|
||||
return fhq[u].val;
|
||||
}
|
||||
|
||||
int askNxt(int val) {
|
||||
split(root, val, x, y);
|
||||
int u = y;
|
||||
while (lson) u = lson;
|
||||
root = merge(x, y);
|
||||
return fhq[u].val;
|
||||
}
|
Loading…
Reference in New Issue