이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "circuit.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
const ll MOD = 1000002022;
const int MAXN = 1e5+5;
vector<int>adj[MAXN];
ll c[MAXN],sub[MAXN];
int n,m;
void dfs(int v){
if(adj[v].empty())sub[v] = 1;
else sub[v] = adj[v].size();
for(int x:adj[v]){
dfs(x);
sub[v] = sub[v]*sub[x]%MOD;
}
}
void dfs(int v,ll cur){
if(adj[v].empty()){
c[v-n] = cur;
return;
}
int s = adj[v].size();
vector<ll>pref(s,1),suff(s,1);
for(int i=0;i<s;i++){
pref[i] = sub[adj[v][i]];
suff[i] = sub[adj[v][i]];
if(i)pref[i] = pref[i]*pref[i-1]%MOD;
}
for(int i=s-2;i>=0;i--)suff[i] = suff[i]*suff[i+1]%MOD;
for(int i=0;i<s;i++){
ll k = 1;
if(i)k = pref[i-1]*k%MOD;
if(i!=s-1)k = suff[i+1]*k%MOD;
dfs(adj[v][i],(cur*k)%MOD);
}
}
ll ans = 0;
vector<int>a;
void init(int N, int M, vector<int> p, vector<int> A) {
n = N;
m = M;
a = A;
for(int i=1;i<n+m;i++)adj[p[i]].push_back(i);
dfs(0);
dfs(0,1);
for(int i=0;i<m;i++){
if(a[i])ans+=c[i];
ans%=MOD;
}
}
int count_ways(int L, int R) {
L-=n;
R-=n;
for(int i=L;i<=R;i++){
if(!a[i])ans+=c[i];
else ans+=MOD-c[i];
a[i]^=1;
ans%=MOD;
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |