Submission #1032061

#TimeUsernameProblemLanguageResultExecution timeMemory
1032061vjudge1Line Town (CCO23_day1problem3)C++17
0 / 25
298 ms673660 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 5e5+5;

int t, n, a[N], adj[N];
pair<int, int> b[N];
deque<int> q[2][N];
bitset<N> vis;

void dfs(int x) {
  vis[x] = 1;
  if (adj[x] != -1 && !vis[adj[x]]) dfs(adj[x]);
}

signed main() {
  ios::sync_with_stdio(false); cin.tie(nullptr);

  cin >> n;
  for (int i = 0; i < n; i++) {
    adj[i] = -1;

    cin >> a[i];
    b[i] = make_pair(abs(a[i]), i);
  }
  sort(b, b+n);

  int idx = 0;
  for (int i = 0; i < n; i++) {
    if (i && b[i].first > b[i-1].first) idx++;
    
    int x = b[i].second;
    if (a[x] < 0) q[0][idx].push_back(x);
    else q[1][idx].push_back(x);
  }

  int L = 0;
  int R = n-1;
  while (idx >= 0) {
    while (!q[0][idx].empty() && q[0][idx].front() == L) {
      q[0][idx].pop_front();
      L++;
    }

    while (!q[1][idx].empty() && q[1][idx].back() == R) {
      q[1][idx].pop_back();
      R--;
    }

    while (!q[0][idx].empty()) {
      adj[q[0][idx].back()] = R;
      q[0][idx].pop_back();
      R--;
    }

    while (!q[1][idx].empty()) {
      adj[q[1][idx].front()] = L;
      q[1][idx].pop_front();
      L++;
    }

    idx--;
  }

  for (int i = 0; i < n; i++) {
    if (adj[i] == i) {
      cout << "-1\n";
      return 0;
    }
  }

  int ans = n;
  for (int i = 0; i < n; i++) {
    if (vis[i]) continue;

    ans--;
    dfs(i);
  }
  cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...