2017年4月15日

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!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值