GJOI 5.27 题解

article/2025/8/22 5:51:40

1.洛谷 P8981 距离

参考了这篇题解,我的比较口胡。

题意

给以一颗含有 n n n 个节点的树,定义树上任意两点的 u , v u,v u,v 之间的距离 d u , v d_{u,v} du,v 为两点之间点的数量。

如果树上两点 u , v u,v u,v 满足,对于树上的任意节点 x x x,都满足 d ( u , x ) ≤ d ( u , v ) d(u,x)\le d(u,v) d(u,x)d(u,v),并且满足 d ( x , v ) ≤ d ( u , v ) d(x,v)\le d(u,v) d(x,v)d(u,v),那么我们称无序对 ( u , v ) (u,v) (u,v) 为好点对。

树上每个节点 i i i 都有一个点权 v i v_i vi v i v_i vi 的值为两点之间的最短路径经过 i i i 的好点对的数量。求 ∑ i = 1 n v i k m o d 998244353 \displaystyle\sum_{i=1}^n {v_i}^k \bmod998244353 i=1nvikmod998244353

1 ≤ n ≤ 5000000 1\le n\le 5000000 1n5000000 k ∈ { 1 , 2 } k\in\{1,2\} k{1,2}

思路

容易想到,好点对只能是直径的两端点,因为在树上直径是能出现的最长长度了。题目转化为每个点被直径覆盖的次数。

有一个性质,就是若树上所有边边权均为正,则树的所有直径中点重合。那么我们考虑将直径中点 M i d Mid Mid 提到根去,因为所有直径都会过 M i d Mid Mid 这个点。

我们计算每个节点 i i i 最多可以向下延伸多少个节点 m d i s i mdis_i mdisi,以及这种长度的数量 n u m i num_i numi。中点可能有两个?分类讨论。先考虑计算,除 M i d Mid Mid 外所有节点的覆盖次数,我们统计最长路和次长路的总条数 c n t 1 , c n t 2 cnt1,cnt2 cnt1,cnt2,对于 M i d Mid Mid 的儿子们:

  • 当直径为奇数个点时,中点只有一个。此时中点的孩子的 m d i s mdis mdis 应该都是一样的;

  • 当直径为偶数个点时,此时中点的孩子中,会有且仅有一个孩子的 m d i s mdis mdis 比其他孩子大 1 1 1。这时经过中点的直径数量就应该是这个特殊孩子的 n u m num num 与其他孩子的 n u m num num 的乘积。

遍历下面的其他节点处理完 M i d Mid Mid 和儿子就能遍历其他的节点了。

注意勤取模。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=5e6+9,mod=998244353;
ll n,k;
ll idx,head[N];
struct edge
{ll to,next;
}e[N<<1];
void addedge(ll u,ll v)
{idx++;e[idx].to=v;e[idx].next=head[u];head[u]=idx;
}
ll dis[N],d1,d2,D;
void dfs1(ll u,ll fa)
{if(dis[u]>dis[d1])d1=u;for(int i=head[u];i;i=e[i].next){ll v=e[i].to;if(v==fa)continue;dis[v]=dis[u]+1;dfs1(v,u);}
}
ll fat[N];
void dfs2(ll u,ll fa)
{fat[u]=fa;if(dis[u]>dis[d2]){d2=u;D=dis[u];}for(int i=head[u];i;i=e[i].next){ll v=e[i].to;if(v==fa)continue;dis[v]=dis[u]+1;dfs2(v,u);}
}
ll mdis[N],num[N];
//以中点为根,节点i向下能走最长距离及其数量 
ll V[N];
void dp(ll u,ll fa)
{mdis[u]=1,num[u]=1;for(int i=head[u];i;i=e[i].next){ll v=e[i].to;if(v==fa)continue;dp(v,u);if(mdis[u]<mdis[v]+1){mdis[u]=mdis[v]+1;num[u]=num[v]; }else if(mdis[u]==mdis[v]+1)num[u]+=num[v];}
}
ll ans;
void dfs3(ll u,ll fa,ll w)
{if(k==1)ans=(ans+w*num[u]%mod)%mod;else ans=(ans+w*num[u]%mod*w%mod*num[u]%mod)%mod;for(int i=head[u];i;i=e[i].next){ll v=e[i].to;if(v==fa||mdis[u]!=mdis[v]+1)continue;//并非长链 dfs3(v,u,w);}
}
int main()
{scanf("%lld%lld",&n,&k);if(n==1){puts("0");return 0;}if(n==2){puts("2");return 0;}for(int i=1;i<n;i++){ll u,v;scanf("%lld%lld",&u,&v);addedge(u,v);addedge(v,u);}dfs1(1,0);dis[d1]=0;dfs2(d1,0);ll Mid=d2;for(int i=1;i<=(D+1)/2;i++)Mid=fat[Mid];dp(Mid,0);ll cnt1=0,cnt2=0;for(int i=head[Mid];i;i=e[i].next){ll v=e[i].to;if(mdis[v]==D/2)cnt1+=num[v];else if(mdis[v]>D/2)cnt2+=num[v];}
//	cout<<cnt1<<" "<<cnt2<<endl;
//	分类讨论Midll VMid=0;if(D&1){for(int i=head[Mid];i;i=e[i].next){ll v=e[i].to;if(mdis[v]>D/2)V[v]=cnt1;else if(mdis[v]==D/2)V[v]=cnt2;}VMid=cnt1*cnt2%mod;}else //中点有两个 {for(int i=head[Mid];i;i=e[i].next){ll v=e[i].to;if(mdis[v]==D/2)V[v]=cnt1-num[v];}ll tem=cnt1;for(int i=head[Mid];i;i=e[i].next){ll v=e[i].to;if(mdis[v]==D/2){tem-=num[v];VMid=(VMid+tem*num[v]%mod)%mod; }}}//计算Mid外其他节点for(int i=head[Mid];i;i=e[i].next){ll v=e[i].to;if(mdis[v]>=D/2)dfs3(v,Mid,V[v]);}if(k==1)ans=(ans+VMid)%mod;else ans=(ans+VMid*VMid%mod)%mod;printf("%lld",ans);return 0;
}

2.SMOJ 任务兼容

题意

你有一个由 n n n 个任务组成的列表,每个任务有一个对应的难度值。你需要将这些任务划分为若干个组,每组至少包含两个任务。划分需要满足以下条件:

  1. 每组任务必须是连续的。第一组任务必须从第一个任务开始,最后一组任务必须以最后一个任务结束。

  2. 相邻的组之间必须连续,即第 i 组的最后一个任务的下一个任务必须是第 i+1 组的第一个任务。

  3. 每组内的每个任务必须至少有一个其他任务与它“兼容”。两个任务兼容的条件是它们的难度值的最大公约数不为 1 1 1

你的目标是找到满足条件的最大组数。如果无法满足条件,则输出 − 1 -1 1

思路

感觉对了,但只有 89pts \text{89pts} 89pts 捏。

考虑 Θ ( n 2 ) \Theta(n^2) Θ(n2) 做法,设一维状态: f i f_i fi 表示最后一组以 i i i 结尾的最大组数,我们要枚举一个 j j j 使 j ∼ i j\sim i ji 成为一组,然后 f i = max ⁡ { f j − 1 } + 1 f_i=\max\{f_{j-1}\}+1 fi=max{fj1}+1

我们考虑怎么 Θ ( 1 ) \Theta(1) Θ(1) 判定 j ∼ i j\sim i ji 可以成为一组。

我们 Θ ( n 2 ) \Theta(n^2) Θ(n2) 算出每个数左右最近的非互质数的位置,记作 p r e i , n x t i pre_i,nxt_i prei,nxti。对于左端点 j j j,如果 n x t j < i nxt_j<i nxtj<i,那么需要有 p r e j pre_j prej 出现。其实这是改变了新组的最右左端点。考虑更新这个东西,记作 m i mi mi,更新后如果 j ≤ m i j\le mi jmi,那么 j ∼ i j\sim i ji 可以成为新的一组。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=2003,inf=0x3f3f3f3f;
ll n,k,a[N];
ll pre[N],nxt[N];
ll f[N];
int main()
{scanf("%lld",&n);if(n==1){puts("-1");return 0;}for(int i=1;i<=n;i++)scanf("%lld",&a[i]),f[i]=-inf;for(int i=1;i<=n;i++){pre[i]=-inf;nxt[i]=inf;for(int j=i-1;j>=0;j--){if(__gcd(a[i],a[j])>1){pre[i]=j;break;}}for(int j=i+1;j<=n;j++){if(__gcd(a[i],a[j])>1){nxt[i]=j;break;}}}
//	for(int i=1;i<=n;i++)
//	cout<<i<<" "<<pre[i]<<" "<<nxt[i]<<endl; for(int i=1;i<=n;i++){ll mi=inf;for(int j=i;j>=1;j--){if(nxt[j]>i)mi=min(mi,pre[j]);if(i!=1&&mi>=j)f[i]=max(f[i],f[j-1]+1)/*,cout<<"f["<<i<<"] <= f["<<j-1<<"]+1="<<f[j-1]+1<<endl*/; }//	cout<<f[i]<<" ";}
//	for(int i=1;i<=n;i++)
//	cout<<f[i]<<" ";if(f[n]==-inf)puts("-1");else printf("%lld",f[n]);return 0;
}

3.CF1515E Phoenix and Computers

题意

在这里插入图片描述
3 ≤ n ≤ 400 3\le n\le 400 3n400 M ∈ [ 10 8 , 10 9 ] M\in[10^8,10^9] M[108,109]

思路

一道好玩的计数题。

我们观察左右电脑打开后,这些电脑的打开方式:

  • 一段电脑 1 ∼ A 1 − 1 1\sim A_1-1 1A11 被手动打开, A 1 A_1 A1 被自动打开;
  • A 1 + 1 ∼ A 2 − 1 A_1+1\sim A_2-1 A1+1A21 被手动打开, A 2 A_2 A2 被自动打开;
  • ……;
  • A m − 1 + 1 ∼ A m − 1 A_{m-1}+1\sim A_m-1 Am1+1Am1 被手动打开, A m A_m Am 被自动打开;
  • A m + 1 ∼ n A_m+1\sim n Am+1n 被手动打开( A m + 1 ≤ n A_m+1\le n Am+1n)。

简要地说,就是一段被手动打开,接着一个被自动打开的,再接一段手动打开的。

我们设连续 k k k 个全都手动打开的方案数为 g k g_k gk f i , j f_{i,j} fi,j 表示前 i i i 台电脑手动打开了 j j j 台的方案数,我们考虑枚举一段有 k k k 台手动打开的电脑,最前面有一台自动打开的,那么将从 f i − k − 1 , j − k f_{i-k-1,j-k} fik1,jk 转移过来。

在所有连续打开的 j j j 台中,选择将要手动打开的 k k k 台,即 ( j k ) \dbinom{j}{k} (kj);然后开 k k k 台方案数为 g k g_k gk,那么有转移方程:
f i , j ← f i − k − 1 , j − k × ( j k ) × g k f_{i,j}\leftarrow f_{i-k-1,j-k}\times\binom{j}{k}\times g_k fi,jfik1,jk×(kj)×gk

答案就是 ∑ i = 1 n f n , i \displaystyle\sum_{i=1}^n f_{n,i} i=1nfn,i

我们现在再来考虑 g k g_k gk 怎么算。我们枚举中间开了哪一台,然后向两边扩展;从 x x x 开始开,对于 x x x 右边的电脑, 它们的相对开机顺序必须是 x + 1 , x + 2 , . . . , n x+1,x+2,...,n x+1,x+2,...,n 对于 x x x 左边的电脑,它们的相对开机顺序必须是 x − 1 , x − 2 , . . . , 1 x−1,x−2,...,1 x1,x2,...,1。两边的开机顺序是可以穿插(合并)在一起的。即:
g k = ∑ i = 1 k ( k − 1 k − i ) g_k=\sum_{i=1}^k \binom{k-1}{k-i} gk=i=1k(kik1)

记得勤取模。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N=405,inf=0x3f3f3f3f;
ll n,mod;
ll f[N][N],g[N];
ll C[N][N];
void init()
{for(int i=0;i<N;i++)C[i][0]=C[i][i]=1;for(int i=1;i<N;i++)for(int j=1;j<i;j++)C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
int main()
{scanf("%lld%lld",&n,&mod);init();for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)g[i]=(g[i]+C[i-1][i-j])%mod;for(int i=1;i<=n;i++)//前i台电脑 {f[i][i]=g[i];for(int j=1;j<i;j++)//手动开j台  for(int k=1;k<j;k++)//一段k台被手动打开 f[i][j]=(f[i][j]+f[i-k-1][j-k]*g[k]%mod*C[j][k]%mod)%mod;}ll ans=0;for(int i=1;i<=n;i++)ans=(ans+f[n][i])%mod;printf("%lld",ans);return 0;
}

4.洛谷 P3976 TJOI2015 旅游

题意

P3976 [TJOI2015] 旅游

题目描述

为了提高智商,ZJY 准备去往一个新世界去旅游。这个世界的城市布局像一棵树,每两座城市之间只有一条路径可以互达。

每座城市都有一种宝石,有一定的价格。ZJY 为了赚取最高利益,她会选择从 A 城市买入再转手卖到 B 城市。

由于ZJY买宝石时经常卖萌,因而凡是 ZJY 路过的城市,这座城市的宝石价格会上涨。让我们来算算 ZJY 旅游完之后能够赚取的最大利润。(如 A 城市宝石价格为 v v v,则ZJY出售价格也为 v v v)

1 ≤ n , q ≤ 5 × 10 4 1\le n,q \le 5\times 10^4 1n,q5×104,在任何时刻任何城市的宝石价格都不超过 10 9 10^9 109

思路


http://www.hkcw.cn/article/oylVnbRijt.shtml

相关文章

多名歌手演唱会宣布延期 为高考让路

5月27日晚,张学友东莞演唱会主办方广州禾光飞扬文化通过其公众号发布通告,原定于6月6日到8日的演唱会因与高考时间重合,延期至8月29日到31日。此前,有网民质疑演唱会和高考时间重叠是否合适,担心会对附近考点产生影响。在东莞市有关部门主办的“阳光热线问政平台”上,已有…

数据库管理与高可用-MySQL索引和事务

目录 #1.1MySQL索引介绍 1.1.1索引概述 1.1.2索引作用 1.1.3索引的分类 1.1.4创建索引的原则依据 1.1.5查看索引 1.1.6删除索引 #2.1MySQL事务 2.1.1事务概述 2.1.2事务满足的条件 2.1.3MySQL事务的示例 1.1MySQL索引介绍 索引是 MySQL 中一种用于快速查询和检索数据的数据结…

父母离世失联独子想继承遗产 不孝子被剥夺继承权

父母离世失联独子想继承遗产 不孝子被剥夺继承权!一个人必须赡养父母,因为这是一种责任与义务。5月29日,媒体报道了一起案例,一名男子在1992年与父母争吵后离家出走,对父母不管不问,甚至怀恨在心,非常不孝。父母去世后,亲属打电话通知他回来见最后一面,但他拒绝了。令…

pikachu靶场通关笔记07 XSS关卡03-存储型XSS

目录 一、XSS 二、存储型XSS 三、源码分析 四、渗透实战 1、输入mooyuan试一试 2、注入Payload 3、查看数据库 4、再次进入留言板页面 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#xff0c;通过对XSS关卡源码的代码审计找到XSS风险的…

Windows【基础操作1】

目录 前言&#xff1a; 二、Windows磁盘管理 1.磁盘分区 2.磁盘管理 总结 前言&#xff1a; 好 上一篇我讲了关于windows文件夹的操作以及一些属性知识什么的 我们这里就接着上一篇最后留下的问题来讲解 好 我们开始讲解的是windows 的磁盘 一、磁盘是什么&#xff1f; W…

英国人为抢Labubu大打出手 潮流玩具引发全球热潮

英国人为抢Labubu大打出手 潮流玩具引发全球热潮!泡泡玛特旗下的IP“Labubu”从一款小众设计师玩具迅速成长为国际潮流偶像。最新上市的Labubu系列在美国、英国等地经常几分钟内售罄。由于需求旺盛,伦敦斯特拉特福德韦斯特菲尔德购物中心甚至发生斗殴事件。部分零售专家警告,…

数据仓库分层 4 层模型是什么?

企业每天都在产生和收集海量数据。然而&#xff0c;面对这些数据&#xff0c;许多企业却陷入了困境&#xff1a;如何高效管理、处理和分析这些数据&#xff1f;如何从数据中提取有价值的信息来支持业务决策&#xff1f;这些问题困扰着众多数据分析师和 IT 管理者。 在众多架构…

Transformer模型:多头注意力机制深度解析

在多头注意力机制里&#xff0c;输入的查询&#xff08;Query&#xff09;、键&#xff08;Key&#xff09;和值&#xff08;Value&#xff09;会被投影到多个子空间&#xff08;头&#xff09;进行并行计算&#xff0c;每个头关注输入序列的不同方面。在所有头的注意力计算完成…

刑拘!男子在家自学制售假币还收徒 网络“发财”梦破灭

七星关公安分局经侦大队民警在洪山街道虎踞路将涉嫌制售假币的余某抓获。在余某住处,警方收缴了464张假币以及电脑、打印机等制作工具。据余某交代,他在某APP上浏览时收到一条陌生人私信,得知有制作假币这条“发财”路。经过详细了解后,余某根据对方教授的步骤,在某软件上…

02.K8S核心概念

服务的分类 有状态服务&#xff1a;会对本地环境产生依赖&#xff0c;例如需要把数据存储到本地磁盘&#xff0c;如mysql、redis&#xff1b; 无状态服务&#xff1a;不会对本地环境产生任何依赖&#xff0c;例如不会存储数据到本地磁盘&#xff0c;如nginx、apache&#xff…

搭建MQTT服务器

搭建MQTT服务器 安装EMQX命令配置 EMQX Apt 源&#xff1a;安装 EMQX启动 EMQX 卸载EMQX登录EMQX控制台开放端口打开测试MQTT通信 MQTT客户端测试添加客户端认证配置 客户端授权配置API接口说明安装MySQL数据库1. 下载 MySQL APT 配置包2. 安装仓库配置包3. 更新系统包索引4. 安…

【博客系统】博客系统第十一弹:部署博客系统项目到 Linux 系统

搭建 Java 部署环境 apt apt&#xff08;Advanced Packaging Tool&#xff09;是 Linux 软件包管理工具&#xff0c;用于在 Ubuntu、Debian 和相关 Linux 发行版上安装、更新、删除和管理 deb 软件包。 大多数 apt 命令必须以具有 sudo 权限的用户身份运行。 apt 常用命令 列出…

如何利用categraf的exec插件实现对Linux主机系统用户及密码有效期进行监控及告警?

需求描述 Categraf作为夜莺监控平台的数据采集工具&#xff0c;为了保障Linux主机的安全&#xff0c;需要实现对系统用户密码有效期的监控&#xff0c;并在密码即将到期时及时告警&#xff0c;以提醒运维人员更改密码。本章将详细介绍如何利用Categraf的exec插件来实现这一功能…

Houdini POP入门学习02

本篇继续随教程学习POP&#xff0c;并附带学习一些wrangle知识点等。 1.新建空项目&#xff0c;添加Geometry sphere小球。 2.连接popnet&#xff0c;现在粒子随小球形态发射 3.双击进入popnet&#xff0c;在wire_pops_into_here处连接popwind&#xff0c;添加风力 4.设置Wind…

《藏海传》平津侯被斩首!着实让人恨的牙痒痒

《藏海传》平津侯被斩首。藏海传演到今天,目前最大的反派就是平津侯,他霸道强势,杀人如麻,掌控许多人的命运,又有实力派演员黄觉演绎,着实让人恨的牙痒痒。平津侯名字庄芦隐,战功赫赫,他一副正义凛然不信鬼神之说的样子,其实并不是。他逼杀藏海父母,都知道是为了癸玺…

哪吒汽车总部LOGO被连夜拆除?公司回应!原CEO张勇名下超4000万股权被冻结 搬迁与股权冻结引关注

哪吒汽车上海总部外墙的“哪吒汽车”LOGO已被拆除,一同被拆除的还有位于总部的哪吒体验中心标志。据透露,拆除原因是场地到期,公司即将搬家。具体的新办公室地址尚未公布。哪吒汽车原CEO张勇名下股权被冻结,金额为4050万元,冻结期限从2025年5月13日至2028年5月12日。张勇是…

特朗普政府请求上诉法院暂停关税裁决 裁决暂时搁置

5月29日,美国联邦巡回上诉法院批准了特朗普政府的请求,暂时搁置了美国国际贸易法院此前做出的禁止执行依据《国际紧急经济权力法》对多国加征关税措施的裁决。联邦巡回上诉法院表示,在审议相关动议文件期间,美国国际贸易法院在这些案件中作出的判决和永久性禁令将暂时中止,…

禁招国际生案哈佛再获胜 美政府改立场

禁招国际生案哈佛再获胜 美政府改立场提出“30天限期”当地时间29日,美国马萨诸塞州联邦地区法院一名法官批准了哈佛大学提出的发布初步禁令请求,“叫停”特朗普政府取消哈佛大学招收外国学生资质的政策。该法院法官艾莉森伯勒斯29日就该案举行听证会。法院网站最新信息显示,…

中国对沙特等4国试行免签!欢迎说走就走的中国行

5月28日,外交部发言人毛宁主持例行记者会。有记者提问称,中方在东盟-中国-海合会峰会期间宣布对沙特等四国试行免签政策,希望了解具体情况。毛宁表示,为便利中外人员往来,中方决定扩大免签国家范围。自2025年6月9日至2026年6月8日,对沙特、阿曼、科威特、巴林持普通护照人…

【Unity基础】Unity新手实战教程:用ScriptableObject控制Cube颜色

目录 项目概述&#x1f6e0;️ 完整操作步骤&#xff08;10分钟内完成&#xff09;步骤1&#xff1a;创建ScriptableObject类步骤2&#xff1a;创建颜色配置资产步骤3&#xff1a;创建Cube控制器步骤4&#xff1a;设置场景和Cube步骤5&#xff1a;添加简单UI提示步骤6&#xff…