当前位置: 首页 > news >正文

[湖南集训]谈笑风生(主席树)

设 T 为一棵有根树,我们做如下的定义:

• 设 a 和 b 为 T 中的两个不同节点。如果 a 是 b 的祖先,那么称“a 比 b 不知道高明到哪里去了”。

• 设 a 和 b 为 T 中的两个不同节点。如果 a 与 b 在树上的距离不超过某个给定常数 x,那么称“a 与 b 谈笑风生”。

给定一棵 n 个节点的有根树 T,节点的编号为 1 ∼ n,根节点为 1 号节点。你需要回答 q 个询问,询问给定两个整数 p 和 k,问有多少个有序三元组 (a; b; c) 满足:

  1. a、 b 和 c 为 T 中三个不同的点,且 a 为 p 号节点;

  2. a 和 b 都比 c 不知道高明到哪里去了;

  3. a 和 b 谈笑风生。这里谈笑风生中的常数为给定的 k

Solution

其实看标题就知道这题的解法了。


发现我们求的是min(deep[p]-1,k)*(size[p]-1)加上以p为根的子树里所有深度在deep[p]+1~deep[p]+k的点的size和。

这个东西怎么求?

按照dfs序建立主席树,下标为节点深度。

Code

#include<iostream>
#include<cstdio>
#define N 300003
using namespace std;
typedef long long ll; 
int size[N],deep[N],mad,head[N],tot,top,ji,dfn[N],hui[N],L[N*22],R[N*22],re[N],n,q,x,y,T[N];
ll tr[N*22];
struct ds{
    int n,to;
}e[N<<1];
inline void add(int u,int v){
    e[++tot].n=head[u];
    e[tot].to=v;
    head[u]=tot;
}
void dfs(int u,int fa){
    size[u]=1;deep[u]=deep[fa]+1;
    mad=max(mad,deep[u]);
    dfn[u]=++top;
    re[top]=u;
    for(int i=head[u];i;i=e[i].n){
        int v=e[i].to;
        if(v==fa)continue;
        dfs(v,u);
        size[u]+=size[v];
    }
    hui[u]=top;
}
int build(int l,int r){
    int p=++ji;
    if(l==r)return p;
    int mid=(l+r)>>1;
    L[p]=build(l,mid);R[p]=build(mid+1,r);
    return p;
}
int update(int pre,int l,int r,int x,ll y){
    int p=++ji;
    L[p]=L[pre];R[p]=R[pre];tr[p]=tr[pre]+y;
    if(l==r)return p;
    int mid=(l+r)>>1;
    if(mid>=x)L[p]=update(L[pre],l,mid,x,y);
    else R[p]=update(R[pre],mid+1,r,x,y);
    return p;
} 
int rd(){
    int x=0;char c=getchar();
    while(!isdigit(c))c=getchar();
    while(isdigit(c)){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x;
}
ll query(int pre,int now,int l,int r,int LL,int RR){
    if(l>=LL&&r<=RR)return tr[now]-tr[pre];
    int mid=(l+r)>>1;
    ll ans=0;
    if(mid>=LL)ans+=query(L[pre],L[now],l,mid,LL,RR);
    if(mid<RR)ans+=query(R[pre],R[now],mid+1,r,LL,RR);
    return ans;
}
int main(){
    n=rd();q=rd(); int pu,k;
    for(int i=1;i<n;++i)x=rd(),y=rd(),add(x,y),add(y,x);
    dfs(1,0);
    T[0]=build(1,mad);
    for(int i=1;i<=n;++i)T[i]=update(T[i-1],1,mad,deep[re[i]],size[re[i]]-1); 
    while(q--){
        pu=rd();k=rd();ll num=0;
        if(deep[pu]!=mad)num=query(T[dfn[pu]],T[hui[pu]],1,mad,deep[pu]+1,min(deep[pu]+k,mad));
        printf("%lld\n",((ll)min((ll)deep[pu]-1,(ll)k))*((ll)size[pu]-1)+num);
    } 
    return 0;
}

 

转载于:https://www.cnblogs.com/ZH-comld/p/9600350.html

相关文章:

  • Docker源码分析(六):Docker Daemon网络
  • 回归博客园~
  • AngularDart Material Design 自动输入建议
  • homework1-201521410029
  • python 【第五篇】 面向对象
  • 个人香水收藏
  • Nginx+Python+uwsgi+Django环境搭建
  • Java 8 Lambda表达式介绍
  • 点评阿里JAVA手册之MySQL数据库 (建表规约、索引规约、SQL语句、ORM映射)
  • 自实现三色空缺圆环
  • Search in Rotated Sorted Array II
  • IT题库7-线程加锁
  • sysbench使用
  • CSS.2
  • 程序架构探讨—002 应用服务器集群的伸缩性之负载均衡
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Android框架之Volley
  • avalon2.2的VM生成过程
  • CSS居中完全指南——构建CSS居中决策树
  • ECS应用管理最佳实践
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java知识点总结(JavaIO-打印流)
  • Js基础知识(一) - 变量
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 安卓应用性能调试和优化经验分享
  • 闭包--闭包之tab栏切换(四)
  • 对象管理器(defineProperty)学习笔记
  • 译米田引理
  • 做一名精致的JavaScripter 01:JavaScript简介
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • scrapy中间件源码分析及常用中间件大全
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 进程与线程(三)——进程/线程间通信
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # centos7下FFmpeg环境部署记录
  • #前后端分离# 头条发布系统
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (2)STM32单片机上位机
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (笔试题)合法字符串
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (三)uboot源码分析
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)重识new
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .dwp和.webpart的区别