博客
关于我
P3899 [湖南集训]谈笑风生 主席树解决二维数点
阅读量:275 次
发布时间:2019-03-01

本文共 2592 字,大约阅读时间需要 8 分钟。

??????????????

??

????????????a?b????????????c??????????????????????????????????????????????

  • ??????b???a??????????????a??????????[depth[a]+1, depth[a]+k]????????se[i]-1??????k?
  • ??????a???b??????????????b??????????[depth[b]+1, depth[b]+k]????????se[i]-1??????k?
  • ??

    ????????????????????????????????????????????????Heavy-Light Decomposition, HLD???????????????????????????????DFS?????????????????????????????????????????????????

    ???????

  • ????????????????????????????????
  • ???????????????????????????????
  • ???????

    ???????

    • ??????????????????????????????
    • ??????????????DFS????????????????
    • ?????????????????????????????

    ?????????

    • ???????DFS??????????
    • ??????????????????????

    ?????????

    ???????????????????????????O(log n)?

    ??

    ????????

    root   /   \  a     b
    • ?????????[2, 3]???k=2?
      • ?????[depth[a]+1, depth[a]+k] = [2, 4]
      • ?????depth[a]?depth[b]??2?3?

    ????

    #include 
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    using namespace std;typedef long long LL;typedef unsigned long long ULL;typedef pair
    PII;const int N = 1000010;const int mod = 1e9 + 7;const double eps = 1e-6;int root[N], dfn[N], se[N], depth[N];vector
    v[N];int idx = 1;struct Node { int l, r; LL sum;};void dfs1(int u, int fa) { se[u] = 1; dfn[u] = ++idx; depth[u] = depth[fa] + 1; for (int x : v[u]) { if (x != fa) { dfs1(x, u); se[u] += se[x]; } }}void dfs2(int u, int fa) { insert(root[dfn[u] - 1], root[dfn[u]], 1, N, depth[u], se[u] - 1); for (int x : v[u]) { if (x != fa) { dfs2(x, u); } }}void insert(int p, int &q, int l, int r, int pos, int x) { q = ++idx; tr[q] = tr[p]; tr[q].sum += x; if (l == r) return; int mid = (l + r) >> 1; if (pos <= mid) { insert(tr[p].l, tr[q].l, l, mid, pos, x); } else { insert(tr[p].r, tr[q].r, mid + 1, r, pos, x); }}LL query(int p, int q, int l, int r, int ql, int qr) { if (l > ql && r <= qr) return tr[q].sum - tr[p].sum; LL ans = 0; int mid = (l + r) >> 1; if (ql <= mid) ans += query(tr[p].l, tr[q].l, l, mid, ql, qr); if (qr > mid) ans += query(tr[p].r, tr[q].r, mid + 1, r, ql, qr); return ans;}void main() { cin.sync_with_stdio(false); cin.tie(0); int n, m; for (int i = 1; i < n; ++i) { int a, b; cin >> a >> b; v[a].push_back(b); v[b].push_back(a); } dfs1(1, 0); dfs2(1, 0); while (m--) { int p, k; cin >> p >> k; LL ans = min(depth[p] - 1, k) * (se[p] - 1); ans += query(root[dfn[p]], root[dfn[p] + se[p] - 1], 1, N, depth[p] + 1, min(depth[p] + k, N)); cout << ans << endl; } return 0;}

    ??

    ???????????????????????????????????????????????????O(n log n)?????????????

    转载地址:http://xvlx.baihongyu.com/

    你可能感兴趣的文章
    Python--Redis实战:第四章:数据安全与性能保障:第4节:复制
    查看>>
    python--基本代码规范
    查看>>
    Python--抽象类接口类
    查看>>
    PYTHON--欧拉习题二
    查看>>
    python--高级应用总结
    查看>>
    python-520表白代码,我看谁说程序员不懂浪漫,送你几套表白代码,一步到位
    查看>>
    Python-Asyncio TypeError:无法在‘;等待‘;表达式中使用对象DICT
    查看>>
    Python-AttributeError:‘;dict&39;对象没有属性‘;序列‘;
    查看>>
    Python-ldap:是否可以在不显式写入密码的情况下进行绑定?
    查看>>
    python出现 unknown encoding: idna 的处理方法
    查看>>
    Python出现 RuntimeError: dictionary changed size during iteration 的解决方法
    查看>>
    Python-numpy(2)数组的操作
    查看>>
    Python-Numpy的tile函数用法
    查看>>
    python-open函数
    查看>>
    Python-Pandas-将特定函数应用于给定级别-多索引数据框架
    查看>>
    python-queue队列通信
    查看>>
    python-ros No module named PyKDL
    查看>>
    python-social-auth 是否需要会话
    查看>>
    Python再获年度编程语言,微软或成最大赢家
    查看>>
    python-week5
    查看>>