Advertisement
erek1e

POI Task Criminals

Jul 5th, 2023
555
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.16 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. int main() {
  8.     ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  9.     int n, k; cin >> n >> k;
  10.     vector<int> c(1+n);
  11.     for (int i = 1; i <= n; ++i) cin >> c[i];
  12.  
  13.     int m, l; cin >> m >> l;
  14.     vector<int> x(1+m), y(1+l);
  15.     for (int i = 1; i <= m; ++i) cin >> x[i];
  16.     for (int i = 1; i <= l; ++i) cin >> y[i];
  17.  
  18.     vector<int> posInX(1+k);
  19.     for (int i = 1; i <= m; ++i) posInX[x[i]] = i;
  20.     vector<int> closestFinishX(1+n); // rightmost finish to the left of i
  21.     vector<int> lastSeen(1+k);
  22.     for (int i = 1; i <= n; ++i) {
  23.         lastSeen[c[i]] = i;
  24.         if (posInX[c[i]] == 1) closestFinishX[i] = i;
  25.         else if (posInX[c[i]] > 1) closestFinishX[i] = closestFinishX[lastSeen[x[posInX[c[i]]-1]]];
  26.     }
  27.  
  28.     vector<int> posInY(1+k);
  29.     for (int i = 1; i <= l; ++i) posInY[y[i]] = i;
  30.     vector<int> closestFinishY(1+n+1, n+1); // leftmost finish to the right of i
  31.     lastSeen.assign(1+k, n+1);
  32.     for (int i = n; i > 0; --i) {
  33.         lastSeen[c[i]] = i;
  34.         if (posInY[c[i]] == 1) closestFinishY[i] = i;
  35.         else if (posInY[c[i]] > 1) closestFinishY[i] = closestFinishY[lastSeen[y[posInY[c[i]]-1]]];
  36.     }
  37.  
  38.     vector<int> first(1+k), last(1+k);
  39.     for (int i = 1; i <= n; ++i) {
  40.         if (!first[c[i]]) first[c[i]] = i;
  41.         last[c[i]] = i;
  42.     }
  43.     vector<pair<int, int>> farthestPairs;
  44.     for (int i = 1; i <= k; ++i) {
  45.         if (first[i] != last[i]) farthestPairs.emplace_back(first[i], last[i]);
  46.     }
  47.     sort(farthestPairs.begin(), farthestPairs.end());
  48.  
  49.     vector<int> meetingPoints;
  50.     for (int i = 0, nextPair = 0, maxR = 0; i < n; ++i) {
  51.         if (c[i] != x.back()) continue;
  52.         int left = closestFinishX[i], right = closestFinishY[i];
  53.         while (nextPair < (int)farthestPairs.size() && farthestPairs[nextPair].first < left) {
  54.             maxR = max(maxR, farthestPairs[nextPair++].second);
  55.         }
  56.         if (maxR > right) meetingPoints.push_back(i);
  57.     }
  58.     cout << meetingPoints.size() << endl;
  59.     for (int v : meetingPoints) cout << v << ' ';
  60.     cout << endl;
  61.     return 0;
  62. }
  63.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement