Submission #683415

#TimeUsernameProblemLanguageResultExecution timeMemory
683415sunwukong123Digital Circuit (IOI22_circuit)C++17
100 / 100
1270 ms51100 KiB
#include "circuit.h" #include <bits/stdc++.h> using namespace std; #define int long long #define FOR(i,s,e) for(int i = s; i <= (int)e; ++i) #define DEC(i,s,e) for(int i = s; i >= (int)e; --i) #define IAMSPEED ios_base::sync_with_stdio(false); cin.tie(0); #ifdef LOCAL #define db(x) cerr << #x << "=" << x << "\n" #define db2(x, y) cerr << #x << "=" << x << " , " << #y << "=" << y << "\n" #define db3(a,b,c) cerr<<#a<<"="<<a<<","<<#b<<"="<<b<<","<<#c<<"="<<c<<"\n" #define dbv(v) cerr << #v << ":"; for (auto ite : v) cerr << ite << ' '; cerr <<"\n" #define dbvp(v) cerr << #v << ":"; for (auto ite : v) cerr << "{" << ite.f << ',' << ite.s << "} "; cerr << "\n" #define dba(a,ss,ee) cerr << #a << ":"; FOR(ite,ss,ee) cerr << a[ite] << ' '; cerr << "\n" #define reach cerr << "LINE: " << __LINE__ << "\n"; #else #define reach #define db(x) #define db2(x,y) #define db3(a,b,c) #define dbv(v) #define dbvp(v) #define dba(a,ss,ee) #endif mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); #define pb push_back #define eb emplace_back #define all(x) (x).begin(), (x).end() #define f first #define s second #define g0(x) get<0>(x) #define g1(x) get<1>(x) #define g2(x) get<2>(x) #define g3(x) get<3>(x) typedef pair <int, int> pi; typedef tuple<int,int,int> ti3; typedef tuple<int,int,int,int> ti4; int rand(int a, int b) { return a + rng() % (b-a+1); } const int MOD = 1'000'002'022; const int inf = (int)1e9 + 500; const long long oo = (long long)1e18 + 500; template <typename T> bool chmax(T& a, const T b) { return a<b ? a = b, 1 : 0; } template <typename T> bool chmin(T& a, const T b) { return a>b ? a = b, 1 : 0; } const int MAXN = 200005; vector<int> V[MAXN]; int state[MAXN]; int C[MAXN]; int choices[MAXN]; int n,k; void pre(int x) { int S=V[x].size(); choices[x]=max(1ll,S); for(auto v:V[x]) { pre(v); choices[x]=choices[x]*choices[v]%MOD; } } void dfs(int x, int mult) { int S=V[x].size(); if(S == 0) { C[x-n]=mult; return; } int pre[S+3]; int suf[S+3]; memset(pre, 0, sizeof pre); memset(suf, 0, sizeof suf); pre[0]=1; suf[S+1]=1; FOR(i,1,S) { int node = V[x][i-1]; pre[i] = (pre[i-1] * choices[node]) % MOD; } DEC(i,S,1) { int node = V[x][i-1]; suf[i] = (suf[i+1] * choices[node]) % MOD; } FOR(i,1,S) { int node = V[x][i-1]; int mul = pre[i-1] * suf[i+1] % MOD; dfs(node, mult * mul % MOD); } } struct node { int s,e,m,pot,lazy,sum; node *l, *r; node (int _s, int _e) { s=_s;e=_e;m=(s+e)/2; if(s!=e){ l=new node(s,m); r=new node(m+1,e); pot=(l->pot + r->pot)%MOD; sum = lazy = 0; } else { sum = lazy = 0; pot=C[s]; } } void value() { if(lazy==0)return; sum=((pot-sum)%MOD+MOD)%MOD; if(s==e){ lazy=0; value(); return; } l->lazy^=lazy; r->lazy^=lazy; lazy=0; } void update(int x, int y) { value(); if(s==x&&e==y) { lazy=1; return; } if(x>m)r->update(x,y); else if(y<=m)l->update(x,y); else l->update(x,m), r->update(m+1,y); l->value(); r->value(); sum = (l->sum + r->sum)%MOD; //assert(sum<=pot); } } *seg; void init(int32_t n, int32_t m, vector<int32_t> P, vector<int32_t> A) { ::n=n; ::k=m; FOR(i,1,n+m-1) { V[P[i]].pb(i); } FOR(i,0,m-1) { state[i]=A[i]; } pre(0); dfs(0,1); seg=new node(0,m-1); FOR(i,0,m-1) { if(state[i])seg->update(i,i); } } int32_t count_ways(int32_t L, int32_t R) { L-=n;R-=n; seg->update(L,R); seg->value(); return seg->sum; }
#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...