#include <iostream>
#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;
}
int main222() {
init(3, 4, {-1, 0, 1, 2, 1, 1, 0}, {1, 0, 1, 0});
std::cout << count_ways(3, 4) << endl;
std::cout << count_ways(4, 5) << endl;
std::cout << count_ways(3, 6) << endl;
//init(2, 1, {-1, 0, 1}, {1});
//std::cout << count_ways(0, 0);
return 0;
}
Compilation message
circuit.cpp: In function 'void init(int, int, std::vector<int>, std::vector<int>)':
circuit.cpp:85: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]
85 | nodes.empty();
| ~~~~~~~~~~~^~
In file included from /usr/include/c++/10/vector:67,
from circuit.cpp:3:
/usr/include/c++/10/bits/stl_vector.h:1007:7: note: declared here
1007 | empty() const _GLIBCXX_NOEXCEPT
| ^~~~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
344 KB |
Possible tampering with the output or unexpected termination of the program |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
344 KB |
Possible tampering with the output or unexpected termination of the program |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
344 KB |
Possible tampering with the output or unexpected termination of the program |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
14 ms |
5832 KB |
Execution killed with signal 13 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
14 ms |
5832 KB |
Execution killed with signal 13 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
344 KB |
Possible tampering with the output or unexpected termination of the program |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
344 KB |
Possible tampering with the output or unexpected termination of the program |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
1 ms |
344 KB |
Possible tampering with the output or unexpected termination of the program |
2 |
Halted |
0 ms |
0 KB |
- |