2017年4月15日
今天学习了线段树两题。
训练指南的uvalive 3938\http://paste.ubuntu.com/24387212/
leetcode
315. Count of Smaller Numbers After Self
struct Node
{
int s;
};
vector<Node> tree;
int mid(int l, int r)
{
return l + (r - l) / 2;
}
void build(int o, int l, int r)
{
if (l == r) {
tree[o].s = 0;
return;
}
int m = mid(l, r), lc = o * 2, rc = o * 2 + 1;
build(lc, l, m);
build(rc, m+1, r);
tree[o].s = tree[lc].s + tree[rc].s;
}
int query(int o, int l, int r, int qr)
{
if (qr == 0) return 0;
if (r == qr) return tree[o].s;
int m = mid(l, r), lc = o*2, rc = o*2+1;
if (m >= qr) return query(lc, l, m, qr);
return tree[lc].s + query(rc, m + 1, r, qr);
}
void update(int o, int l, int r, int v)
{
int m = mid(l, r), lc = o*2, rc = o*2 + 1;
if (l == r) {tree[o].s++; return;}
if (v <= m) update(lc, l, m, v); else update(rc, m+1, r, v);
tree[o].s = tree[lc].s + tree[rc].s;
}
class Solution {
public:
vector<int> countSmaller(vector<int>& nums) {
map<int, int> f, ff;
int n = nums.size();
vector<int> ans(n);
if (n == 0) return ans;
int a[n];
tree.resize(4 * n);
for (int i = 0; i < n; i++) {
scanf("%d", &nums[i]);
a[i] = nums[i];
}
sort(a, a + n);
int nn = unique(a, a + n) - a;
for (int i = 0; i < nn; i++) {
f[a[i]] = i + 1;
ff[i + 1] = a[i];
}
build(1, 1, nn);
for (int i = n - 1; i >= 0; i--) {
ans[i] = query(1, 1, n, f[nums[i]] - 1);
update(1, 1, n, f[nums[i]]);
}
return ans;
}
};
已经11点45了,不过我不编程,好像也没有什么别的事情可以干。
GO HOME!