Submission #866002

# Submission time Handle Problem Language Result Execution time Memory
866002 2023-10-25T09:34:49 Z mychecksedad Parking (CEOI22_parking) C++17
20 / 100
326 ms 125512 KB
/* Author : Mychecksdead  */
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
#define MOD (1000000000+7)
#define MOD1 (998244353)
#define pb push_back
#define all(x) x.begin(), x.end()
#define en cout << '\n'
const int N = 1e6+100, M = 1e5+10, K = 52, MX = 30;


int n, m;
array<int, 2> A[N];
vector<array<int, 2>> B[N], g[N][2];
vector<array<int, 2>> in, vis;
vector<pair<int, int>> ans;
vector<int> v[N];
vector<int> E;
void move(int x, int y){
  if(x == y) return;
  ans.pb({x, y});
  v[y].pb(v[x].back());
  v[x].pop_back();
  if(v[x].empty()) E.pb(x);
}

void solve(){
  cin >> n >> m;
  for(int i = 1; i <= m; ++i){
    cin >> A[i][0] >> A[i][1];
    B[A[i][0]].pb({i, 0});
    B[A[i][1]].pb({i, 1});
    if(A[i][0]) v[i].pb(A[i][0]);
    if(A[i][1]) v[i].pb(A[i][1]);
    if(A[i][0] == 0) E.pb(i);
  }
  for(int i = 1; i <= n; ++i){
    if(B[i][0][0] != B[i][1][0]){
      if(B[i][1][1] == 0) swap(B[i][0], B[i][1]);
      if(B[i][0][1] != B[i][1][1])
        g[B[i][0][0]][B[i][0][1]].pb(B[i][1]);
    }
  }
  for(int i = 1; i <= m; ++i){
    if(A[i][0] != 0 && A[i][1] != 0){
      g[i][1].pb({i, 0});
    }
  }
  in.resize(m+1);
  vis.resize(m+1);
  for(int i = 1; i <= m; ++i){
    for(auto x: g[i][0])
      in[x[0]][x[1]]++;
    for(auto x: g[i][1])
      in[x[0]][x[1]]++;
  }
  queue<array<int, 2>> q;
  for(int i = 1; i <= m; ++i){
    if(in[i][0] == 0) q.push({i, 0}), vis[i][0] = 1;
    if(in[i][1] == 0) q.push({i, 1}), vis[i][1] = 1;
  }

  while(!q.empty()){
    auto x = q.front(); q.pop();
    // cout << x[0] << ' ' << x[1] << endl;
    for(auto u: g[x[0]][x[1]]){
      in[u[0]][u[1]]--;
      if(in[u[0]][u[1]] == 0){
        if(v[u[0]].size() > u[1] && v[x[0]].size() > x[1] && v[u[0]][u[1]] == v[x[0]][x[1]]){
          if(v[x[0]].size() < 2)
          move(u[0], x[0]);
        }
        q.push(u);  
        vis[u[0]][u[1]] = 1;
      }
    }
  }
  // cout << "g" << endl;
  for(int i = 1; i <= n; ++i) B[i].clear(); 
  for(int i = 1; i <= m; ++i){
    if(v[i].size() >= 1) B[v[i][0]].pb({i, 0});
    if(v[i].size() == 2) B[v[i][1]].pb({i, 1});
  }
  for(int i = 1; i <= n; ++i){
    if(B[i][0][0] != B[i][1][0]){
      if(B[i][0][1] == 0 && B[i][1][1] == 0){
        if(v[B[i][0][0]].size() == 1 && v[B[i][1][0]].size() == 1)
          move(B[i][0][0], B[i][1][0]);
      }
    }
  }
// en;
//    cout << ans.size() << '\n';
//   for(auto x: ans) cout << x.first << ' ' << x.second << '\n';
//   en;

  if(!E.empty()){
    for(int i = 1; i <= n; ++i) B[i].clear(); 
    for(int i = 1; i <= m; ++i) g[i][0].clear(), g[i][1].clear(); 
    for(int i = 1; i <= m; ++i){
      if(v[i].size() >= 1) B[v[i][0]].pb({i, 0});
      if(v[i].size() == 2) B[v[i][1]].pb({i, 1});
    }
    for(int i = 1; i <= n; ++i){
      if(B[i][0][0] != B[i][1][0]){
        if(B[i][1][1] == 0) swap(B[i][0], B[i][1]);
        if(B[i][0][1] != B[i][1][1])
          g[B[i][0][0]][B[i][0][1]].pb(B[i][1]);
      }
    }
    for(int i = 1; i <= m; ++i){
      if(v[i].size() == 2){
        g[i][1].pb({i, 0});
      }
    }
    vis.clear();
    vis.resize(m + 1);
    // cout << "zort";
    for(int i = 1; i <= m; ++i){
      if(!vis[i][0]){
        vector<array<int, 2>> st;
        array<int, 2> x = {i, 0};
        st.pb(x);
        while(!vis[x[0]][x[1]]){
          vis[x[0]][x[1]] = 1;
          if(g[x[0]][x[1]].empty()) break;
          x = g[x[0]][x[1]][0];
          st.pb(x);
        }
        if(st.front() == st.back() && st.size() > 1){
          int pos = E.back();
          E.pop_back();
          move(st[0][0], pos);
          st[st.size() - 2][0] = pos;
          for(int i = 1; i < st.size() - 1; i += 2){
            move(st[i][0], st[i - 1][0]);
          }
        }
      }
    }


    for(int i = 1; i <= n; ++i) B[i].clear(); 
    for(int i = 1; i <= m; ++i) g[i][0].clear(), g[i][1].clear(); 
    for(int i = 1; i <= m; ++i){
      if(v[i].size() >= 1) B[v[i][0]].pb({i, 0});
      if(v[i].size() == 2) B[v[i][1]].pb({i, 1});
    }
    for(int i = 1; i <= n; ++i){
      if(B[i][0][0] != B[i][1][0]){
        if(B[i][1][1] == 0) swap(B[i][0], B[i][1]);
        g[B[i][0][0]][B[i][0][1]].pb(B[i][1]);
      }
    }
    for(int i = 1; i <= m; ++i){
      if(v[i].size() == 2){
        g[i][1].pb({i, 0});
      }
    }

    in.clear();
    in.resize(m+1);
    vis.clear();
    vis.resize(m+1);

    for(int i = 1; i <= m; ++i){
      for(auto x: g[i][0])
        in[x[0]][x[1]]++;
      for(auto x: g[i][1])
        in[x[0]][x[1]]++;
    }


    priority_queue<array<int, 3>> q;
    for(int i = 1; i <= m; ++i){
      if(in[i][0] == 0) q.push({2*i-2, i, 0}), vis[i][0] = 1;
      if(in[i][1] == 0) q.push({2*i+1-2, i, 1}), vis[i][1] = 1;
    }

  //   cout << ans.size() << '\n';
  // for(auto x: ans) cout << x.first << ' ' << x.second << '\n';
  //   cout << "uwu\n\n";
    vector<array<int, 2>> vv(m*2);
    for(int i = 0; i < 2*m; ++i) vv[i][1] = i;
    while(!q.empty()){
      auto y = q.top(); q.pop();
      // cout << x[0] << ' ' << x[1] << endl;
      array<int, 2> x = {y[1], y[2]};
      for(auto u: g[x[0]][x[1]]){
        in[u[0]][u[1]]--;
        if(in[u[0]][u[1]] == 0){
          if(v[u[0]].size() > u[1] && v[x[0]].size() > x[1] && v[u[0]][u[1]] == v[x[0]][x[1]] && u[0] != x[0]){
            if(v[u[0]].size() == 2 && v[x[0]].size() == 2){
              // if(!E.empty()){
                // cout << u[0] << ' ' << x[0] << ' ' << E.back() << '\n';
                // int pos = E.back(); E.pop_back();
                // move(u[0], pos);
                // move(x[0], pos);
              // }else{
                // cout << -1;
                // return;
              // }
              vv[y[0]][0]++;
            }
              // move(u[0], x[0]);
          }
          q.push({y[0], u[0], u[1]});  
          vis[u[0]][u[1]] = 1;
        }
      }
    }
    sort(all(vv), [&](const array<int, 2> &x, const array<int, 2> &y){
      return x[0] < y[0];
    });

    in.clear();
    in.resize(m+1);
    vis.clear();
    vis.resize(m+1);

    for(int i = 1; i <= m; ++i){
      for(auto x: g[i][0])
        in[x[0]][x[1]]++;
      for(auto x: g[i][1])
        in[x[0]][x[1]]++;
    }

  //   cout << ans.size() << '\n';
  // for(auto x: ans) cout << x.first << ' ' << x.second << '\n';
  //   cout << "uwu\n\n";
    for(int i = 0; i < 2*m; ++i){
      int pos = vv[i][1]/2+1, pp = (vv[i][1]%2);
      if(in[pos][pp] == 0) q.push({i, pos, pp}), vis[pos][pp] = 0;
    }

    while(!q.empty()){
      auto y = q.top(); q.pop();
      // cout << x[0] << ' ' << x[1] << endl;
      array<int, 2> x = {y[1], y[2]};
      for(auto u: g[x[0]][x[1]]){
        in[u[0]][u[1]]--;
        if(in[u[0]][u[1]] == 0){
          if(v[u[0]].size() > u[1] && v[x[0]].size() > x[1] && v[u[0]][u[1]] == v[x[0]][x[1]] && u[0] != x[0]){
            if(v[u[0]].size() == 2 && v[x[0]].size() == 2){
              if(!E.empty()){
                // cout << u[0] << ' ' << x[0] << ' ' << E.back() << '\n';
                int pos = E.back(); E.pop_back();
                move(u[0], pos);
                move(x[0], pos);
              }else{
                cout << -1;
                return;
              }
            }else
              move(u[0], x[0]);
          }
          q.push({y[0], u[0], u[1]});  
          vis[u[0]][u[1]] = 1;
        }
      }
    }

    for(int i = 1; i <= n; ++i) B[i].clear(); 
    for(int i = 1; i <= m; ++i){
      if(v[i].size() >= 1) B[v[i][0]].pb({i, 0});
      if(v[i].size() == 2) B[v[i][1]].pb({i, 1});
    }
    for(int i = 1; i <= n; ++i){
      if(B[i][0][0] != B[i][1][0]){
        if(B[i][0][1] == 0 && B[i][1][1] == 0){
          if(v[B[i][0][0]].size() == 1 && v[B[i][1][0]].size() == 1)
            move(B[i][0][0], B[i][1][0]);
        }
      }
    }
  }

  bool ok = 1;
  for(int i = 1; i <= m; ++i){
    if(v[i].size() == 1) ok = 0;
    else if(v[i].size() == 2) ok &= v[i][0] == v[i][1];
  }
  if(!ok){
    cout << -1;
    return;
  }
  // en;en;en;


  cout << ans.size() << '\n';
  for(auto x: ans) cout << x.first << ' ' << x.second << '\n';
}


int main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tt = 1, aa;
  // freopen("in.txt", "r", stdin);
  // freopen("out.txt", "w", stdout);
  while(tt--){
    solve();
  }
  cerr<<"time taken : "<<(float)clock()/CLOCKS_PER_SEC<<" seconds\n";
  return 0;
} 

Compilation message

Main.cpp: In function 'void solve()':
Main.cpp:70:27: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'std::array<int, 2>::value_type' {aka 'int'} [-Wsign-compare]
   70 |         if(v[u[0]].size() > u[1] && v[x[0]].size() > x[1] && v[u[0]][u[1]] == v[x[0]][x[1]]){
Main.cpp:70:52: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'std::array<int, 2>::value_type' {aka 'int'} [-Wsign-compare]
   70 |         if(v[u[0]].size() > u[1] && v[x[0]].size() > x[1] && v[u[0]][u[1]] == v[x[0]][x[1]]){
Main.cpp:136:28: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  136 |           for(int i = 1; i < st.size() - 1; i += 2){
      |                          ~~^~~~~~~~~~~~~~~
Main.cpp:193:29: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'std::array<int, 2>::value_type' {aka 'int'} [-Wsign-compare]
  193 |           if(v[u[0]].size() > u[1] && v[x[0]].size() > x[1] && v[u[0]][u[1]] == v[x[0]][x[1]] && u[0] != x[0]){
Main.cpp:193:54: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'std::array<int, 2>::value_type' {aka 'int'} [-Wsign-compare]
  193 |           if(v[u[0]].size() > u[1] && v[x[0]].size() > x[1] && v[u[0]][u[1]] == v[x[0]][x[1]] && u[0] != x[0]){
Main.cpp:244:29: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'std::array<int, 2>::value_type' {aka 'int'} [-Wsign-compare]
  244 |           if(v[u[0]].size() > u[1] && v[x[0]].size() > x[1] && v[u[0]][u[1]] == v[x[0]][x[1]] && u[0] != x[0]){
Main.cpp:244:54: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'std::array<int, 2>::value_type' {aka 'int'} [-Wsign-compare]
  244 |           if(v[u[0]].size() > u[1] && v[x[0]].size() > x[1] && v[u[0]][u[1]] == v[x[0]][x[1]] && u[0] != x[0]){
Main.cpp: In function 'int main()':
Main.cpp:298:15: warning: unused variable 'aa' [-Wunused-variable]
  298 |   int tt = 1, aa;
      |               ^~
# Verdict Execution time Memory Grader output
1 Correct 26 ms 94812 KB Output is correct
2 Correct 22 ms 94808 KB Output is correct
3 Correct 20 ms 94808 KB Output is correct
4 Correct 22 ms 94948 KB Output is correct
5 Correct 23 ms 94808 KB Output is correct
6 Correct 20 ms 94812 KB Output is correct
7 Correct 21 ms 94812 KB Output is correct
8 Correct 20 ms 94812 KB Output is correct
9 Correct 22 ms 94768 KB Output is correct
10 Correct 22 ms 94972 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 290 ms 121684 KB Output is correct
2 Correct 326 ms 124256 KB Output is correct
3 Correct 246 ms 122592 KB Output is correct
4 Correct 232 ms 122156 KB Output is correct
5 Correct 314 ms 125512 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 20 ms 95068 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 20 ms 95068 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 22 ms 95068 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 26 ms 94812 KB Output is correct
2 Correct 22 ms 94808 KB Output is correct
3 Correct 20 ms 94808 KB Output is correct
4 Correct 22 ms 94948 KB Output is correct
5 Correct 23 ms 94808 KB Output is correct
6 Correct 20 ms 94812 KB Output is correct
7 Correct 21 ms 94812 KB Output is correct
8 Correct 20 ms 94812 KB Output is correct
9 Correct 22 ms 94768 KB Output is correct
10 Correct 22 ms 94972 KB Output is correct
11 Correct 290 ms 121684 KB Output is correct
12 Correct 326 ms 124256 KB Output is correct
13 Correct 246 ms 122592 KB Output is correct
14 Correct 232 ms 122156 KB Output is correct
15 Correct 314 ms 125512 KB Output is correct
16 Incorrect 20 ms 95068 KB Output isn't correct
17 Halted 0 ms 0 KB -