题解:AT_abc307_f [ABC307F] Virus 2

news/2025/11/2 22:15:15/文章来源:https://www.cnblogs.com/CharlieCai/p/19185537

思路

考虑模拟传染过程,对于每一个已经被感染的点(下文称为当前点),遍历其能到达的点(下文称为新点),记这条边的边权为 \(w\),分为以下两步:

  1. 判断新点能否和当前点在同一天内被感染;

  2. 若不能,则从当前点被感染的天数(记为 \(t\))向后找,找到最小的 \(i\) 使得 \(i > t\)\(X_i \ge w\)\(i\) 即为新点被感染的时间。

对于第一种情况,可以把上一天被感染的点看做起点跑最短路,若新点的 \(dis\) 小于等于 \(X_t\),则可以在同一天内被感染。

对于第二种情况,显然暴力查找会超时,考虑二分,每次二分时检查数组 \(X\) 在区间 \([l,mid]\) 的最大值,若该值大于等于 \(w\) 则说明答案在区间 \([l,mid]\) 中,否则在区间 \([mid+1,r]\) 中。使用 ST 表维护静态区间最大值即可。

注意处理时先处理更早被感染的点,以及每个点只能入队一次,保证复杂度正确。

代码

#include<bits/stdc++.h>
#define int long long
#define MAXN 1000005
#define pi pair<int,pair<int,int> >
#define mk make_pair
#define lson root<<1
#define rson root<<1|1
using namespace std;
const int inf=1e18;
int n,m,k,cnt,head[MAXN],d,ans[MAXN],a[MAXN],t[MAXN],dis[MAXN],maxn[MAXN][25],lg[MAXN],vis[MAXN];
void build(){lg[1]=0;for(int i=2;i<=d;i++){lg[i]=lg[i>>1]+1;}for(int i=1;i<=d;i++)maxn[i][0]=t[i];for(int i=1;i<=23;i++){for(int j=1;j+(1<<i)<=d+1;j++){maxn[j][i]=max(maxn[j][i-1],maxn[j+(1<<(i-1))][i-1]);}}
}
int query(int l,int r){int tmp=lg[r-l+1];return max(maxn[l][tmp],maxn[r-(1<<tmp)+1][tmp]);
}
int check(int w,int l){int r=d,mid,tans=inf;if(l>r)return inf;while(l<=r){mid=(l+r)>>1;if(query(l,mid)>=w){tans=mid;r=mid-1;}else{l=mid+1;}}return tans;
}
struct Edge{int value,next,w;
}edge[MAXN];
void addedge(int u,int v,int w){edge[++cnt].value=v;edge[cnt].next=head[u];edge[cnt].w=w;head[u]=cnt;
}
void bfs(){priority_queue<pi,vector<pi>,greater<pi> >q;for(int i=1;i<=k;i++)ans[a[i]]=0,dis[a[i]]=0,q.push(mk(0,mk(0,a[i])));while(!q.empty()){int tmp=q.top().first,x=q.top().second.second;q.pop();if(vis[x])continue;vis[x]=1;for(int i=head[x];i;i=edge[i].next){int y=edge[i].value,w=edge[i].w;if(ans[y]>tmp&&dis[x]+w<=t[tmp]){ans[y]=tmp;dis[y]=dis[x]+w;q.push(mk(tmp,mk(dis[y],y)));}else if(ans[y]==tmp&&dis[x]+w<dis[y]){dis[y]=dis[x]+w;q.push(mk(tmp,mk(dis[y],y)));}else{int ntmp=check(w,tmp+1);if(ntmp==inf)continue;if(ntmp<ans[y]){ans[y]=ntmp;dis[y]=w;q.push(mk(ntmp,mk(dis[y],y)));}else if(ntmp==ans[y]&&w<dis[y]){dis[y]=w;q.push(mk(ntmp,mk(dis[y],y)));}}}}
}
inline int read(){int x=0,f=1;char ch=getchar();while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*f;
}
signed main(){
//	freopen("virus.in","r",stdin);
//	freopen("virus.out","w",stdout);n=read(),m=read();for(int i=1;i<=m;i++){int u,v,w;u=read(),v=read(),w=read();addedge(u,v,w),addedge(v,u,w);}k=read();for(int i=1;i<=k;i++)a[i]=read();d=read();for(int i=1;i<=d;i++)t[i]=read();t[0]=-inf;for(int i=1;i<=n;i++)ans[i]=inf,dis[i]=inf;build();bfs();for(int i=1;i<=n;i++)printf("%lld\n",ans[i]==inf?-1:ans[i]);return 0;
}

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

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

相关文章

题解:CF291E Tree-String Problem

题意 给定一棵树,树的边上有字符串,字符串可以按照由父亲到儿子的方向拼接,求模式串 \(t\) 出现的次数。 思路 直接使用哈希。提前预处理出模式串 \(t\) 对应的哈希值,在搜索时计算当前点到儿子之间的边上的字符串…

java操作sip

1|0一、基础理论介绍 1|11.1 sip的主要功能 SIP的主要功能是允许用户或设备通过消息传递来产生互动,这些消息可以满足以下四种目的:用户向系统注册; 邀请用户参加互动会议; 协商会议媒体内容的格式; 建立两端点或…

CH59X/CH58X蓝牙主机设置白名单

可以通过白名单只扫描、连接特定的蓝牙设备(白名单中列出的)。 一、首先将白名单使能,通过宏开启// TRUE to use white list during discovery #define DEFAULT_DISCOVERY_WHITE_LIST 1//FALSE// TRUE to us…

题解:CF712D Memory and Scores

题意 有两个整数 \(a,b\),进行 \(t\) 轮操作,每轮操作先在 \([-k,k]\) 范围内取一个整数加到 \(a\) 中,再在 \([-k,k]\) 范围内取一个整数加到 \(b\) 中,求最终使 \(a > b\) 的方案数。 思路 记 \(a\) 增加的总…

思维的断章,觉知的永恒:一个基于“内观照叙事模型”的认知革命与跨学科范式重构

思维的断章,觉知的永恒:一个基于“内观照叙事模型”的认知革命与跨学科范式重构 笔者:岐金兰 日期:2025年11月2日 摘要 本文基于《一个灵感:思维的断章——内观照中的叙事》所提出的“觉知背景场思维模型”,进行…

拾壹月贰

csp 总结 发现解压密码是滕王阁序? 有点进步但没啥用(没体现在分数上,进步太小) \(T1\) 想到反悔贪心但是思路过于复杂,维护的东西太多,下次对于这种第一题(绿),可以慢点想想有没有简化的思路, 故赛时写了 \…

struct page

/** 系统中的每一个物理页(physical page)都对应一个 struct page 结构,* 用于追踪该页当前的用途。注意,我们无法追踪哪些任务(task)* 正在使用这个页;但如果该页是一个 pagecache 页面,* 我们可以通过 rmap(…

NFS 服务端/客户端配置

下面为你介绍基于CentOS7的NFS服务端和客户端的配置方法。 NFS服务端配置安装NFS服务相关软件包yum install -y nfs-utils rpcbind 启动并设置开机自启服务systemctl start rpcbind systemctl start nfs-server system…

CSP-S2025 题目解析

看了我的游记的都知道我每道题目的做题情况。 T1 比较简单的签到题目。 你先贪心选每个数最大的那个组,然后判断有没有某一个组的大于 \(\frac{n}{2}\),显然这种组有且仅有一个。 我们考虑把这个组的某些数换组,那么…

[Record] CSP-S 2025 邮寄

也不算特别寄,但是出考场之后 \(\texttt{T3}\) \(\texttt{T4}\) 都胡出来了,就很难绷。\(\texttt{T1}\) 水题,读完题写写就过了。 \(\texttt{T2}\) 胡思乱想了一会,然而并没有想到比 \(O(m\log m+nk2^k\alpha(n))\…

CH59x/CH58X蓝牙从机白名单使用

蓝牙从机设置白名单,可以只扫描应答(白名单中列出的)设备,只允许(白名单中列出的)设备连接。 蓝牙主机设置白名单,可以只扫描、连接特定的蓝牙设备(白名单中列出的)。 一.蓝牙从机白名单设置有关的函数介绍:…

算法实践第二次作业

一、找第 k 小的数的分治算法描述(伪代码 + 自然语言) 伪代码 plaintext function findKthSmallest(arr, low, high, k): if low == high: # 子数组仅1个元素,直接返回 return arr[low] # 步骤1:选基准元素(此处…

CSP2025总结

J组: 应该是最有机会 AK 的一次。 T1,T2 都是一眼题,用 30min 简单写完后看 T3

hello!

第一篇!第一篇博客园博客! 之前用Astro搭建了个人博客,但是没有评论区的反馈确实博客就像写学习笔记一样,中间出现了很多错误也没人说。。所以来博客园了! 希望这里能见证自己剩下两年半xcpc的学习时光o( ̄▽ ̄)ブ…

docker 交付方案AI设计备份

基于当前项目结构,Docker 交付和在线升级计划如下: Docker 交付与在线升级方案 一、总体架构设计 1.1 容器化策略应用镜像:为 FastAPI 主应用构建独立 Docker 镜像服务编排:使用 Docker Compose 编排所有服务数据持…

2025 CSP-S 游记

Day 0: 大巴上基本啥也没干,发会呆,看会b站就到了。 带了笔记本,晚上CS启动!打了两把小镇一把没赢。/ll 22:30算早睡吗。 Day 1: 上午6:14突然醒了,上了个厕所又睡下去了,7:30再次醒来,感觉睡得比去年好。 因为…

[题解]CSP-S 2025 T1~T3 题解

T1. P14361 [CSP-S 2025] 社团招新 / club Tag:贪心、排序。 因为要求每个社团不超过 \(\dfrac{n}{2}\) 个人,所以无论怎么分配,最多只会有一个社团超出限制。 因此,我们先让每个人选最满意的社团。若存在超出限制…

关于git关联github问题

本地GIT绑定GITHUB 配置本地GIT信息 #配置用户名 git config --global user.name "test"#配置邮箱 git config --global user.email abc@163.com生成本地密钥和公钥 生成ssh文件夹(生成ssh秘钥)(输入$ s…

AT ABC285E Work or Rest 题解

SolutionLink 有趣的 DP 题,难点在于从哪里开始入手以及优化(也许)。 显然 DP 可以方便地处理这个 \(\max\) 值的转移,但是从哪个位置开始 DP 呢?注意到周期呈现环状,也就是说一周的第 \(n\) 天和下一周的第 \(1…

代码复杂度的代价远比你想象得大

引言:复杂度的代价远比你想象得大 在 Java 后端系统演进过程中,代码复杂度是影响可维护性、稳定性和迭代效率的核心因素。然而,复杂度往往被忽视,直到一次“小改动”引发线上事故,才被重新审视。 本文以“复杂度战…