P13735 [JOIGST 2025] 魔法阵 / Magic Circle
题目描述
比太郎所在的魔法学校即将举办运动会。运动会中有一个项目,称为“魔法阵”。
有 $N$ 个魔法阵依次排列在一个圆上,顺时针编号为 $1$ 到 $N$。每个魔法阵为红色或蓝色中的一种,使用长度为 $N$ 且仅包含小写字母 b 和 r 字符串 $S$ 表示:$S_j(1\le j\le N)$ 为 r 则表示魔法阵 $j$ 为红色,否则为蓝色。
比太郎可以通过如下的两种方式在魔法阵中传送:
- 选择一个相邻的魔法阵,花费 $1$ 秒传送过去。换句话说,可以在魔法阵 $j(1\le j\le N-1)$ 和 $j+1$ 间传送(两个方向均可),也可以在魔法阵 $1$ 和 $N$ 间传送(两个方向均可);
- 选择一个与当前所在魔法阵颜色相同的魔法阵(不一定要相邻),花费 $1$ 秒传送过去。
目前他仅得知每个魔法阵的颜色,但并不知道运动会当天具体的传送计划。于是他决定考虑 $Q$ 个传送计划:在第 $i$ 个计划中,他要从魔法阵 $X_i$ 开始,花费最少的时间传送到魔法阵 $Y_i$。
请你对于每一个传送计划,求出最少需要花费的时间。
输入格式
第一行输入两个整数 $N,Q$。
第二行输入一个字符串 $S$。
接下来 $Q$ 行,每行输入两个整数 $X_i,Y_i$。
输出格式
输出 $Q$ 行,在第 $i$ 行输出一个整数,表示第 $i$ 个传送计划最少需要花费的传送时间(单位:秒)。
这道题实际上只有三种情况:第一种,传送两数相同,只用一步;
第二种,传送到相邻的相同数,在移到目标位置,用两步;
第三种,传送到相邻的相同数字串,在移到目标位置,用三步。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int nxt(int x){
if(x==n) return 1;
return x+1;
}
int p(int x){
if(x==1) return n;
return x-1;
}
void sb(){
// int n,m;
cin>>n>>m;
string s;cin>>s;
s=" "+s;
for(int i=1;i<=m;++i){
int x,y;cin>>x>>y;
if(s[x]==s[y]||nxt(x)==y||nxt(y)==x){
cout<<1<<'\n';
}
else if(s[x]!=s[nxt(x)]||s[x]!=s[p(x)]||s[y]!=s[nxt(y)]||s[y]!=s[p(y)]){
cout<<2<<'\n';
}
else cout<<3<<'\n';
}
}
signed main(){
int T=1;
while(T--)sb();
return 0;
}
浙公网安备 33010602011771号