Train and Queries

Train and Queries

https://www.luogu.com.cn/problem/CF1702C

题面翻译

给你一个长度为 n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 ) n (1\le n \le 2 \cdot 10 ^ 5) n(1n2105) 的数组 u u u。代表所有的火车站。火车只能从左边的站台开到右边的站台。也就是从 u 1 u_1 u1 开始,再到 u 2 ,   u 3 u_2, \ u_3 u2, u3,最后到 u n u_n un

现在给你 k ( 1 ≤ k ≤ 2 ⋅ 1 0 5 ) k (1\le k \le 2 \cdot 10 ^ 5) k(1k2105) 个询问,每个包含两个整数 a i a_i ai b i b_i bi,问你是否可以从 a i a_i ai 这个站台开始,坐火车到 b i b_i bi

比如: u u u 数组为 [ 3 , 7 , 1 , 5 , 1 , 4 ] [3,7,1,5,1,4] [3,7,1,5,1,4],有以下三个询问:

  • a 1 = 3 , b 1 = 5 a_1 = 3, b_1 = 5 a1=3,b1=5
    3 3 3 号站台坐车到 5 5 5 号站台是可能的,有以下路径: [ 3 , 7 , 1 , 5 ] [3,7,1,5] [3,7,1,5]
  • a 2 = 1 , b 2 = 7 a_2 = 1, b_2 = 7 a2=1,b2=7
    没有路径可以从 1 1 1 号站坐车做到 7 7 7 号站台。
  • a 3 = 3 , b 3 = 10 a_3 = 3, b_3 = 10 a3=3,b3=10
    没有路径可以从 3 3 3 号站台坐车到 10 10 10 号站台( 10 10 10 号根本不存在)。

tzyt 翻译

题目描述

Along the railroad there are stations indexed from $ 1 $ to $ 10^9 $ . An express train always travels along a route consisting of $ n $ stations with indices $ u_1, u_2, \dots, u_n $ , where ( $ 1 \le u_i \le 10^9 $ ). The train travels along the route from left to right. It starts at station $ u_1 $ , then stops at station $ u_2 $ , then at $ u_3 $ , and so on. Station $ u_n $ — the terminus.

It is possible that the train will visit the same station more than once. That is, there may be duplicates among the values $ u_1, u_2, \dots, u_n $ .

You are given $ k $ queries, each containing two different integers $ a_j $ and $ b_j $ ( $ 1 \le a_j, b_j \le 10^9 $ ). For each query, determine whether it is possible to travel by train from the station with index $ a_j $ to the station with index $ b_j $ .

For example, let the train route consist of $ 6 $ of stations with indices [ $ 3, 7, 1, 5, 1, 4 $ ] and give $ 3 $ of the following queries:

  • $ a_1 = 3 $ , $ b_1 = 5 $ It is possible to travel from station $ 3 $ to station $ 5 $ by taking a section of the route consisting of stations [ $ 3, 7, 1, 5 $ ]. Answer: YES.
  • $ a_2 = 1 $ , $ b_2 = 7 $ You cannot travel from station $ 1 $ to station $ 7 $ because the train cannot travel in the opposite direction. Answer: NO.
  • $ a_3 = 3 $ , $ b_3 = 10 $ It is not possible to travel from station $ 3 $ to station $ 10 $ because station $ 10 $ is not part of the train’s route. Answer: NO.

输入格式

The first line of the input contains an integer $ t $ ( $ 1 \le t \le 10^4 $ ) —the number of test cases in the test.

The descriptions of the test cases follow.

The first line of each test case is empty.

The second line of each test case contains two integers: $ n $ and $ k $ ( $ 1 \le n \le 2 \cdot 10^5, 1 \le k \le 2 \cdot 10^5 $ ) —the number of stations the train route consists of and the number of queries.

The third line of each test case contains exactly $ n $ integers $ u_1, u_2, \dots, u_n $ ( $ 1 \le u_i \le 10^9 $ ). The values $ u_1, u_2, \dots, u_n $ are not necessarily different.

The following $ k $ lines contain two different integers $ a_j $ and $ b_j $ ( $ 1 \le a_j, b_j \le 10^9 $ ) describing the query with index $ j $ .

It is guaranteed that the sum of $ n $ values over all test cases in the test does not exceed $ 2 \cdot 10^5 $ . Similarly, it is guaranteed that the sum of $ k $ values over all test cases in the test also does not exceed $ 2 \cdot 10^5 $

输出格式

For each test case, output on a separate line:

  • YES, if you can travel by train from the station with index $ a_j $ to the station with index $ b_j $
  • NO otherwise.

You can output YES and NO in any case (for example, strings yEs, yes, Yes and YES will be recognized as a positive response).

样例 #1

样例输入 #1

3


6 3
3 7 1 5 1 4
3 5
1 7
3 10


3 3
1 2 1
2 1
1 2
4 5


7 5
2 1 1 1 2 4 4
1 3
1 4
2 1
4 1
1 2

样例输出 #1

YES
NO
NO
YES
YES
NO
NO
YES
YES
NO
YES

提示

The first test case is explained in the problem statement.

#include <iostream>
#include<cstring>
#include<map> 
#include<vector>
using namespace std;
map<int,vector<int> > mp;

void slove(){
	map<int,int > l,r;
	int u,k;scanf("%d %d",&u,&k);
	for(int i=1;i<=u;i++){
		int x;cin>>x;
		if(!l[x])l[x]=i;
		r[x]=i;
	}
	while(k--){
		int a,b;scanf("%d %d",&a,&b);
		if(l[a]&&l[b]&&l[a]<=r[b])printf("YES\n");
		else printf("NO\n");
	}
	
}

int main()
{
	int n;scanf("%d",&n); 
  while(n--)slove();
}

存在从a站到a站,所以需要判断l[a]<=l[b]
也有两个不存在的站能否抵达 则需要判断l[a]和l[b]的存在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值