The 2024 ICPC Asia EC Regionals Online Contest (II) - Problem B. Mountain Booking

news/2024/9/21 23:25:11/文章来源:https://www.cnblogs.com/clrs97/p/18424674

从 $1$ 到 $m$ 依次考虑每个日期。假设当前正在考虑第 $i$ 天,那么只有第 $i$ 天来访的游客以及指定第 $i$ 天的查询是有用的。将这些游客和查询都提取出来,通过 Kruskal 重构树可以很方便地在 $O(n\log n)$ 的时间内计算出这些查询的答案。

不幸的是,本题还有加边删边操作,无法轻易地动态维护 Kruskal 重构树。解决问题的关键是注意到假设第 $i$ 天有 $t_i$ 个游客、$q_i$ 个询问,那么可以支付 $O((t_i+q_i)\log n)$ 的代价来获取它们对应的节点形成的大小为 $O(t_i+q_i)$ 的虚树,然后在虚树上暴力构建 Kruskal 重构树计算每个询问的答案。

求虚树的方法很多,比如 LCT 或者离线分治。假设 $n,m,p,q$ 同阶,总时间复杂度为 $O(n\log n)$。

 

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100005,M=200005,Q=200005,K=19;
vector<int>gt[M],gq[M];
struct Qry{int x;ll ans;}qry[Q];
struct E{int x,y,w;}e[K][N],edge[N];
namespace Inner{
int f[N<<1],tour[N<<1];ll sum[N<<1];
inline bool cmp(const E&a,const E&b){return a.w<b.w;}
int F(int x){if(f[x]==x)return x;int y=f[x];f[x]=F(f[x]);sum[x]+=sum[y];return f[x];
}
inline void solve(int n,int m,int d){int i;for(i=1;i<=n;i++){f[i]=i;tour[i]=sum[i]=0;}for(const auto&o:gt[d])tour[o]++;sort(edge+1,edge+m+1,cmp);for(i=1;i<=m;i++){int x=edge[i].x,y=edge[i].y,w=edge[i].w;x=F(x),y=F(y);int z=n+i;sum[x]=1LL*w*tour[y];sum[y]=1LL*w*tour[x];sum[z]=0;f[x]=f[y]=f[z]=z;tour[z]=tour[x]+tour[y];}for(const auto&o:gq[d]){int x=qry[o].x;F(x);qry[o].ans=sum[x];}
}
}
struct Seg{int x,y,w,l,r;}seg[K][N+M];
int n,m,ct,cq,ce,i,x,y,z,o;
int g[N],v[N<<1],w[N<<1],nxt[N<<1],ed,fa[N],wei[N],id[N],vip[N];bool vis[N];
inline void add(int x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;
}
inline void addedge(int x,int y,int z){add(x,y,z);add(y,x,z);
}
inline void newedge(int x,int y,int z){edge[++ed].x=x;edge[ed].y=y;edge[ed].w=z;
}
void compress(int x,int y){int d=0;id[x]=0;vis[x]=1;for(int i=g[x];i;i=nxt[i]){int u=v[i];if(u==y)continue;fa[u]=x;wei[u]=w[i];compress(u,x);if(!id[u])continue;d++;id[x]^=id[u];}if(d>1)vip[x]=1;if(vip[x]){for(int i=g[x];i;i=nxt[i]){int u=v[i];if(u==y)continue;int t=id[u];if(!t)continue;int mx=0;for(int j=t;j!=x;j=fa[j])if(mx<wei[j])mx=wei[j];newedge(x,t,mx);}id[x]=x;}
}
void solve(int d,int l,int r,int ce,int n,int m){int i;ed=0;for(i=1;i<=n;i++)vip[i]=vis[i]=g[i]=0;for(i=1;i<=m;i++)addedge(e[d][i].x,e[d][i].y,e[d][i].w);for(i=1;i<=ce;i++){if(seg[d][i].r<l||seg[d][i].l>r)continue;if(seg[d][i].l<=l&&seg[d][i].r>=r){addedge(seg[d][i].x,seg[d][i].y,seg[d][i].w);continue;}vip[seg[d][i].x]=vip[seg[d][i].y]=1;}for(i=l;i<=r;i++){for(const auto&o:gt[i])vip[o]=1;for(const auto&o:gq[i])vip[qry[o].x]=1;}ed=0;for(i=1;i<=n;i++)if(vip[i]&&!vis[i])compress(i,0);int _n=0;for(i=1;i<=n;i++)if(vip[i])vip[i]=++_n;if(_n<=1)return;n=_n;m=ed;for(i=1;i<=m;i++){edge[i].x=vip[edge[i].x];edge[i].y=vip[edge[i].y];}for(i=l;i<=r;i++){for(auto&o:gt[i])o=vip[o];for(const auto&o:gq[i])qry[o].x=vip[qry[o].x];}if(l==r){Inner::solve(n,m,l);return;}int _ce=0;for(i=1;i<=m;i++)e[d+1][i]=edge[i];for(i=1;i<=ce;i++){if(seg[d][i].r<l||seg[d][i].l>r)continue;if(seg[d][i].l<=l&&seg[d][i].r>=r)continue;seg[d+1][++_ce].x=vip[seg[d][i].x];seg[d+1][_ce].y=vip[seg[d][i].y];seg[d+1][_ce].w=seg[d][i].w;seg[d+1][_ce].l=seg[d][i].l;seg[d+1][_ce].r=seg[d][i].r;}int mid=(l+r)>>1;solve(d+1,l,mid,_ce,n,m);solve(d+1,mid+1,r,_ce,n,m);
}
int main(){ios_base::sync_with_stdio(0);cin.tie(0);cin>>n>>m>>ct>>cq;for(i=1;i<n;i++){cin>>x>>y>>z;seg[0][i].x=x;seg[0][i].y=y;seg[0][i].w=z;seg[0][i].l=1;seg[0][i].r=m;}ce=n-1;for(i=1;i<=m;i++){cin>>o>>x>>y>>z;seg[0][o].r=i-1;seg[0][++ce].x=x;seg[0][ce].y=y;seg[0][ce].w=z;seg[0][ce].l=i;seg[0][ce].r=m;}for(i=1;i<=ct;i++){cin>>o>>x;gt[o].emplace_back(x);}for(i=1;i<=cq;i++){cin>>o>>x;qry[i].x=x;gq[o].emplace_back(i);}solve(0,1,m,ce,n,0);for(i=1;i<=cq;i++)cout<<qry[i].ans<<"\n";
}

  

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

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

相关文章

领导大规模敏捷Leading SAFe认证培训课

领导大规模敏捷Leading SAFe认证课

asio的buffer

ASIO的buffer理解 asio的buffer结构 任何网络库都有提供buffer的数据结构,这个就是收发数据的缓冲区。 asio提供了mutable_buffer 和 const_buffer这两个结构,他们都是一段连续的空间,首字节存储了后续数据的长度。mutable_buffer用于写服务,const_buffer用于读服务。但是这…

格林公式7

例1 计算积分 \[I=\int_Cx^2ydx-xy^2dy, \]其中C是上半圆 \(\begin{aligned} & \text{ }x^2+y^2=a^2,y\geqslant0,\text{ }\\ & \end{aligned}\) 逆时间方向 \[\begin{aligned} & \text{ }x^2+y^2=a^2,y\geqslant0,\text{ }\\ & \end{aligned} \]考虑到上半…

9.21 abc372f

容易发现平移操作,都是 \(to\) 向左平移。然后更新完了过后,\(x\) 再左移。 当然 dp 数组整体是左移的。 本题一个重点就是,假设整个 dp 不动,让我们的操作反着动。

基于AODV和leach协议的自组网络平台matlab仿真,对比吞吐量,负荷,丢包率,剩余节点个数,节点消耗能量

1.算法仿真效果 matlab2017b仿真结果如下(完整代码运行后无水印):本程序系统是《m基于matlab的AODV,leach自组网网络平台仿真,对比吞吐量,端到端时延,丢包率,剩余节点个数,节点消耗能量》的的升级。升级前原文章链接增加了运动节点的路由测试,包括定向运动,随机运动,静止…

笛卡尔坐标张量简介7

张量(tensor) 这一术语最初是用来描述弹性介质各点应力状态的,后来发展成为力学和物理学的一个有力数学工具,目前力学方面的理论性文献都不同程度地这用了这一工具 由坐标原点和三条不共面的标架直线构成的坐标系称为直线坐标系,如果三标架直线上的单位尺度相同,称为笛卡…

尝试RVC音色克隆团长音色

前言 昨晚玩剑网3突发奇想,把团长声音克隆下来,利用语音喵制作成语音DBM。 这样不管团长开不开团,打团也能有团长声音听了诶嘿嘿。 于是当场关闭游戏声音录了打本的素材,本文就边做边记录。 下载 在B站找到了这个教程: 【你的声音,现在是我的了!】https://www.bilibili.…

vsftpd部署(centos7.9)

说明:– vsftpd的版本:vsftpd-3.0.2-29.el7_9.x86_64– ftp根目录:/var/www– ftp 配置文件目录:/etc/vsftpd– ftp 虚拟用户权限配置文件目录:/etc/vsftpd/user_conf 实现目标:– 匿名用户可以登录,但是不能访问虚拟用户的宿主目录,只能访问共享目录– 虚拟用户对自己…

隐私保护体系下网络威胁情报共享的研究现状和方案设计

来源:http://netinfo-security.org/article/2024/1671-1122/1671-1122-24-7-1129.shtml威胁情报 网络威胁情报是关于网络中正在进行的或潜在的恶意活动信息,涵盖但不限于特定的恶意软件样本、恶意IP地址、钓鱼电子邮件信息、黑客组织的入侵行为等内容,对于提前感知预警、防范…

Logisim-013-◇汉字显示

转码在线工具地址 https://www.23bei.com/tool/54.html#仓库地址 https://gitee.com/gitliang/logisim-to-cpu

spring6.1在java17环境下使用反射

引包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>3.3.4</version> </dependency> 反射代码编写简单的反射方法,如下所示 package com.lw.reflect.c…