P3899 [湖南集训] 更为厉害

news/2025/2/27 19:53:00/文章来源:https://www.cnblogs.com/Glowingfire/p/18735054

题意

请自行移步洛谷

分析

每次询问有两种情况:

  • a 为 (a,b,c) 中深度第二大的节点,即 b 在 a 到根的路径上 (不含 a )。

对答案的贡献即为 $ ( siz_a -1 ) * \min ( dep_a -1 , k) $ 。

  • a 为 (a,b,c) 中深度最小的节点,即 b 是 a 的儿子。

记 $ son_{a,d} $ 为 a 点的 d 级儿子,此处的 d 级儿子是指在 a 子树内并且深度差等于 d 的点。

对答案的贡献即为 $$ \sum_{d=1}^k \sum_{u \in son_{a,d}} siz_u $$

所以得出,维护第二种情况较为困难。但是这是可以解决的,将子树大小记在对应深度的线段树的节点上,遍历时向上线段树合并即可。


codes

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+100;
typedef long long ll;
inline int read()
{register char c=getchar();int x=0;while(!isdigit(c))c=getchar();while(isdigit(c)){x=(x<<1)+(x<<3)+c-48;c=getchar();}return x;
}struct edge{int y,n;}e[N<<1];struct ques
{int id;int x;
}g[N];int n,q,head[N],cnt;
int siz[N],dep[N],deg[N];
ll ans[N];
vector<ques>h[N];struct segtree
{struct node{ll val;int lc,rc;}s[N<<5];int tot,root[N<<5];void pushup(int i){s[i].val=s[ s[i].lc ].val+s[ s[i].rc ].val;}void upd(int &i,int l,int r,int x,ll z){if(!i)i=++tot;s[i].val+=z;if(l==r)return ;int mid=(l+r)>>1;if(x<=mid)upd(s[i].lc,l,mid,x,z);else upd(s[i].rc,mid+1,r,x,z);pushup(i);}void merg(int &i,int &j,int l,int r)// i <-- j{if(!i || !j){i+=j;return ;}if(l==r){s[i].val+=s[j].val;return ;}int mid=(l+r)>>1;merg(s[i].lc,s[j].lc,l,mid);merg(s[i].rc,s[j].rc,mid+1,r);pushup(i);}ll que(int i,int l,int r,int x,int y){if(!i)return 0;if(l>=x && r<=y)return s[i].val;int mid=(l+r)>>1;ll sum=0;if(x<=mid)sum+=que(s[i].lc,l,mid,x,y);if(y>mid)sum+=que(s[i].rc,mid+1,r,x,y);return sum;}void modi(int u){upd(root[u],1,n,dep[u],siz[u]-1);}void mer(int x,int y){merg(root[x],root[y],1,n);}ll ask(int x,int y){if(dep[x]==n)return 0;return que(root[x],1,n,dep[x]+1,min(dep[x]+y,n));}
}T;void ad(int x,int y)
{e[++cnt].n=head[x];e[cnt].y=y;head[x]=cnt;
}void loading(int u,int fa)
{siz[u]=1;dep[u]=dep[fa]+1;for(int i=head[u],v;i;i=e[i].n){v=e[i].y;if(v==fa)continue;loading(v,u);siz[u]+=siz[v];}T.modi(u);
}void init()
{n=read();q=read();for(int i=1,x,y;i<n;++i){x=read();y=read();ad(x,y);ad(y,x);}loading(1,0);ques node;for(int i=1,x,y;i<=q;++i){x=read();y=read();node.id=i;node.x=y;++deg[x];h[x].push_back(node);}
}void collect(int u,int fa)
{for(int i=head[u],v;i;i=e[i].n){v=e[i].y;if(v==fa)continue;collect(v,u);T.mer(u,v);}for(int i=0;i<deg[u];++i){int id=h[u][i].id;ll nw=h[u][i].x;ans[id]+=(siz[u]-1ll)*min(dep[u]-1ll,nw);ans[id]+=(T.ask(u,nw));}
}void work()
{collect(1,0);for(int i=1;i<=q;++i)printf("%lld\n",ans[i]);
}int main()
{init();work();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890793.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sed undefined label on MacOS, FreeBSD

A quick fix is to prepend your string expression with an empty string: For example: instead of sed -i s/foo/bar/g text.txt write: sed -i s/foo/bar/g text.txtThis should work across different OS (Linux, MacOS, Windows) --dopexxx来源:http://stackoverflow.…

软工作业1:自我介绍+软工5问

这个作业属于哪个课程 软工23级这个作业要求在哪里 自我介绍+软工五问这个作业的目标 熟悉博客园以及Github的相关操作,了解软件工程相关内容1.自我介绍兴趣爱好:羽乒人,爱听歌,电影,楷书,行楷 编程语言:C,JAVA 目标:后端开发2.软工五问软件工程在对就业上的帮助的具体…

对“推箱子”小游戏代码的改进

一.代码来源 https://www.cnblogs.com/heyu123/p/14844284.html 二.运行环境 DEV--C++ 三.原代码及其运行结果 原代码: int map[8][8]={{1,1,1,1,1,1,1,1},//0 空地 {1,0,0,0,1,0,0,1},//1 墙 {1,0,1,0,1,4,3,1},//3 目的地 {1,0,0,0,0,4,3,1},//4 箱子 {1,0,1,0,1,4,3,1},//5…

软件开发与创新课程设计作业——软件逆向设计

一、来源:软件工程2班李鹏飞去年的大作业`点击查看代码 #include <iostream> #include <string> #include <fstream> using namespace std;//定义客户类型 enum eGuestType // 在高版本VS中,需要用enum class,在低版本的vs中,直接用enum也可以 {e_member…

LVI_SAM 虚拟机安装复现(一)

0. 前言 高能警告:LVI_SAM 的安装步骤是繁琐的,一个坑接着一个坑,请预留48+小时的安装时间,和80%以上的san值。非战斗人员请尽快撤离。 预备知识:虚拟机安装步骤,ROS基本概念,Makefile工作原理 没有预备知识的话,也没关系,本文也不会给你解释的( 本文是第一大步骤,即…

大模型--三种三种检索方式-Dense retrieval / Lexical Retrieval / Multi-Vector Retrieval- 44

1. 参考 M3-Embedding https://github.com/FlagOpen/FlagEmbedding https://arxiv.org/pdf/2402.03216 https://huggingface.co/BAAI/bge-m3 2. Dense retrievalimport torch import torch.nn as nnclass DenseRetrieval(nn.Module):def __init__(self, embedding_dim):super(D…

从拉新到留存,用户生命周期分析全流程

已收藏分享从拉新到留存,用户生命周期分析全流程 2025-02-17 17:02人人都是产品经理在当今竞争激烈的市场环境中,理解并管理用户生命周期是实现用户增长和留存的关键。本文将深入剖析用户生命周期的全流程管理,从拉新到留存,详细解读不同业务类型(如消费品、耐用品、平台型…

朴素贝叶斯其实并不朴素

朴素贝叶斯英文名称NaiveBayes,朴素贝叶斯确实nave,但是并不朴素,而是简单,并不是逻辑上面的简单,而是假设上面的简单。 1.贝叶斯公式 ​ 其中: P(C|X)是类C在给定特征X下的后验概率。 P(X|C)是特征X在给定类C下的条件概率,也叫做似然。 P(C)是类C的先验概率。 P(X)是特…

NocoBase 本周更新汇总:新增路由管理

本周更新包括:支持为页面标签页配置权限,新增路由管理页面等。汇总一周产品更新日志,最新发布可以前往我们的博客查看。 NocoBase 目前更新包括的版本更新包括三个分支:main ,next和 develop。main :截止目前最稳定的版本,推荐安装此版本。 next:包含即将发布的新功能,…

AI安全-模型用户输入注入

顾名思义,在调用AI大模型时,根据用户传入的数据,进行AI处理,调用插件,但模型后端需要调用API,API需要传入的username一个小场景,企业微信对话调用AI去修改当前密码 假设开发者设计如下: 用户输入-> AI -> 调用插件修改密码 修改密码插件实现:a.com/change_passw…

基于Microsoft.Extensions.VectorData实现语义搜索

本文介绍了Microsoft.Extensions.Vector的基本概念 和 基本使用,结合Embedding Model(如all-minilm) 和 VectorStore(如Qdrant),我们可以快速实现语义搜索,而不仅仅是关键字匹配。如果你也是.NET程序员希望参与AI应用的开发,那就快快了解和使用基于Microsoft.Extensioi…