2019-2020 ICPC North-Western Russia Regional Contest【部分题解】

本文提供了2019-2020年ICPC North-Western Russia Regional Contest的部分题解,包括'E'题的等距问题,通过换根DP或寻找直径中点的方法解决;'H'题的高负载数据库问题,通过贪心和二分查找优化解决;'I'题的理想金字塔问题,利用四棱锥几何特性求解;以及'J'题的最后一位数字问题,通过图的重建策略避免重复计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

ICPC 2019-2020 North-Western Russia Regional Contest

E:Equidistant

题意:

给定一颗树,再给出 m 个关键点,让你找出一个点使得这个点到 m 个关键点的距离相等

分析:

(1)直观的做法就是换根dp,预处理出每个节点为根时,子树中的关键点到它距离最大值和最小值,次最大值和次最小值,换根dp的时候直接看所有关键点到根的最大值和最小值是否相等

(2)问题可以转换为找到一个点,使得所有关键点到它距离的最大值最小,这个点一定是关键点的直径上的中点,这个点一定是唯一的,先两边 dfs 找到直径,再找到中点,最后判断一下这个中点是否满足题意即可

代码:

#include <bits/stdc++.h>
 
#define f first
#define s second
#define pii pair<int,int>
#define sz(x) (int)(x).size()
#define all(x) (x).begin(),(x).end()
using namespace std;
typedef long long LL;
const int maxn = 2e5+25;
int head[maxn],n,m,u,v,cnt,d[maxn],tag[maxn],p[maxn];
struct edge{
    int to,nxt;
}e[maxn<<1];
inline void add(int u,int v){
    e[++cnt] = (edge){v,head[u]};
    head[u] = cnt;
}
int x,len;
void dfs(int u,int fa,int step){
    if(tag[u]&&step>=len){
        x = u; len = step;
    }
    for(int i = head[u];i > 0;i = e[i].nxt){
        int v = e[i].to; if(v == fa) continue;
        dfs(v,u,step+1);
    }
}
bool flag;
int q[maxn],k;
void dfs2(int u,int fa){
    q[k++] = u;
    if(u =&#
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值