Submission #1217422

#TimeUsernameProblemLanguageResultExecution timeMemory
1217422HappyCapybaraDigital Circuit (IOI22_circuit)C++17
100 / 100
387 ms31396 KiB
#include "circuit.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long

int m = 1000002022, N, M;

vector<ll> pref, suf, subt;
vector<vector<int>> g;

vector<bool> lazy;
vector<pair<ll, ll>> st;

void pushdown(int node){
  if (!lazy[node]) return;
  st[node*2].first = (st[node*2].second-st[node*2].first+2*m) % m;
  st[node*2+1].first = (st[node*2+1].second-st[node*2+1].first+2*m) % m;
  lazy[node*2] = !lazy[node*2];
  lazy[node*2+1] = !lazy[node*2+1];
  lazy[node] = false;
}

void update(int l, int r, int node=1, int tl=0, int tr=M-1){
  //cout << l << " " << r << " " << node << " " << tl << " " << tr << endl;
  if (tl != tr) pushdown(node);
  if (l <= tl && tr <= r){
    lazy[node] = true;
    st[node].first = (st[node].second-st[node].first+2*m) % m;
    return;
  }
  int tm = (tl+tr)/2;
  if (l <= tm) update(l, r, node*2, tl, tm);
  if (tm+1 <= r) update(l, r, node*2+1, tm+1, tr);
  st[node].first = (st[node*2].first+st[node*2+1].first) % m;
}

void build(vector<ll>& tot, int node=1, int tl=0, int tr=M-1){
  if (tl == tr){
    st[node] = {0, tot[tl]};
    return;
  }
  int tm = (tl+tr)/2;
  build(tot, node*2, tl, tm);
  build(tot, node*2+1, tm+1, tr);
  st[node] = {0, (st[node*2].second+st[node*2+1].second) % m};
}

void dfs(int cur, ll ct, vector<ll>& tot){
  if (cur >= N){
    tot[cur-N] = ct;
    return;
  }
  int s = g[cur].size();
  for (int i=0; i<s; i++){
    if (i == 0) pref[g[cur][i]] = subt[g[cur][i]];
    else pref[g[cur][i]] = (pref[g[cur][i-1]]*subt[g[cur][i]]) % m;
  }
  for (int i=s-1; i>=0; i--){
    if (i == s-1) suf[g[cur][i]] = subt[g[cur][i]];
    else suf[g[cur][i]] = (suf[g[cur][i+1]]*subt[g[cur][i]]) % m;
  }
  for (int i=0; i<s; i++){
    ll nt = ct;
    if (i != 0) nt = (nt*pref[g[cur][i-1]]) % m;
    if (i != s-1) nt = (nt*suf[g[cur][i+1]]) % m;
    dfs(g[cur][i], nt, tot);
  }
}

void init(int N, int M, vector<int> P, vector<int> A){
  ::N = N;
  ::M = M;
  vector<ll> deg(N, 0);
  for (int i=1; i<N+M; i++) deg[P[i]]++;
  vector<ll> tot(M, 1);

  subt.resize(N+M, 1);
  for (int i=N-1; i>=0; i--){
    subt[i] = (subt[i]*deg[i]) % m;
    if (i != 0) subt[P[i]] = (subt[P[i]]*subt[i]) % m;
  }
  pref.resize(N+M, 1);
  suf.resize(N+M, 1);
  g.resize(N+M);
  for (int i=N+M-1; i>0; i--) g[P[i]].push_back(i);
  dfs(0, 1, tot);
  st.resize(4*M);
  lazy.resize(4*M, false);
  build(tot);
  for (int i=0; i<M; i++){
    if (A[i]) update(i, i);
  }
}

int count_ways(int L, int R){
  update(L-N, R-N);
  return st[1].first;
}
#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...