QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#90456#896. HorsesCrysflyWA 54ms6368kbC++147.3kb2023-03-23 10:09:452023-03-23 10:09:48

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-03-23 10:09:48]
  • 评测
  • 测评结果:WA
  • 用时:54ms
  • 内存:6368kb
  • [2023-03-23 10:09:45]
  • 提交

answer

#include <bits/stdc++.h>

class disjoint_set {
public:
  typedef std::size_t size_type;

protected:
  std::vector<size_type> fa;

public:
  disjoint_set(size_type n = 0) : fa(n) {
    std::iota(fa.begin(), fa.end(), 0);
  }

  size_type find(size_type x) {
    return fa[x] == x ? x : (fa[x] = find(fa[x]));
  }

  bool merge(size_type x, size_type y) {
    x = find(x), y = find(y);
    if (x == y) {
      return false;
    }
    fa[y] = x;
    return true;
  }
};

template<unsigned P>
class modint {
  static_assert(1 <= P, "P must be a positive integer");

  using mint = modint<P>;

protected:
  unsigned v;

public:
  constexpr modint() : v() {}

  template<typename T,
           typename std::enable_if<std::is_integral<T>::value &&
                                       std::is_signed<T>::value,
                                   bool>::type = true>
  constexpr modint(T t_v) : v() {
    long long tmp = t_v % static_cast<long long>(P);
    if (tmp < 0) {
      tmp += P;
    }
    v = tmp;
  }

  template<typename T,
           typename std::enable_if<std::is_integral<T>::value &&
                                       std::is_unsigned<T>::value,
                                   bool>::type = true>
  constexpr modint(T t_v) : v() {
    v = t_v % P;
  }

  constexpr unsigned val() const {
    return v;
  }

  static constexpr unsigned mod() {
    return P;
  }

  static constexpr mint raw(unsigned v) {
    mint res;
    res.v = v;
    return res;
  }

  constexpr mint &operator+=(const mint &rhs) {
    v < P - rhs.v ? v += rhs.v : v -= P - rhs.v;
    return *this;
  }

  constexpr mint &operator++() {
    v + 1 < P ? ++v : v = 0;
    return *this;
  }

  constexpr mint operator++(int) {
    mint tmp = *this;
    v + 1 < P ? ++v : v = 0;
    return tmp;
  }

  constexpr mint &operator-=(const mint &rhs) {
    v < rhs.v ? v += P - rhs.v : v -= rhs.v;
    return *this;
  }

  constexpr mint &operator--() {
    v ? --v : v = P - 1;
    return *this;
  }
  
  constexpr mint operator--(int) {
    mint tmp = *this;
    v ? --v : v = P - 1;
    return tmp;
  }

  constexpr mint operator-() const {
    mint res;
    res.v = v ? P - v : 0;
    return res;
  }

  constexpr mint &operator*=(const mint &rhs) {
    v = static_cast<unsigned long long>(v) * rhs.v % P;
    return *this;
  }

  constexpr mint pow(unsigned long long b) const {
    mint a(*this), s(1);
    for (; b; b >>= 1) {
      if (b & 1) {
        s *= a;
      }
      a *= a;
    }
    return s;
  }

  constexpr mint inv() const {
    return pow(P - 2);
  }

  constexpr friend mint operator+(const mint &lhs, const mint &rhs) {
    return mint(lhs) += rhs;
  }

  constexpr friend mint operator-(const mint &lhs, const mint &rhs) {
    return mint(lhs) -= rhs;
  }

  constexpr friend mint operator*(const mint &lhs, const mint &rhs) {
    return mint(lhs) *= rhs;
  }

  constexpr friend bool operator==(const mint &lhs, const mint &rhs) {
    return lhs.v == rhs.v;
  }

  constexpr friend bool operator!=(const mint &lhs, const mint &rhs) {
    return lhs.v != rhs.v;
  }

  friend std::istream &operator>>(std::istream &in, mint &x) {
    return in >> x.v;
  }

  friend std::ostream &operator<<(std::ostream &out, const mint &x) {
    return out << x.v;
  }
};

using mint = modint<998244353>;

int gcd(int a, int b) {
  return b ? gcd(b, a % b) : a;
}

int period(const std::string &s) {
  int n = s.size();
  std::vector<int> fail(n + 1, -1);
  fail[1] = 0;
  for (int i = 1, j = 0; i < n; ++i) {
    while (j && s[j] != s[i]) {
      j = fail[j];
    }
    if (s[j] == s[i]) {
      ++j;
    }
    fail[i + 1] = j;
  }
  int d = n - fail[n];
  if (n % d == 0) {
    return d;
  } else {
    return n;
  }
}

int main() {
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(nullptr);

  int n;
  std::cin >> n;
  std::vector<std::vector<bool>> E(n, std::vector<bool>(n));
  for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {
      int x;
      std::cin >> x;
      E[i][j] = E[j][i] = !x;
    }
  }
  int m;
  std::cin >> m;
  std::vector<int> a(m);
  std::vector<std::vector<int>> pos(n);
  for (int i = 0; i < m; ++i) {
    std::cin >> a[i];
    pos[--a[i]].push_back(i);
  }

  disjoint_set D(n);
  for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {
      if (E[i][j] && !pos[i].empty() && !pos[j].empty()) {
        D.merge(i, j);
      }
    }
  }
  std::vector<int> g(n);
  for (int i = 0; i < n; ++i) {
    g[D.find(i)] = gcd(g[D.find(i)], pos[i].size());
  }
  for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {
      if (E[i][j] && !pos[i].empty() && !pos[j].empty()) {
        std::string s;
        auto pi = pos[i].begin(), pj = pos[j].begin();
        while (pi != pos[i].end() || pj != pos[j].end()) {
          if (pj == pos[j].end() || (pi != pos[i].end() && *pi < *pj)) {
            s.push_back('0');
            ++pi;
          } else {
            s.push_back('1');
            ++pj;
          }
        }
        g[D.find(i)] = gcd(g[D.find(i)], s.size() / period(s));
      }
    }
  }

  std::vector<std::vector<int>> ans;
  for (int rt = 0; rt < n; ++rt) {
    if ((int)D.find(rt) == rt) {
      if (pos[rt].empty()) {
        bool ok = true;
        for (int i = 0; i < n; ++i) {
          if (!pos[i].empty()) {
            ok &= !E[rt][i];
          }
        }
        if (ok) {
          ans.emplace_back(1, rt);
        }
        continue;
      }
      std::vector<int> id(n, -1);
      std::vector<int> u;
      for (int i = 0; i < n; ++i) {
        if ((int)D.find(i) == rt) {
          id[i] = u.size();
          u.push_back(i);
        }
      }
      int z = u.size();
      std::vector<int> cnt(z);
      std::vector<int> s;
      for (int i = 0; i < m; ++i) {
        if (id[a[i]] != -1) {
          int t = id[a[i]];
          if (cnt[t] < (int)pos[a[i]].size() / g[rt]) {
            s.push_back(t);
            ++cnt[t];
          }
        }
      }
      std::vector<std::vector<bool>> G(z, std::vector<bool>(z));
      for (int x : u) {
        for (int y = 0; y < n; ++y) {
          if (E[x][y] && id[y] != -1) {
            G[id[x]][id[y]] = true;
          }
        }
      }

      std::vector<int> head(z), deg(z);

      auto add = [&](int i) {
        while (head[i] < (int)s.size() && s[head[i]] != i) {
          deg[i] += G[s[head[i]]][i];
          ++head[i];
        }
      };

      for (int i = 0; i < z; ++i) {
        add(i);
      }
      std::vector<int> ns;
      while (ns.size() < s.size()) {
        for (int i = 0; i < z; ++i) {
          if (head[i] < (int)s.size() && !deg[i]) {
            ns.push_back(u[i]);
            for (int j = 0; j < z; ++j) {
              deg[j] -= G[i][j];
            }
            ++head[i];
            add(i);
            break;
          }
        }
      }
      ans.push_back(ns);
    }
  }
  std::sort(ans.begin(), ans.end());
  for (const auto &p : ans) {
    mint sum = 0, pw = 1;
    if(n==200) std::cout<<"Siz "<<p.size()<<"\n"; 
    for (int x : p) {
      sum += (x + 1) * pw;
      pw *= n + 1;
    }
    std::cout << sum << "\n";
  }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 3384kb

input:

3
1 1
0
5
2 1 3 2 3

output:

1
14

result:

ok 2 number(s): "1 14"

Test #2:

score: 0
Accepted
time: 1ms
memory: 3348kb

input:

3
0 0
1
6
3 1 3 2 1 2

output:

39

result:

ok 1 number(s): "39"

Test #3:

score: 0
Accepted
time: 2ms
memory: 3336kb

input:

4
1 1 1
1 1
1
10
1 2 3 4 4 3 2 1 2 3

output:

1
2
3
4

result:

ok 4 number(s): "1 2 3 4"

Test #4:

score: 0
Accepted
time: 0ms
memory: 3472kb

input:

3
1 1
0
5
2 3 2 3 2

output:

1
750

result:

ok 2 number(s): "1 750"

Test #5:

score: -100
Wrong Answer
time: 54ms
memory: 6368kb

input:

200
1 0 1 1 0 0 0 0 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 1 0 1 1 1 0 1 0 1 1 0 0 1 1 0 0 0 0 0 1 0 1 1 1 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 1 0 1 1 0 1 0 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 1 0 1 1 0 0 0 1 0 1 0 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1 ...

output:

Siz 69
50576481

result:

wrong output format Expected integer, but "Siz" found