txh0609

导航

 

P13735 [JOIGST 2025] 魔法阵 / Magic Circle

题目描述

比太郎所在的魔法学校即将举办运动会。运动会中有一个项目,称为“魔法阵”。

有 $N$ 个魔法阵依次排列在一个圆上,顺时针编号为 $1$ 到 $N$。每个魔法阵为红色或蓝色中的一种,使用长度为 $N$ 且仅包含小写字母 br 字符串 $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;	
} 
posted on 2026-05-06 10:04  txh0609  阅读(8)  评论(0)    收藏  举报