NOIP2023模拟9联测30 金牌

题目大意

有一棵 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.mfbz.cn/a/113200.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【多线程面试题十五】、synchronized可以修饰静态方法和静态代码块吗?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;synchronized可以修饰静…

css图片保持比例and图片占满整个div

一、非背景图 ①保持宽度固定 img { width: 200px; height: auto; } ②保持高度固定 img { height: 300px; width: auto; } ③保持比例 /* 比例不变 */ img { max-width: 100%; height: auto; } /* 垂直居中 */ img { max-width: 100%; height: auto; display: block; margin:…

【JMeter】插件管理工具

1. 官方下载地址 Documentation :: JMeter-Plugins.org 2.安装 将该插件的jar包移动到lib/ext下 3.重启JMeter就可以看到插件管理器 4. 安装&#xff0c;更新&#xff0c;删除插件 安装插件 删除插件 更新插件

Vue3.0 toRef toRefs :VCA模式

简介 作用&#xff1a; 创建一个ref对象&#xff0c;其value值指向另一个对象中的某个属性 语法&#xff1a; const name toRef(person, name) 应用&#xff1a; 要将响应式对象中的某个属性单独供应给外部使用时 扩展&#xff1a; toRefs与toRef功能一致&#xff0c;但可…

“排队领奖,购物狂欢!开启全新商业模式

欢迎来到这个充满惊喜的商业模式——工会排队奖励模式&#xff01;在这个时代&#xff0c;你是否感到购物和消费的乐趣被平淡无奇的模式所限制&#xff1f;那么&#xff0c;这个全新的商业模式将带你进入一个充满刺激和惊喜的世界&#xff01; 想象一下&#xff0c;当你购物时&…

分类预测 | Matlab实现KOA-CNN-LSTM-selfAttention多特征分类预测(自注意力机制)

分类预测 | Matlab实现KOA-CNN-LSTM-selfAttention多特征分类预测&#xff08;自注意力机制&#xff09; 目录 分类预测 | Matlab实现KOA-CNN-LSTM-selfAttention多特征分类预测&#xff08;自注意力机制&#xff09;分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Mat…

web3 在React dapp中全局管理web3当前登录用户/智能合约等信息

上文 Web3 React项目Dapp获取智能合约对象我们在自己的前端dapp项目中链接获取到了 自己的智能合约 我们继续 我们还是先启动ganache环境 终端输入 ganache -d然后发布一下我们的智能合约 打开我们的合约项目 终端输入 truffle migrate --reset这样 我们的智能合约就部署到区…

智能井盖传感器推荐,万宾科技助力城市信息化建设

随着科技产品更新换代进程加快&#xff0c;人工智能在人们日常生活之中逐渐普及开来&#xff0c;深入人们生活的方方面面&#xff0c;影响城市基础设施建设工程。例如在大街小巷之中的井盖作为城市基础建设的一个重要部分&#xff0c;一旦出现松动倾斜或凸起等异常问题&#xf…

SECS/GEN HSMS半导体通信协议解析

协议族总体结构 HSMS消息格式&#xff08;网口连接&#xff09; 超时时间设置 T3 回复超时&#xff1a;指发送指令到接收到回复指令的最大时间&#xff1b; T5 连接间隔&#xff1a;指断开连接和重新连接的最小时间&#xff1b; T6 控制指令超时时间&#xff1a;主要指连接选…

5.1 运输层协议概述

思维导图&#xff1a; 前言&#xff1a; 第5章 运输层笔记 1. 概览 主要内容&#xff1a;介绍运输层协议的特点、进程间通信、端口、UDP和TCP协议、可靠传输、TCP报文段的首部格式、TCP的关键概念&#xff08;如滑动窗口、流量控制、拥塞控制和连接管理&#xff09;。重要性…

从JDBD的封装方面重新认识Mybaits

前言&#xff1a;SQLSession是对JDBC的封装 MyBatis 是一个 Java 持久化框架&#xff0c;它通过对 JDBC 的封装来简化数据库访问操作。核心的 SQLSession 对象是 MyBatis 的核心组件之一&#xff0c;负责管理数据库连接、执行 SQL 语句以及映射查询结果等功能。 具体来说&…

2023年【山东省安全员C证】考试资料及山东省安全员C证模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员C证考试资料是安全生产模拟考试一点通生成的&#xff0c;山东省安全员C证证模拟考试题库是根据山东省安全员C证最新版教材汇编出山东省安全员C证仿真模拟考试。2023年【山东省安全员C证】考试资料及山东省…

再谈jdk的代理

文章迁移自语雀。 其实jdk的代理模式已经说了很多次了,现在是北京时间2020年2月16日23:15:06, 躺在床上打字,手冰冷的,写完这个总结就睡觉的. 现在手感觉没啥知觉了, 好冷, 现在是2020年2月16日23:50:51., 写了45分钟. 关电脑准备睡觉,明天看jdk的动态代理实现,学习大师的作品…

uniapp 编译到模拟器(mumu)

一开始我是用逍遥模拟器&#xff0c;但这个玩意突然不好使了&#xff0c;一直加载卡在这页面 1、下载 官网下载&#xff1a;mumu模拟器12 2、打开mumu多开器&#xff0c;在右上角adb查看端口号 3、打开mumu模拟器 4、打开HBuiderX 工具—设置—运行配置 5、配置电脑的系统…

驱动开发11-1 编写IIC驱动-读取温湿度数据

头文件 head.h #ifndef __HEAD_H__ #define __HEAD_H__ #define GET_HUM _IOR(m, 1, int) #define GET_TEM _IOR(m, 0, int) #endif 应用程序 si7006.c #include <stdlib.h> #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #inc…

「更新」Macos屏幕录像工具:ScreenFlow

mac电脑屏幕截图工具哪个好&#xff1f;ScreenFlow是Mac上的一款优秀的屏幕录像软件&#xff0c;它不仅具有屏幕录制功能&#xff0c;还具有视频编辑功能。以下是对ScreenFlow的一些详细介绍&#xff1a; 首先&#xff0c;ScreenFlow可以捕获摄像机、麦克风和计算机音频&#…

Redis中String类型的命令

目录 Redis中的内部编码 redis的数据结构和内部编码 Redis中的String类型 String类型的常见命令 set get mget mset String类型的计数命令 incr incrby decr incrbyfloat 其他命令 append getrange setrange strlen String类型的内部编码 Redis中的内部编码…

win10-mmgen安装/cyclegan运行问题记录

mmconda环境&#xff1a; conda&#xff1a; CUDA 11.3 conda install pytorch1.11.0 torchvision0.12.0 torchaudio0.11.0 cudatoolkit11.3 -c pytorch pip install mmcv-full1.5.0 -f https://download.openmmlab.com/mmcv/dist/cu113/torch1.11.0/index.html 成功运行 c…

无需使用jadx-gui和mac电脑获取app备案公钥的方法

由于2023年&#xff0c;国家要求上架的app必须备案&#xff0c;因此app备案成为了很多公司迫切的需求。 备案的时候&#xff0c;需要填写app公钥&#xff0c;MD5值等参数&#xff0c;这些参数对于不熟悉加密技术的人来说&#xff0c;简直是无从下手&#xff0c;因为目前的开发…

安防视频监控平台EasyCVR出现目录在线,通道离线的问题该如何解决?

视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能…
最新文章