제출 #91401

#제출 시각아이디문제언어결과실행 시간메모리
91401mirbek01Marriage questions (IZhO14_marriage)C++11
90 / 100
1572 ms28584 KiB
# include <bits/stdc++.h>

using namespace std;

const int N = 1e5 + 2;

int n, m, k, mt[N], used[N], ans, L, R;
vector <int> g[N], vr, mat;
set <int> mr;

bool dfs(int v){
      if(used[v])
            return 0;
      vr.push_back(v);
      used[v] = 1;
      for(int to : g[v]){
            if(to <= n && (to > R || to < L))
                  continue;
            if(mt[to] == -1 || dfs(mt[to])){
                  mt[to] = v;
                  mt[v] = to;
                  mat.push_back(to);
                  mat.push_back(v);
                  return true;
            }
      }
      return false;
}

bool check(){
      if(mr.empty())
            return true;
      while(!mr.empty()){
            int v = *mr.begin();
            for(int i = 0; i < vr.size(); i ++){
                  used[vr[i]] = 0;
            }
            if(!dfs(v)){
                  return false;
            }
            mr.erase(v);
      }
      return mr.empty();
}

bool ok(){
      for(int i = 0; i < mat.size(); i ++){
            mt[mat[i]] = -1;
      }
      mat.clear();
      for(int i = n + 1; i <= n + m; i ++){
            for(int j = 0; j < (int)vr.size(); j ++){
                  used[ vr[j] ] = 0;
            }
            vr.clear();
            dfs(i);
      }
      return mr.empty();
}

int main(){
      scanf("%d %d %d", &n, &m, &k);

      for(int i = 1; i <= k; i ++){
            int a, b;
            scanf("%d %d", &a, &b);
            g[a].push_back(b + n);
            g[b + n].push_back(a);
      }

      for(int i = 1; i <= n + m; i ++){
            sort(g[i].begin(), g[i].end());
      }

      memset(mt, -1, sizeof(mt));

      for(int i = n + 1; i <= n + m; i ++)
            mr.insert(i);

      int pt = 1;

      for(int i = 1; i <= n; i ++){
            L = i, R = pt;
            while(pt <= n && !check())
                  pt ++, R = pt;
            ans += n - pt + 1;
            if(mt[L] != -1){
                  mt[mt[L]] = -1;
                  mr.insert(mt[L]);
            }
      }

      printf("%d", ans);
}

컴파일 시 표준 에러 (stderr) 메시지

marriage.cpp: In function 'bool check()':
marriage.cpp:35:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int i = 0; i < vr.size(); i ++){
                            ~~^~~~~~~~~~~
marriage.cpp: In function 'bool ok()':
marriage.cpp:47:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for(int i = 0; i < mat.size(); i ++){
                      ~~^~~~~~~~~~~~
marriage.cpp: In function 'int main()':
marriage.cpp:62:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d %d %d", &n, &m, &k);
       ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
marriage.cpp:66:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
             scanf("%d %d", &a, &b);
             ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...