제출 #631794

#제출 시각아이디문제언어결과실행 시간메모리
6317944123xr4323디지털 회로 (IOI22_circuit)C++17
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h>
#define mp make_pair
#define all(a) a.begin(),a.end()
using namespace std;
using pii = pair <long long, long long>;
using ll = long long;
constexpr int maxn = 1e5 + 10;
constexpr int mod = 1000002022;
constexpr long long inf = 1e17 + 10;

vector <int> graph [maxn];
long long sub_size [maxn], ans [maxn];
long long x [maxn], tree [maxn << 2], S [maxn << 2];
bool R [maxn << 2];
int I = 0, N = 0;

inline void build (int v, int t_l, int t_r) {
    if (t_l == t_r) {
        S[v] = ans[t_l];
        return;
    }
    int t_m = t_l + t_r >> 1;
    build (v << 1, t_l, t_m);
    build (v << 1 | 1, t_m + 1, t_r);
    S[v] = (S[v << 1] + S[v << 1 | 1]) % mod;
} 

inline void push (int v, int t_l, int t_r) {
    if (!R[v]) return;
    tree[v] = S[v] - tree[v];
    if (t_l < t_r) {
        R[v << 1] ^= 1;
        R[v << 1 | 1] ^= 1;
    }
    R[v] = false;
}

inline void update (int l, int r, int v, int t_l, int t_r) {
    push (v, t_l, t_r);
    if (l > t_r || t_l > r) return;
    if (l <= t_l && t_r <= r) {
        R[v] = true;
        push (v, t_l, t_r);
        return;
    }
    int t_m = t_l + t_r >> 1;
    update (l, r, v << 1, t_l, t_m);
    update (l, r, v << 1 | 1, t_m + 1, t_r);
    tree[v] = tree[v << 1] + tree[v << 1 | 1];
}

inline void dfs0 (int v) {
    sub_size[v] = max (1LL, (long long) graph[v].size ());
    for (int i : graph[v]) {
        dfs0 (i);
        sub_size[v] = (sub_size[v] * sub_size[i]) % mod;
    }
}

inline void dfs1 (int v, long long cur) {
    x[v] = cur;
    for (int i : graph[v]) {
        long long cur0 = cur;
        for (int j : graph[v]) if (i != j) cur0 = (cur0 * sub_size[j]) % mod;
        dfs1 (i, cur0);
    }
}

inline void init (int n, int m, vector <int> p, vector <int> a) {
    for (int i = 1; i < n + m; ++i) graph[p[i]].push_back (i);
    dfs0 (0);
    dfs1 (0, 1);
    for (int i = n; i < n + m; ++i) ans[i] = x[p[i]];
    build (1, n, n + m - 1);
    for (int i = 0; i < m; ++i) if (a[i]) update (i + n, i + n, 1, n, n + m - 1);
    I = n + m - 1;
    N = n;
}

inline int count_ways (int l, int r) {
    update (l, r, 1, N, I);
    return tree[1];
}

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

circuit.cpp: In function 'void build(int, int, int)':
circuit.cpp:22:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   22 |     int t_m = t_l + t_r >> 1;
      |               ~~~~^~~~~
circuit.cpp: In function 'void update(int, int, int, int, int)':
circuit.cpp:46:19: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   46 |     int t_m = t_l + t_r >> 1;
      |               ~~~~^~~~~
/usr/bin/ld: /tmp/ccFAxvbZ.o: in function `main':
stub.cpp:(.text.startup+0x128): undefined reference to `init(int, int, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >)'
/usr/bin/ld: stub.cpp:(.text.startup+0x169): undefined reference to `count_ways(int, int)'
collect2: error: ld returned 1 exit status