Submission #876351

# Submission time Handle Problem Language Result Execution time Memory
876351 2023-11-21T15:22:49 Z Halfjuice Digital Circuit (IOI22_circuit) C++17
Compilation error
0 ms 0 KB
#include <vector>

using namespace std;

long modPow(long b, long e, long m)
{
    b = b%m;
    long r = 1;
    while (e>0) {
        if (e%2 == 1) {
            r = (r*b) % m;
        }
        b = (b*b)%m;
        e >>= 1;
    }
    return r;
}

#define MOD 1000002022

typedef struct _Node {
    _Node* parent;
    vector<_Node*> children;
    
    int index;
    int internalNodeCount;
    int internalNodeComb;
    long contribCount;
  
    void initAny() {
        internalNodeCount = 0;
        internalNodeComb = 1;
        contribCount = 0;
    
        for (auto it=children.begin(); it!=children.end(); ++it) {
            (*it)->initAny();
            if ((*it)->children.size() > 0) {
                internalNodeCount += (*it)->internalNodeCount;
                internalNodeComb = (internalNodeComb * (*it)->children.size()) % MOD;
            }
        }
        if (children.size() > 0) {
            internalNodeCount += 1;
            internalNodeComb = (internalNodeComb * children.size()) % MOD;
        }
    }
  
    long searchPathUp(_Node* child) {
        long res = 1;
        for (auto it=children.begin(); it!=children.end(); ++it) {
            if (*it != child) {
                res = (res * (*it)->internalNodeComb) % MOD;
            }
        }
        if (parent) {
            res = (res*parent->searchPathUp(this)) % MOD;
        }
        return res;
    }
    
    void print() {
        cout << "N" << index << " C=" << children.size() << " IC=" << internalNodeCount << " Ct=" << contribCount << endl;
    }
  
    void initLeaf() {
        if (this->children.size() == 0) {
            contribCount = parent->searchPathUp(this);
        }
    }
} Node;
 
vector<Node> nodes;
vector<int> state;
long cur;
int n, m;
 
#define DEBUG_PRINT(nodes) for (int i=0; i<N+M; i++) nodes[i].print(); 
//#define DEBUG_PRINT(nodes)

void init(int N, int M, vector<int> P, vector<int> A) {
    n = N;
    m = M;
    nodes.empty();
    for (int i=0; i<N+M; i++) {
        nodes.push_back(Node());
    }
    for (int i=0; i<N+M; i++) {
        if (P[i] == -1) {
            nodes[i].parent = 0;
        } else {
            nodes[i].parent = &(nodes[P[i]]);
            nodes[P[i]].children.push_back(&(nodes[i]));
            nodes[i].index = i;
        }
    }
    
    DEBUG_PRINT(nodes)
    nodes[0].initAny();
    DEBUG_PRINT(nodes)
  
    for (int i=N; i<N+M; i++) {
        nodes[i].initLeaf();
    }
    
    DEBUG_PRINT(nodes)
    
    state = A;
    cur = 0;
    for (int i=0; i<M; i++) {
        cur = (cur + nodes[N+i].contribCount*state[i]) % MOD;
    }
}
 
int count_ways(int L, int R) {
    for (int i=L; i<=R; i++) {
        if (state[i-n]) {
            state[i-n] = 0;
            cur = (cur - nodes[i].contribCount) % MOD;
        } else {
            state[i-n] = 1;
            cur = (cur + nodes[i].contribCount) % MOD;
        }
    }
    if (cur < 0) {
        cur = cur + MOD;
    }
    return cur;
}

Compilation message

circuit.cpp: In member function 'void _Node::print()':
circuit.cpp:63:9: error: 'cout' was not declared in this scope
   63 |         cout << "N" << index << " C=" << children.size() << " IC=" << internalNodeCount << " Ct=" << contribCount << endl;
      |         ^~~~
circuit.cpp:3:1: note: 'std::cout' is defined in header '<iostream>'; did you forget to '#include <iostream>'?
    2 | #include <vector>
  +++ |+#include <iostream>
    3 | 
circuit.cpp:63:118: error: 'endl' was not declared in this scope
   63 |         cout << "N" << index << " C=" << children.size() << " IC=" << internalNodeCount << " Ct=" << contribCount << endl;
      |                                                                                                                      ^~~~
circuit.cpp:3:1: note: 'std::endl' is defined in header '<ostream>'; did you forget to '#include <ostream>'?
    2 | #include <vector>
  +++ |+#include <ostream>
    3 | 
circuit.cpp: In function 'void init(int, int, std::vector<int>, std::vector<int>)':
circuit.cpp:84:16: warning: ignoring return value of 'bool std::vector<_Tp, _Alloc>::empty() const [with _Tp = _Node; _Alloc = std::allocator<_Node>]', declared with attribute 'nodiscard' [-Wunused-result]
   84 |     nodes.empty();
      |     ~~~~~~~~~~~^~
In file included from /usr/include/c++/10/vector:67,
                 from circuit.cpp:2:
/usr/include/c++/10/bits/stl_vector.h:1007:7: note: declared here
 1007 |       empty() const _GLIBCXX_NOEXCEPT
      |       ^~~~~