博客
关于我
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 UI自动化测试Page Objects企业级实战
    查看>>
    python谷歌翻译,2021年9月10日亲测可用,一次可以翻译十万,强烈star
    查看>>
    Python UI自动化测试数据驱动实战
    查看>>
    Python UI自动化测试集成UnitTest
    查看>>
    Python UI自动化测试集成UnitTest
    查看>>
    python unicode-escape
    查看>>
    Python unittest mock:是否可以在测试时模拟方法默认参数的值?
    查看>>
    Python unittest单元测试框架 TestSuite测试套件
    查看>>
    PYTHON调离线语音合成并实时播放
    查看>>
    python unittest高级特性!
    查看>>
    Python unittest:如何将标准输出消息临时重定向到缓冲区并测试其内容?
    查看>>
    Python urllib/Requests下载文件失败,但浏览器下载失败
    查看>>
    Python urllib2 文件上传问题
    查看>>
    Python urllib2.open 连接由对等错误重置
    查看>>
    python urllib2详解及实例
    查看>>
    Python url请求提示certificate verify failed unable to get local issuer certificate
    查看>>
    Python UTC 日期时间对象的 ISO 格式不包括 Z(祖鲁语或零偏移)
    查看>>
    python valueerror object2_python遇到错误记录
    查看>>
    python vars的作用
    查看>>
    Python vcrpy库:HTTP请求记录和重放
    查看>>