正题

P3899


题目大意

给你一棵树,对于每次询问,给出x,k,问你有多少个三元组(y,z)满足x,y,z不同,x,y之间的距离小于k,且x,y都是z的祖先


解题思路

若y的深度小于x,那么一定在x到根节点的路径上,答案为 min(depx−1,k)×(szx−1)min(dep_x-1,k)\times (sz_x-1)min(depx​−1,k)×(szx​−1)

若y的深度大于x,那么可以以深度为下标,dfs序为时间坐标构造主席树,每次询问直接在子树的限定深度内查询即可


code

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define N 300300
using namespace std;
ll n,q,x,y,w,tot,h[N],rt[N],sz[N],dfn[N],dep[N],low[N];
struct rec
{ll to,nx;
}e[N<<1];
void add(ll x,ll y)
{e[++tot].to=y;e[tot].nx=h[x];h[x]=tot;return;
}
struct Tree
{ll s[N<<5],ls[N<<5],rs[N<<5];void push_up(ll x){s[x]=s[ls[x]]+s[rs[x]];return;}ll change(ll lst,ll l,ll r,ll y,ll z){ll x=++w;if(l==r){s[x]=s[lst]+z;return x;}ll mid=l+r>>1;if(y<=mid)ls[x]=change(ls[lst],l,mid,y,z),rs[x]=rs[lst];else ls[x]=ls[lst],rs[x]=change(rs[lst],mid+1,r,y,z);push_up(x);return x;}ll ask(ll x,ll L,ll R,ll l,ll r){if(L==l&&R==r)return s[x];ll mid=L+R>>1;if(r<=mid)return ask(ls[x],L,mid,l,r);else if(l>mid)return ask(rs[x],mid+1,R,l,r);else return ask(ls[x],L,mid,l,mid)+ask(rs[x],mid+1,R,mid+1,r);}
}T;
void dfs1(ll x,ll fa)
{dfn[x]=++w;sz[x]=1;for(ll i=h[x];i;i=e[i].nx){ll y=e[i].to;if(y==fa)continue;dep[y]=dep[x]+1;dfs1(y,x);sz[x]+=sz[y];}low[x]=w;return;
}
void dfs2(ll x,ll fa)
{rt[dfn[x]]=T.change(rt[dfn[x]-1],1,n,dep[x],sz[x]-1);for(ll i=h[x];i;i=e[i].nx){ll y=e[i].to;if(y==fa)continue;dfs2(y,x);}return;
}
int main()
{scanf("%lld%lld",&n,&q);for(ll i=1;i<n;++i){scanf("%lld%lld",&x,&y);add(x,y);add(y,x);}dep[1]=1;dfs1(1,0);dfs2(1,0);while(q--){scanf("%lld%lld",&x,&y);printf("%lld\n",min(dep[x]-1,y)*(sz[x]-1)+T.ask(rt[low[x]],1,n,min(dep[x]+1,n),min(dep[x]+y,n))-T.ask(rt[dfn[x]],1,n,min(dep[x]+1,n),min(dep[x]+y,n)));}return 0;
}

【主席树】更为厉害(P3899)相关推荐

  1. 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)

    题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...

  2. P3899 [湖南集训]更为厉害(线段树合并、长链剖分、二维数点)

    P3899 [湖南集训]更为厉害 若 deepb<deepa\text{deep}_b<\text{deep}_adeepb​<deepa​:c 在点 a 的子树中,根据乘法原理计算 ...

  3. [湖南集训]更为厉害 树上主席树-以树深度为下下标建立主席树

    题意题解: 首先对于树上某个点a来说,假设点b是a的祖先(也就是在a的上面),那么答案很好计算,也就是min(k,dep[a]−1)∗(size[a]−1)min(k,dep[a]-1)*(size[ ...

  4. P3899 [湖南集训]谈笑风生 主席树解决二维数点

    传送门 文章目录 题意: 思路: 题意: 思路: 由于a,ba,ba,b都比ccc厉害,那么a,ba,ba,b一定是某个是某个的祖先.那么就分为两种情况了: (1)(1)(1) bbb在aaa上面,约 ...

  5. 主席树 - 可持久化线段树

    模板 P3834 [模板]可持久化线段树 2(主席树) 区间求第 \(k\) 大 模板代码 #include<bits/stdc++.h> using namespace std; #de ...

  6. 可持久化线段树(主席树)【舰娘系列】【自编题】

    [pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60083619 向大(hei)佬(e)势力学(di ...

  7. 牛客网 暑期ACM多校训练营(第一场)J.Different Integers-区间两侧不同数字的个数-离线树状数组 or 可持久化线段树(主席树)...

    J.Different Integers 题意就是给你l,r,问你在区间两侧的[1,l]和[r,n]中,不同数的个数. 两种思路: 1.将数组长度扩大两倍,for(int i=n+1;i<=2* ...

  8. P3899-[湖南集训]谈笑风生【主席树】

    正题 题目链接:https://www.luogu.com.cn/problem/P3899 题目大意 给出nnn个点的一棵有根树,每次询问一个(p,k)(p,k)(p,k),求有多少个点对(b,c) ...

  9. 数据结构----主席树

    这两天一直在看各种树~划分树,左偏树,主席树,伸展树~~~好乱~~ 一听到主席树这个名字的时候感觉好奇怪,为什么会叫主席树,感觉好难好高大上,所以一直敬而远之,,,,,主席树是一个大牛的拼音缩写HJT ...

最新文章

  1. 【数据结构】二叉树的应用。
  2. CMD指令收集(持续)
  3. [云炬创业学笔记]第一章创业是什么测试6
  4. leetcode剑指 Offer 20. 表示数值的字符串
  5. Leetcode 950. Reveal Cards In Increasing Order
  6. 数据结构上机测试2-1:单链表操作A
  7. centos telnet提示No route to host
  8. WIFEXITED WEXITSTATUS WIFSIGNALED(转)
  9. 实战Python:利用Python和PyQt5实现天气查询小系统
  10. [源码和报告分享]基于Android-JavaEE-DB2实现的旧物交易平台
  11. java drawlines()方法
  12. ExtJS中的renderTo何applyTo的差别
  13. 修改(移交)微信支付商户平台超级管理员账号流程
  14. 理解Monitor监视器锁原理
  15. 备战双十一,你清楚积分兑换系统运营吗
  16. 15 | 网络优化(上):移动开发工程师必备的网络优化知识
  17. 框架的优缺点(TP CI)
  18. 工作流系统之四十二 业务规则和业务过程
  19. u盘一直提示格式化是什么原因?怎么找回数据?
  20. 自制滚动的天空,原来很简单,就差细节来人给做做

热门文章

  1. android 监听布局改变,Android通过监听最外层布局的改变监听键盘的状态,软键盘的弹出和收起都会改变外层布局(前提是把Activity的mode设置成压缩);...
  2. Linux链接文件包括,Linux操作系统——系统各目录有什么作用、以及文件链接过程...
  3. python while循环true_Python while循环,pause while not,true时继续?
  4. C++实现各种排序以及复杂度,稳定性分析
  5. [Java基础]字节流读数据
  6. [蓝桥杯2016初赛]剪邮票-dfs+next_permutation(好题)
  7. C++string容器-插入和删除
  8. Facade(外观)--对象结构型模式
  9. 数据结构与算法-- 八皇后问题(多种实现方案)
  10. 编程 音量键_盘点市面上那些千元级高逼格的键盘 灯光炫酷 多宏编程