제출 #855582

#제출 시각아이디문제언어결과실행 시간메모리
85558212345678디지털 회로 (IOI22_circuit)C++17
25 / 100
579 ms22068 KiB
#include "circuit.h"
 
#include <bits/stdc++.h>
 
using namespace std;
 
#define ll long long
 
const int nx=1e5+5, mod=1e9+2022;
 
int n, m, p[2*nx], sz[2*nx], v[2*nx];
vector<int> d[nx];
 
void dfs(int u)
{
    for (auto v:d[u]) sz[v]=sz[u]+1, dfs(v);
}
 
struct segtree
{
    int d1[4*nx], d2[4*nx];
    bool lz[4*nx];
    void build(int l, int r, int i, vector<int> &t)
    {
        if (l==r) return t[l]?d1[i]=v[l]:d2[i]=v[l], void();
        int md=(l+r)/2;
        build(l, md, 2*i, t);
        build(md+1, r, 2*i+1, t);
        d1[i]=(d1[2*i]+d1[2*i+1])%mod;
        d2[i]=(d2[2*i]+d2[2*i+1])%mod;
    }
    void pushlz(int l, int r, int i)
    {
        if (!lz[i]) return;
        lz[i]=0; swap(d1[i], d2[i]);
        if (l==r) return;
        lz[2*i]=!lz[2*i];
        lz[2*i+1]=!lz[2*i+1];
    }
    void update(int l, int r, int i, int ql, int qr)
    {
        pushlz(l, r, i);
        if (r<ql||qr<l) return;
        if (ql<=l&&r<=qr) return lz[i]=1, pushlz(l, r, i), void();
        int md=(l+r)/2;
        update(l, md, 2*i, ql, qr);
        update(md+1, r, 2*i+1, ql, qr);
        d1[i]=(d1[2*i]+d1[2*i+1])%mod;
        d2[i]=(d2[2*i]+d2[2*i+1])%mod;
    }
} s;
 
void init(int N, int M, std::vector<int> P, std::vector<int> A) {
    p[0]=1; n=N; m=M;
    for (int i=1; i<N+M; i++) p[i]=(p[i-1]*2)%mod;
    for (int i=1; i<N+M; i++) d[P[i]].push_back(i);
    dfs(0);
    for (int i=N; i<N+M; i++) v[i-N]=p[N-sz[i]];
    s.build(0, M-1, 1, A);
}
 
int count_ways(int L, int R) {;
    s.update(0, m-1, 1, L-n, R-n);
    return s.d1[1];
}
#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...