codeforces1066C
题目链接
在一个神奇的地方有一座神奇的火车站,它只有一条铁轨,可是它却会有从两个方向到来的火车…
现在给你t个操作或询问,操作或询问可能的情况有以下几种:
1.? num ——询问至少需要从火车站驶出多少列火车才能让编号num的火车顺利离开火车站
2.L num——有一列编号为num的火车从左侧驶入火车站,并停留在火车站中
3.R num——有一列编号为num的火车从右侧驶入火车站,并停留在火车站中
现在需要你针对每一次第一种询问输出结果。
Input
第一行包含了一个数字t(1 < = t < = 2e5),代表操作或询问的次数。
接下来t行,每一行包含了一个代表操作类型的符号和一个整数代表列车的编号。
列车的编号num满足1 < = num < =2e5,并且没有列车的编号是相同的
Output
针对每一次第一种询问,每次在独立的一行中输出使编号num的火车顺利离开火车站,需要提前驶离的最少列车数量。(注意这只是询问,并不是说这些列车真的驶离了火车站)
Examples
Input
8
L 6
R 2
R 3
? 3
L 4
? 6
L 5
? 6
Output
0
1
2
Input
10
L 1000
R 100
R 12
L 11
? 11
L 10
R 15
? 100
R 110
? 15
Output
0
2
1
Note
针对第一组样例
1.火车站情况为[6]
2.火车站情况为[6,2]
3.火车站情况为[6,2,3]
4.列车3可以直接出站不需要其他列车提前出站,因此答案是0
5.火车站情况为[4,6,2,3]
6.列车3出站之前应该让列车4先出站,答案是1
7.火车站情况为[5,4,6,2,3]
9.列车6出站之前应该让列车5,4或者列车3,2先出站,因此答案是2
针对第二组样例
1.火车站情况为[1000]
2.火车站情况为[1000,100]
3.火车站情况为[1000,100,12]
4.火车站情况为[11,1000,100,12]
5.列车11出站前不需要其他列车先出站,答案是0
6.火车站情况为[10,11,1000,100,12]
7.火车站情况为[10,11,1000,100,12,15]
8.列车100出站前需要列车12,15先出站,答案是2
9.火车站情况为[10,11,1000,100,12,15,110]
10.列车15出站前需要列车110先出站,答案是1
思路
贪心,用最小的代价将火车开出,故对一辆火车,必定是在“?”询问前的最后一次开入的才是最优位置。因此我们只需要用数组对每个数记录一下最优解,最后分别取min(最优解位置-最左端位置,最右端-最优位置)即可
#include<bits/stdc++.h>
using namespace std;
const int maxn=400010;
int a[maxn];
char str[2];
int main()
{
int t;
scanf("%d",&t);
int l=200000;
int r=l-1;
while(t--)
{
int num;
scanf("%s",str);
scanf("%d",&num);
if(str[0]=='L')
{
l--;
a[num]=l;
}
else if(str[0]=='R')
{
r++;
a[num]=r;
}
else
{
int res=min(a[num]-l,r-a[num]);
cout<<res<<endl;
}
}
return 0;
}