1 条题解
-
0
自动搬运
来自洛谷,原作者为

WuMin4
已摆烂求放过搬运于
2025-08-24 23:14:55,当前版本为作者最后更新于2025-04-25 09:19:23,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
[eJOI 2024] 古迹漫步 / Old Orhei
思路
可以发现 的范围特别大,每次操作对 进行单点修改区间查询,考虑用线段树维护信息并转移。
发现 ,于是考虑暴力维护初始在每个点时经过了一段区间的操作后到达了哪个点。该信息上传是简单的。若操作了 后 可以到达 ,操作 后 可以到达 ,则操作 后 可以到达 。
时间复杂度为 ,可以通过。
代码
#include <bits/stdc++.h> #define ls (u<<1) #define rs ((u<<1)|1) #define mid ((l+r)>>1) using namespace std; struct node{ int x,y; }b[100005]; int n,m,T,Q,to[400005][55],a[100005]; void push_up(int u){ for(int i=1;i<=n;i++) to[u][i]=to[rs][to[ls][i]]; } void build(int u,int l,int r){ if(l==r){ for(int i=1;i<=n;i++) to[u][i]=i; to[u][b[a[l]].x]=b[a[l]].y; return; } build(ls,l,mid); build(rs,mid+1,r); push_up(u); } void upd(int u,int l,int r,int x,int v){ if(l==r){ for(int i=1;i<=n;i++) to[u][i]=i; to[u][b[v].x]=b[v].y; return; } if(x<=mid) upd(ls,l,mid,x,v); else upd(rs,mid+1,r,x,v); push_up(u); } int qu(int u,int l,int r,int x,int y,int v){ if(x<=l&&r<=y) return to[u][v]; int res=v; if(x<=mid) res=qu(ls,l,mid,x,y,res); if(mid<y) res=qu(rs,mid+1,r,x,y,res); return res; } signed main() { ios::sync_with_stdio(false); cin.tie(nullptr),cout.tie(nullptr); cin>>n>>m; for(int i=1;i<=m;i++) cin>>b[i].x>>b[i].y; cin>>T; for(int i=1;i<=T;i++) cin>>a[i]; build(1,1,T); cin>>Q; while(Q--){ int op,l,r,x; cin>>op; if(op==1) cin>>l>>r>>x,cout<<qu(1,1,T,l,r,x)<<endl; else cin>>l>>x,upd(1,1,T,l,x); } return 0; }
- 1
信息
- ID
- 12046
- 时间
- 3000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者