Submission #1148782

#TimeUsernameProblemLanguageResultExecution timeMemory
1148782repmann전압 (JOI14_voltage)C++20
90 / 100
200 ms23736 KiB
#include <bits/stdc++.h>
using namespace std;
int N, M, glob, sol;
struct EDGE
{
  int u, v;
}E[200096];
bool flag;
int V[100096];
int DP[100096];
bool P[200096];
int PARENT[100096];
int UP[20][100096];
int SUM[2][200096];
vector <pair <int, int>> VG[100096];
inline void DFS(int node, vector <int> &I)
{
  DP[node]++;
  for(int i = 1; UP[i - 1][UP[i - 1][node]]; i++) UP[i][node] = UP[i - 1][UP[i - 1][node]];
  for(pair <int, int> p : VG[node])
  {
    if(DP[p.second])
    {
      if(!P[p.first]) I.push_back(p.first);
      P[p.first] = 1;
      continue;
    }
    P[p.first] = 1;
    V[p.second] = V[node] ^ 1;
    DP[p.second] = DP[node];
    UP[0][p.second] = node;
    PARENT[p.second] = p.first;
    DFS(p.second, I);
  }
  return;
}
inline int LCA(int u, int v)
{
  if(DP[u] > DP[v]) swap(u, v);
  for(int i = 16; i + 1; i--) if(DP[u] < DP[UP[i][v]]) v = UP[i][v];
  if(DP[u] < DP[v]) v = UP[0][v];
  if(u == v) return u;
  for(int i = 16; i + 1; i--) if(UP[i][u] != UP[i][v]) u = UP[i][u], v = UP[i][v];
  return UP[0][u];
}
inline pair <int, int> Pull(int node, vector <int> &I)
{
  V[node] = 2;
  pair <int, int> RET = {0, 0}, temp;
  for(pair <int, int> p : VG[node])
  {
    if(V[p.second] == 2) continue;
    I.push_back(p.first);
    temp = Pull(p.second, I);
    SUM[0][p.first] += temp.first;
    SUM[1][p.first] += temp.second;
    RET.first += SUM[0][p.first];
    RET.second += SUM[1][p.first];
  }
  return RET;
}
inline void Solve(int node)
{
  int RET = 0, counter[2] = {0, 0};
  bool temp;
  V[node] = 1;
  vector <int> I;
  DFS(node, I);
  for(int x : I)
  {
    temp = V[E[x].u] ^ V[E[x].v];
    counter[temp]++;
    SUM[temp][PARENT[E[x].u]]++;
    SUM[temp][PARENT[E[x].v]]++;
    SUM[temp][PARENT[LCA(E[x].u, E[x].v)]] -= 2;
  }
  I.clear();
  if(counter[0] && flag) {cout << "0\n"; exit(0);}
  if(flag) return;
  Pull(node, I);
  for(int x : I) RET += (SUM[0][x] == counter[0]) && (!SUM[1][x]);
  sol += counter[0] == 1;
  sol += RET;
  flag = bool(counter[0]);
  return;
}
int main()
{
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
  cout.tie(NULL);
  cin >> N >> M;
  int u, v;
  for(int i = 1; i <= M; i++)
  {
    cin >> u >> v;
    if(u > v) swap(u, v);
    E[i] = {u, v};
    VG[u].push_back({i, v});
    VG[v].push_back({i, u});
  }
  for(int i = 1; i <= N; i++) if(!DP[i]) Solve(i);
  while(!sol);
  cout << sol << '\n';

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...