题目名字 Train and Queries
[题目链接]https://www.luogu.com.cn/problem/P187
题意
给定多少个站台,然后输入每个站台有的车厢,再输入两个数字,在这串数字里面找出,顺序的这两个数字,只能从左往右查找;
思路
- 先找出起点和终点,先判断每个数在不在这个数组里面,在的话判断是不是顺序的
算法一:map函数
具体步骤
- map<int, int> l, r;: 创建两个映射,l 用于记录每个站台最早出现的位置,r 用于记录每个站台最晚出现的位置。
2.if (!l[x]) l[x] = i;: 如果站台 x 还没有出现过,记录其最早出现的位置。
3.r[x] = i;: 不断更新站台 x 的最晚出现位置。
4.对于每个查询,通过检查 l[a] && l[b] && l[a] <= r[b] 来判断是否存在一条火车路线。如果条件满足,输出 “YES”,否则输出 “NO”。
这段代码通过记录每个站台的最早和最晚出现位置,有效地处理了每个查询,判断是否存在一条火车路线。
代码
#include <map>//映射要用
#include <stdio.h>
using namespace std;
int t,n,k,x,a,b,i;
int main(){
scanf("%d",&t);
while(t--){
map<int,int>l,r;//l表示最早一次,r表示最晚一次
//不这样要clear(),反而麻烦,不如再申请一个
scanf("%d %d",&n,&k);
for(i=1;i<=n;++i){
scanf("%d",&x);
if(!l[x])//没见过
l[x]=i;//记录
r[x]=i;//不断更新
}
while(k--){
scanf("%d %d",&a,&b);
if(l[a]&&l[b]&&l[a]<=r[b])//都出现过且ai最早一次比bi最晚一次早,就可以
puts("YES");
else
puts("NO");//反之,不行
}
}
return 0;
}