NOIP2023模拟9联测30 金牌

news2024/11/24 11:32:22

题目大意

有一棵 n n n个顶点的树,这棵树上长度为 d d d的简单路径的价值为 2 d 2^d 2d

q q q次询问,每次给出两个正整数 x , y x,y x,y,请你回答所有通过顶点 x x x y y y的简单路径的价值之和,输出答案模 998244353 998244353 998244353后的值。

1 ≤ n , q ≤ 1 0 6 , x ≠ y 1\leq n,q\leq 10^6,x\neq y 1n,q106,x=y

时间限制 1500 m s 1500ms 1500ms,空间限制 512 M B 512MB 512MB


题解

对于每组询问 x , y x,y x,y,设 x x x y y y的路径长度为 d d d,则路径 x , y x,y x,y的价值为 2 d 2^d 2d。设 x x x不经过路径 x − y x-y xy可以到达的部分为 A A A y y y不经过路径 x − y x-y xy可以到达的部分为 B B B


设两个点 u u u v v v的距离为 d i s ( u , v ) dis(u,v) dis(u,v),那么,询问 x , y x,y x,y的答案为:

a n s = ∑ u ∈ A ∑ v ∈ B 2 d + d i s ( u , x ) + d i s ( v , y ) = 2 d × ( ∑ u ∈ A 2 d i s ( u , x ) ) × ( ∑ v ∈ B 2 d i s ( v , y ) ) ans=\sum\limits_{u\in A}\sum\limits_{v\in B}2^{d+dis(u,x)+dis(v,y)}=2^d\times (\sum\limits_{u\in A}2^{dis(u,x)})\times (\sum\limits_{v\in B}2^{dis(v,y)}) ans=uAvB2d+dis(u,x)+dis(v,y)=2d×(uA2dis(u,x))×(vB2dis(v,y))

也就是说,我们只需要求出 ∑ u ∈ A 2 d i s ( u , x ) \sum\limits_{u\in A}2^{dis(u,x)} uA2dis(u,x) ∑ v ∈ B 2 d i s ( v , y ) \sum\limits_{v\in B}2^{dis(v,y)} vB2dis(v,y)即可。

s u m x sum_x sumx表示点 x x x的子树中的每个点到 x x x的距离的二次幂之和, v s x vs_x vsx表示不在 x x x的子树中的点到 x x x的距离的二次幂之和,用一个换根 D P DP DP,做两次 d f s dfs dfs即可。

然后,求出每个询问中 x , y x,y x,y l c a lca lca。如果 x ≠ l c a x\neq lca x=lca y ≠ l c a y\neq lca y=lca,则答案为 2 d × s u m x × s u m y 2^d\times sum_x\times sum_y 2d×sumx×sumy。否则,不妨设 x = l c a x=lca x=lca,则从 y y y往上跳到 d e p x + 1 dep_x+1 depx+1的位置 t t t d e p x dep_x depx表示 x x x的深度),则答案为 2 d × s u m y × ( v s x + s u m x − 2 × s u m t ) 2^d\times sum_y\times (vs_x+sum_x-2\times sum_t) 2d×sumy×(vsx+sumx2×sumt)

用倍增跳 l c a lca lca l c a lca lca下面的点,时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)。因为 n n n的范围比较大,这题常数也大,时间限制还比较小,所以我们考虑优化。

t a r j a n tarjan tarjan l c a lca lca可以将时间复杂度平摊到 O ( n ) O(n) O(n),但求 l c a lca lca下面的点怎么处理呢?我们可以做一次 d f s dfs dfs,记录每个点 i i i当前遍历的是它的哪个儿子的子树,记这个儿子为 t o i to_i toi。那么,对于每一对 x , y x,y x,y,如果 x x x l c a lca lca,则 x x x一定为 y y y的祖先,那么遍历到 y y y时, t o x to_x tox就是 y y y往上跳到 x x x下面一个位置的的点 t t t。这样做的话,时间复杂度平摊下来也是 O ( n ) O(n) O(n)的。

总时间复杂度为 O ( n ) O(n) O(n)

code

#include<bits/stdc++.h>
#define rg register
using namespace std;
const int N=1000000;
const long long mod=998244353;
int n,q,tot=0,d[2*N+5],l[2*N+5],r[N+5],z[N+5],dep[N+5],fa[N+5],to[N+5],lca[N+5];
int tot1=0,d1[2*N+5],l1[2*N+5],r1[N+5],id1[2*N+5];
int tot2=0,d2[N+5],l2[N+5],r2[N+5],id2[N+5];
long long mi[N+5],sum[N+5],vs[N+5],ans[N+5];
struct que{
	int x,y;
}v[N+5];
inline int in(){
	int t=0;
	char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9'){
		t=(t<<3)+(t<<1)+(ch^48);
		ch=getchar();
	}
	return t;
}
inline void add(int xx,int yy){
	l[++tot]=r[xx];d[tot]=yy;r[xx]=tot;
}
inline void add1(int xx,int yy,int zz){
	l1[++tot1]=r1[xx];d1[tot1]=yy;r1[xx]=tot1;id1[tot1]=zz;
}
inline void add2(int xx,int yy,int zz){
	l2[++tot2]=r2[xx];d2[tot2]=yy;r2[xx]=tot2;id2[tot2]=zz;
}
inline void dfs1(int u,int f){
	sum[u]=1;
	dep[u]=dep[f]+1;
	for(rg int i=r[u];i;i=l[i]){
		if(d[i]==f) continue;
		dfs1(d[i],u);
		sum[u]=(sum[u]+2*sum[d[i]])%mod;
	}
}
inline void dfs2(int u,int f){
	for(rg int i=r[u];i;i=l[i]){
		if(d[i]==f) continue;
		vs[d[i]]=(vs[u]+sum[u]-2*sum[d[i]]+2*mod)*2%mod;
		dfs2(d[i],u);
	}
}
inline int find(int ff){
	if(fa[ff]!=ff) fa[ff]=find(fa[ff]);
	return fa[ff];
}
inline void pt(int x,int y){
	int v1=find(x),v2=find(y);
	if(v1!=v2) fa[v1]=v2;
}
inline void dfs3(int u,int f){
	z[u]=1;
	for(rg int i=r[u];i;i=l[i]){
		if(d[i]==f) continue;
		dfs3(d[i],u);
		pt(d[i],u);
	}
	for(rg int i=r1[u];i;i=l1[i]){
		if(z[d1[i]]) lca[id1[i]]=find(d1[i]);
	}
}
inline void dfs4(int u,int f){
	for(rg int i=r2[u];i;i=l2[i]){
		int v=d2[i];
		ans[id2[i]]=sum[u]
			*(vs[v]+sum[v]-2*sum[to[v]]+2*mod)%mod;
	}
	for(rg int i=r[u];i;i=l[i]){
		if(d[i]==f) continue;
		to[u]=d[i];
		dfs4(d[i],u);
	}
}
inline void wt(int wk){
	if(wk>=10) wt(wk/10);
	putchar(wk%10+'0');
}
int main()
{
//	freopen("d.in","r",stdin);
//	freopen("d.out","w",stdout);
	n=in();
	mi[0]=1;
	for(rg int i=1;i<=n;i++) mi[i]=mi[i-1]*2%mod;
	for(rg int i=1,x,y;i<n;i++){
		x=in();y=in();
		add(x,y);add(y,x);
	}
	dfs1(1,0);
	dfs2(1,0);
	q=in();
	for(rg int i=1;i<=q;i++){
		v[i]=(que){in(),in()};
		if(dep[v[i].x]>dep[v[i].y]) swap(v[i].x,v[i].y);
		add1(v[i].x,v[i].y,i);add1(v[i].y,v[i].x,i);
	}
	for(rg int i=1;i<=n;i++) fa[i]=i;
	dfs3(1,0);
	for(rg int i=1;i<=q;i++){
		if(lca[i]==v[i].x) add2(v[i].y,v[i].x,i);
		else ans[i]=sum[v[i].x]*sum[v[i].y]%mod;
	}
	dfs4(1,0);
	for(rg int i=1;i<=q;i++){
		int dis=dep[v[i].x]+dep[v[i].y]-2*dep[lca[i]];
		ans[i]=ans[i]*mi[dis]%mod;
		wt(ans[i]);putchar('\n');
	}
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【kubernetes】k8s对象☞pod

文章目录 1、什么是pod2、pod的使用2.1 用于管理pod的工作负载资源2.2 pod怎样管理多个容器2.3 pod 操作系统2.4 pod和控制器2.5 pod模板 3、pod的更新与替换3.1 资源共享和通信3.2 pod中的存储3.3 pod联网 4、容器的特权模式4.1 linux 特权容器4.2 windows特权容器 5、静态pod…

uniapp之actionsheet 自定义组件

uniapp本身自带的actionsheet太丑&#xff0c;不够美观。闲着也是闲着&#xff0c;自己实现了一个类似的选择器。 支持功能&#xff1a; 1、左对齐 2、右对齐 3、居中 4、可加图标 下面贴出使用教程&#xff1a; <template><view><action-sheet alignment&…

在Google Kubernetes集群创建分布式Jenkins(一)

因为项目需要&#xff0c;在GKE的集群上需要创建一个CICD的环境&#xff0c;记录一下安装部署一个分布式Jenkins集群的过程。 分布式Jenkins由一个主服务器和多个Agent组成&#xff0c;Agent可以执行主服务器分派的任务。如下图所示&#xff1a; 如上图&#xff0c;Jenkins Ag…

大数据毕业设计选题推荐-系统运行情况监控系统-Hadoop-Spark-Hive

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

openGauss学习笔记-112 openGauss 数据库管理-管理用户及权限-行级访问控制

文章目录 openGauss学习笔记-112 openGauss 数据库管理-管理用户及权限-行级访问控制 openGauss学习笔记-112 openGauss 数据库管理-管理用户及权限-行级访问控制 行级访问控制特性将数据库访问控制精确到数据表行级别&#xff0c;使数据库达到行级访问控制的能力。不同用户执…

Github 自动化部署到腾讯云服务器

1.准备工作 新建仓库 新建项目 推送到远程仓库 2.配置仓库密钥 点击 Settings -> Sectets and variables -> Actions -> New repository sectet 依次添加以下变量 Name&#xff1a;SERVER_HOST / Secret&#xff1a;服务器公网IP Name&#xff1a;SERVER_USERNAME /…

软件测试/测试开发丨Python:易学、强大、多用途的编程语言

点此获取更多相关资料 Python 发展历史 Python 是一门高级编程语言&#xff0c;由 Guido van Rossum&#xff08;龟叔&#xff09; 在 1989 年发明&#xff0c;设计 Python 语言的初衷是为了创造一种介于 C 和 shell 之间&#xff0c;简洁方便&#xff0c;易学易用&#xff0…

第十三章,枚举与泛型例题

例题1 package 例题;interface SeasonInterface{//四季接口int SPRING 1, SUMMER 2, AUTUMN 3, WINTER 4; }enum SeasonEnum{//四季枚举SPRING,SUMMER,AUTUMN,WINTER }public class 例题1 {//定义方法public static void printSeason1(int season){switch (season) {case …

MAA连不上MUMU模拟器

之前一直能正常用&#xff0c;最近突然连接不上&#xff0c;最终发现是adb版本不同造成的&#xff0c;我系统变量的adb版本如下&#xff1a; MUMU自带adb版本如下&#xff1a; 解决办法&#xff1a; 把mumu的adb复制到系统变量路径下&#xff0c;或者把adb的系统变量删除

基于OpenHarmony的启航开发板的基础操作

文章目录 前言一、前提准备二、基础操作1.hb set命令的使用2.hb build -f 命令的使用3.Hello World 案例 前言 在物联网&#xff08;IoT&#xff09;领域&#xff0c;开发板扮演着至关重要的角色&#xff0c;为开发人员提供了实验和原型设计的平台。而OpenHarmony作为一个开源…

NOR Flash基本原理

目录 1. Flash Memory中存储的信息 2. Flash操作 2.1 Read操作 2.2 Program操作 2.3 Erase操作 3 电压阈值分布 4 Block Erase 4.1 Pre-Program Phase 4.2 Erase Phase 4.3 Recovery Phase 5 Erase 中断 6 注意要点 这是之前搞Flash IP时的一个学习笔记&#xff0c…

力扣 搜索旋转排序数组 二分

&#x1f468;‍&#x1f3eb; 33. 搜索旋转排序数组 class Solution {public int search(int[] nums, int target){int l 0;int r nums.length - 1;while (l < r){int m l r >> 1;//else大法&#xff0c;把无序段抛给else&#xff0c;if只处理有序段 // 需要特…

Flutter屏幕适配

文章目录 一、Flutter单位二、设备信息三、常见适配方案四、flutter_screenutil 一、Flutter单位 Flutter使用的是类似IOS中的点pt&#xff08;point&#xff09;。 iPhone6的尺寸是375x667&#xff0c;分辨率为750x1334。 iPhone6的dpr( devicePixelRatio ) 是2.0。 DPR 物…

论文 辅助笔记:t2vec train.py

1 train 1.1 加载training和validation数据 def train(args):logging.basicConfig(filenameos.path.join(args.data, "training.log"), levellogging.INFO)设置了日志的基本配置。将日志信息保存到名为 "training.log" 的文件中日志的级别被设置为 INFO&…

Vue动态树、配置请求路径、表格数据显示、实现分页、创建书本管理组件、点击菜单实现路由跳转以及系统首页配置。

目录 1. 准备工作 2. 动态树 2.1 在配置请求路径 2.2 使用动态数据构建导航菜单 2.2.1 通过接口获取数据 2.2.3 通过后台获取的数据构建菜单导航 2.2.3.1 先构建一级导航菜单 2.3 点击菜单实现路由跳转 2.3.1 创建书本管理组件 3. 系统首页配置 4. 表格数据显示 4.…

探密工业互联网网络体系:构建端到端的稳定传输

什么是工业互联网网络&#xff1f; 工业互联网网络是一种将工业设备、传感器和计算机系统连接到一起&#xff0c;以便它们可以共同工作、共享数据和实现更高效的生产和控制。这个网络体系的目标是提高工业过程的效率、可靠性和安全性。 在数字时代的今天&#xff0c;工业互联网…

无广告弹出的便签工具选择哪一款?

广告弹窗&#xff0c;是许多人在日常办公中比较反感的问题&#xff0c;打开一个软件正准备使用时&#xff0c;突然冒出一个广告弹窗&#xff0c;这会给人一种特别反感的情绪&#xff0c;尤其是在专注记录工作任务备忘的时候&#xff0c;意外冒出的广告窗口可真让人心烦。那么&a…

Apple 苹果发布 M3、M3 Pro 和 M3 Max 芯片

本心、输入输出、结果 文章目录 Apple 苹果发布 M3、M3 Pro 和 M3 Max 芯片前言M3、M3 Pro 和 M3 Max 芯片的性能相关资料图M3 Pro规格M3 Max规格弘扬爱国精神 Apple 苹果发布 M3、M3 Pro 和 M3 Max 芯片 编辑&#xff1a;简简单单 Online zuozuo 地址&#xff1a;https://blog…

若依框架中SpringSecurity的实现流程

文章目录 Spring Security概述核心原理 若依Sprint Security分析配置类分析流程分析图过滤器分析 若依登录/退出流程流程图登录退出 写在开头: 本篇博客与核桃共同完成 Spring Security 概述 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c…

go微信开发sdk-简单使用_已设置图床

go微信开发sdk-简单使用 GitHub - silenceper/wechat: WeChat SDK for Go &#xff08;微信SDK&#xff1a;简单、易用&#xff09; 使用的sdk为上述的&#xff0c;这边给出快速的项目实例 git clone https://github.com/gowechat/example.git简单的项目结构 这边简单用dock…