제출 #787538

#제출 시각아이디문제언어결과실행 시간메모리
787538thimote75디지털 회로 (IOI22_circuit)C++17
18 / 100
3035 ms3364 KiB
#include "circuit.h"

#include <bits/stdc++.h>
#define num long long

using namespace std;
const int MOD = 1000002022;

using idata = vector<int>;
using ndata = vector<num>;
using igrid = vector<idata>;

ndata C;

idata status;
idata target;
igrid roads;

int N, M;

void init(int _N, int _M, idata P, idata A) {
  N = _N; M = _M;
  C    .resize(N);

  roads.resize(N);

  for (int i = 1; i < N + M; i ++)
    roads[P[i]].push_back(i);

  status = A;
  target.resize(M);
  for (int i = 0; i < M; i ++)
    target[i] = P[i + N];

  for (int i = 1; i < N + M; i ++) C[P[i]] ++;
}

pair<num, num> dfs (int node) {
  if (node >= N)
    return { 1 - status[node - N], status[node - N] };

  ndata grid(C[node] + 1, 0);
  grid[0] = 1;

  for (int next : roads[node]) {
    pair<num, num> res = dfs(next);

    for (int i = grid.size() - 1; i >= 0; i --) {
      if (i + 1 != grid.size()) {
        grid[i + 1] += grid[i] * res.second;
        grid[i + 1] %= MOD;
      }

      grid[i] *= res.first; grid[i] %= MOD;
    }
  }

  pair<num, num> result = { 0, 0 };
  for (int i = 1; i < grid.size(); i ++) {
    result.second += i * grid[i];
    result.second %= MOD;

    result.first += (grid.size() - i) * grid[i - 1];
    result.first %= MOD;
  }

  return result;
}

int count_ways(int L, int R) {
  L -= N; R -= N;
  for (int i = L; i <= R; i ++)
    status [i] = 1 - status[i];
  
  return dfs(0).second;
}

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

circuit.cpp: In function 'std::pair<long long int, long long int> dfs(int)':
circuit.cpp:49:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   49 |       if (i + 1 != grid.size()) {
      |           ~~~~~~^~~~~~~~~~~~~~
circuit.cpp:59:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |   for (int i = 1; i < grid.size(); i ++) {
      |                   ~~^~~~~~~~~~~~~
#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...