当前位置: 首页 > news >正文

题解:[NOI2018] 归程

题目传送门

题意分析

考虑一个在线的做法。记 \(w,h\) 表示边的长度和海拔。

单独考虑每一次询问,如果水位线 \(p<h\),则这条边是可以走的。否则这条边等价于没有。

考虑并查集维护边的合并,查询就查询当前连通块内离 \(1\) 的最短路长度即可。

但是水位线会变化,因此 \(h\) 从大到小合并并查集,进行可持久化操作即可。

查询更简单,二分找到对应版本,查询并查集内的最短路最小值即可。

时间复杂度 \(\mathcal O\left(T(m+q)\log n\right)\)

AC 代码

常数略大。

//#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<ctime>
#include<deque>
#include<queue>
#include<stack>
#include<list>
using namespace std;
constexpr const int N=200000,M=400000,Q=400000;
struct edge{int u,v,w,h;
}e[M+1];
int n,m,q;
int dis[N+1];
vector<pair<int,int>>g[N+1];
void Dijkstra(){priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;static bool vis[N+1];memset(vis,0,sizeof(vis));memset(dis,0x3f,sizeof(dis));dis[1]=0;q.push({dis[1],1});while(q.size()){int x=q.top().second;q.pop();if(vis[x]){continue;}vis[x]=true;for(auto [v,w]:g[x]){if(vis[v]){continue;}if(dis[x]+w<dis[v]){dis[v]=dis[x]+w;q.push({dis[v],v});}}}
}
struct value{int f,size,d;
};
struct segTree{int root[M+1],size;typedef value (*fp)(int);struct node{int l,r;value x;int lChild,rChild;}t[N*80+1];segTree(){size=0;}void clear(){size=0;}int create(node x){t[++size]=x;return size;}int clone(int p){t[++size]=t[p];return size;}int build(int l,int r,fp func){node x={l,r};if(l==r){x.x=func(l);return create(x);}int mid=l+r>>1;x.lChild=build(l,mid,func);x.rChild=build(mid+1,r,func);return create(x);}int update(int p,int x,value k){p=clone(p);if(t[p].l==t[p].r){t[p].x=k;return p;}if(x<=t[t[p].lChild].r){t[p].lChild=update(t[p].lChild,x,k);}else{t[p].rChild=update(t[p].rChild,x,k);}return p;}void update(int v,int i,int x,value k){root[i]=update(root[v],x,k);}value query(int p,int x){if(t[p].l==t[p].r){return t[p].x;}if(x<=t[t[p].lChild].r){return query(t[p].lChild,x);}else{return query(t[p].rChild,x);}}value query(int v,int i,int x){root[i]=root[v];return query(root[i],x);}void copy(int v,int i){root[i]=root[v];}
};
struct dsu{segTree t;void build(int n){t.clear();t.root[0]=t.build(1,n,[](int x){return value{x,1,dis[x]};});}int find(int v,int i,int x){int fx=t.query(v,i,x).f;if(fx!=x){return find(v,i,fx);}else{return x;}} void cancel(int v,int i){t.copy(v,i);}void merge(int v,int i,int a,int b){cancel(v,i);a=find(i,i,a);b=find(i,i,b);if(a==b){return;}value A=t.query(i,i,a),B=t.query(i,i,b);if(A.size<B.size){t.update(i,i,a,{b,A.size,A.d});t.update(i,i,b,{B.f,A.size+B.size,min(A.d,B.d)});}else{t.update(i,i,b,{a,B.size,B.d});t.update(i,i,a,{A.f,A.size+B.size,min(A.d,B.d)});}}int query(int v,int x){x=find(v,v,x);return t.query(v,v,x).d;} 
}dsu;
void pre(){for(int i=1;i<=n;i++){g[i].resize(0);}for(int i=1;i<=m;i++){auto [u,v,w,h]=e[i];g[u].push_back({v,w});g[v].push_back({u,w});}Dijkstra();dsu.build(n);sort(e+1,e+m+1,[](edge a,edge b){return a.h>b.h;});for(int i=1;i<=m;i++){dsu.merge(i-1,i,e[i].u,e[i].v); }
}
int query(int v,int p){int l=1,r=m,ans=-1;while(l<=r){int mid=l+r>>1;if(e[mid].h>p){ans=mid;l=mid+1;}else{r=mid-1;}}if(ans==-1){return dis[v];}return dsu.query(ans,v);
}
int main(){/*freopen("test.in","r",stdin);freopen("test.out","w",stdout);*/ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T;cin>>T;while(T--){cin>>n>>m;for(int i=1;i<=m;i++){auto &[u,v,w,h]=e[i];cin>>u>>v>>w>>h;}pre();int k,s,lastans=0;cin>>q>>k>>s;for(int i=1;i<=q;i++){int v,p;cin>>v>>p;v=(v+k*lastans-1)%n+1;p=(p+k*lastans)%(s+1);lastans=query(v,p);cout<<lastans<<'\n';}}cout.flush();/*fclose(stdin);fclose(stdout);*/return 0;
}
http://www.jsqmd.com/news/745838/

相关文章:

  • 保姆级教程:在RK3588-EVB1开发板上解锁HDMI 8K输出(Android 12 SDK)
  • Gemini 3.1 Pro 免费版
  • bitsandbytes CUDA版本匹配实战指南:三步解决Docker编译难题
  • 如何高效转换CAJ文献为PDF:开源工具完整实战指南
  • 3分钟解锁Windows运行安卓应用:轻量级跨平台方案
  • STM32新手必看:BOOT0引脚接错导致‘Invalid Rom Table’?手把手教你救活锁死的芯片
  • ComfyUI Impact Pack终极指南:5个高效技巧解锁AI图像增强的强大功能
  • QKeyMapper:Windows平台终极按键映射工具,游戏办公全能助手
  • 3分钟配置:TrafficMonitor插件让你的任务栏变身全能监控中心
  • Windows下Selenium ChromeDriver启动报错全攻略:从版本匹配到安全策略参数配置
  • Hugging Face Text Embeddings Inference (TEI) 生产部署与性能优化实战
  • AI音乐理解技术:从音频处理到语义解析
  • 2026年4月高尔夫球车公司联系电话,微型电动消防车/校园巡逻车/电动高尔夫球车/电动巡逻车,高尔夫球车销售厂家联系电话 - 品牌推荐师
  • 从源码编译OpenCV到CMake一键引入:我的完整避坑记录(Ubuntu 22.04 / Windows MSVC)
  • 别再只学动态ARP了!华为交换机静态ARP的3个高级应用场景与配置细节
  • 无人机飞手必看:如何用WebGIS航线编辑器提前规避禁飞区与规划高效作业路径?
  • RoboMME:机器人记忆评估基准与优化实践
  • 告别vi直接编辑:用nmcli命令安全搞定openEuler 23.03双栈(IPv4/IPv6)网络配置
  • 别再只会用SPI读写了!用FPGA驱动W25Q64JV Flash,我踩过的这些时序坑你得知道
  • DeepSeek总结的DuckLake 入门
  • 从零搭建自托管AI网关OpenClaw:掌控隐私与智能路由的实践指南
  • 告别虚拟机!手把手教你用Ubuntu 22.04双系统搭建RoboCup救援仿真环境(附ThinkBook网卡驱动修复)
  • 新手福音:用快马AI生成带详解的Arduino LED闪烁入门代码
  • 新手福音:无需axure密钥,在快马用自然语言学做第一个交互原型
  • 金融级安卓SDK加固方案:如何满足等保与合规审计要求?
  • GPT-Image-2思考模式揭秘:推理式图像生成新范式
  • AI代码助手与生物信息学融合:CursorConverter实现领域智能迁移
  • 使用 Taotoken 管理多个项目 API Key 与设置访问权限
  • 手把手教你用AT32F423和NCN5120自制KNX-USB调试模块(附完整PCB与源码)
  • Flink 流处理那些事儿:状态、时间与容错