제출 #1361039

#제출 시각아이디문제언어결과실행 시간메모리
1361039altern23디지털 회로 (IOI22_circuit)C++20
100 / 100
416 ms31904 KiB
#include "circuit.h"

#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int MOD = 1'000'002'022;
const int MAXN =  2e5;

vector <int> adj[MAXN+5];
ll dp[MAXN+5], prod[MAXN+5], N, M;

struct Segtree {
      ll l, r, flip, val;
      Segtree *lf, *rg;

      bool z = 0;

      void build() {
            val = flip = 0;
            if (l == r) {
                  flip = dp[l];
            }
            else {
                  ll mid = (l+r)/2;
                  lf = new Segtree(), rg = new Segtree();
                  lf->l = l, lf->r = mid;
                  rg->l = mid+1, rg->r = r;
                  lf->build(), rg->build();
                  flip = (lf->flip+rg->flip)%MOD;
            }
      }

      void push() {
            if (z) {
                  lf->val = (lf->flip-lf->val+MOD)%MOD;
                  rg->val = (rg->flip-rg->val+MOD)%MOD;
                  lf->z ^= 1, rg->z ^= 1;
            }
            z = 0;
      }

      void update(ll x, ll y) {
            if (l > y || r < x) return;
            if (l >= x && r <= y) {
                  val = (flip-val+MOD)%MOD;
                  z ^= 1;
                  return;
            }
            push();
            lf->update(x, y), rg->update(x, y);
            val = (lf->val+rg->val)%MOD;
      }
} sg;

void dfs2(ll idx) {
      if (idx >= N) return;
      vector <ll> sf((ll)adj[idx].size()+1, 1LL);

      for (int i = (ll)adj[idx].size()-1; i >= 0; --i) {
            sf[i] = sf[i+1]*prod[adj[idx][i]]%MOD;
      }

      ll ps = 1;
      
      for (int i = 0; i < (ll)adj[idx].size(); i++) {
            dp[adj[idx][i]] = dp[idx]*ps%MOD*sf[i+1]%MOD;
            dfs2(adj[idx][i]);
            ps *= prod[adj[idx][i]];
            ps %= MOD;
      }
}

void dfs(ll idx) {
      prod[idx] = 1;
      for (auto i : adj[idx]) {
            dfs(i);
            prod[idx] *= prod[i];
            prod[idx] %= MOD;
      }

      if (!adj[idx].empty()) {
            prod[idx] *= (ll)adj[idx].size();
            prod[idx] %= MOD;
      }
}

void init(int n, int m, vector<int> P, vector<int> A) {
      N = n, M = m;
      for (int i = 1; i < N+M; i++) {
            adj[P[i]].push_back(i);
      }

      // calculate the contribution of each source gate
      dfs(0);

      dp[0] = 1;
      dfs2(0);

      sg.l = N, sg.r = N+M-1;
      sg.build();

      for (int i = 0; i < M; i++) {
            if (A[i]) sg.update(N+i, N+i);
      }
}

int count_ways(int L, int R) {
      sg.update(L, R);
      return sg.val;
}
#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...