Submission #912723

#TimeUsernameProblemLanguageResultExecution timeMemory
912723biankDigital Circuit (IOI22_circuit)C++17
34 / 100
3102 ms12472 KiB
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
typedef long long ll;
typedef pair<int,int> ii; 
#define ALL(x) x.begin(),x.end()
#define SIZE(x) (int)x.size()
#define forsn(i,s,n) for(int i=int(s);i<int(n);i++)
#define forn(i,n) for(int i=0;i<int(n);i++)
#define dforsn(i,s,n) for(int i=int(n)-1;i>=int(s);i--)
#define dforn(i,n) for(int i=int(n)-1;i>=0;i--)
#define fst first
#define snd second
#define pb push_back
const int MAXN = 2e5;
const int MOD = 1e9+2022;
vi s, adj[MAXN];
int n, m;
int dp[MAXN][2];
 
int mul(int x, int y) {
    return int(1LL*x*y%MOD);
}

void add(int &x, int y) {
    x+=y;
    if(x>=MOD) x-=MOD;
}
 
void compute_dp(int u) {
    int l=2*u+1, r=2*u+2;
    
    int aux = mul(dp[l][0], dp[r][1]);
    add(aux, mul(dp[l][1], dp[r][0]));
    dp[u][1] = dp[u][0] = aux;
    
    aux = mul(mul(2, dp[l][0]), dp[r][0]);
    add(dp[u][0], aux);
    
    aux = mul(mul(2, dp[l][1]), dp[r][1]);
    add(dp[u][1], aux);
}
 
void dfs_st(int u) {
    if(u>=n) {
        dp[u][s[u-n]] = 1;
        dp[u][!s[u-n]] = 0;
        return;
    }
    dfs_st(2*u+1), dfs_st(2*u+2);
    compute_dp(u);
}
 
bool bt=true;
 
void init(int N, int M, vi P, vi A) {
    bt &= M==N+1;
    bt &= !(M&(M-1));
    s=A, n=N, m=M;
    forsn(i,1,n+m) {
        adj[P[i]].pb(i);
        bt &= P[i]==(i-1)/2;
    }
    if(bt) dfs_st(0);
}

bool lazy[MAXN];

void pass(int u) {
    if(!lazy[u]) return;
    if(2*u+2<MAXN) {
        lazy[2*u+1] ^= 1;
        lazy[2*u+2] ^= 1;
    }
    swap(dp[u][0], dp[u][1]);
    lazy[u] = false;
}

void update(int ql, int qr, int nl, int nr, int u) {
    pass(u);
    if(qr <= nl || nr <= ql) {
        return;
    }
    if(ql <= nl && nr <= qr) {
        lazy[u] ^= 1;
        pass(u);
        return;
    }
    int nm=(nl+nr)/2;
    update(ql,qr,nl,nm,2*u+1);
    update(ql,qr,nm,nr,2*u+2);
    compute_dp(u);
}
 
ii dfs(int u) {
    int c=SIZE(adj[u]);
    if(!c) return {!s[u-n], s[u-n]};
    vi ways(c+1,0);
    ways[0] = 1;
    forn(i,c) {
        ii child=dfs(adj[u][i]);
        dforn(j,c+1) {
            ways[j] = mul(ways[j],child.fst);
            if(j) add(ways[j],mul(ways[j-1],child.snd));
        }
    }
    ii ans = {0,0};
    forsn(i,1,c+1) {
        forn(j,i) add(ans.fst, ways[j]);
        forsn(j,i,c+1) add(ans.snd, ways[j]);
    }
    return ans;
}
 
int count_ways(int L, int R) {
    if(bt) {
        update(L-n, R-n+1, 0, m, 0);
        return dp[0][1];
    }
    forsn(i,L,R+1) s[i-n]^=1;
    return int(dfs(0).snd);
}
#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...