Implementation
E_The_Robotic_Rush.cpp
Wrap
Copy code
Full screen
C++
1
2 #include <bits/stdc++.h>
3 using namespace std;
4 typedef long long ll;
5 const int inf = 1e9 ;
6 const long long INF = 1e17 ;
7 #define int long long
8 void solve () {
9 int n, m, k; cin >> n >> m >> k;
10
11 vector < int > a (n), b (m);
12 for (int i = 0 ; i < n; i++ ) cin >> a[i];
13 for (int i = 0 ; i < m; i++ ) cin >> b[i];
14 sort (b.begin (), b.end ());
15 unordered_map < int , int > kill, first;
16 unordered_set < int > used;
17 string s; cin >> s;
18 int cur = 0 ;
19 for (int i = 0 ; i < s.size (); i++ ) {
20 if (s[i] == 'L' ) cur-- ;
21 else cur++ ;
22 if (! first.count (cur)) {
23 first[cur] = i + 1 ;
24 }
25 }
26 for (int i = 0 ; i < n; i++ ) {
27 int x = a[i];
28 int indx = lower_bound (b.begin (), b.end (), x) - b.begin ();
29 int best_time = INF , dif = 0 ;
30 if (indx < m) {
31 int d = b[indx] - x;
32 if (first.count (d)) {
33 if (first[d] < best_time) {
34 best_time= first[d];
35 dif = d;
36 }
37 }
38 }
39 if (indx > 0 ) {
40 int d = b[indx - 1 ] - x;
41 if (first.count (d)) {
42 if (first[d] < best_time) {
43 best_time = first[d];
44 dif = d;
45 }
46 }
47 }
48 if (best_time != INF ) {
49 kill[dif]++ ;
50 }
51 }
52 int pos = 0 , dead = 0 ;
53 for (int i = 0 ; i < s.size (); i++ ) {
54 if (s[i] == 'L' ) pos-- ;
55 else pos++ ;
56 if (! used.count (pos)) {
57 if (kill.count (pos)) dead + = kill[pos];
58 used.insert (pos);
59 }
60 cout << n - dead << " \n" [i == s.size () - 1 ];
61 }
62 }
63 signed main () {
64 ios:: sync_with_stdio (0 ); cin.tie (0 );
65 int t; cin >> t;
66 while (t-- ) {
67 solve ();
68 }
69 return 0 ;
70 }