Submission #1231643

#TimeUsernameProblemLanguageResultExecution timeMemory
1231643adriines06Digital Circuit (IOI22_circuit)C++20
0 / 100
3021 ms4380 KiB
#include "circuit.h"
#include <vector>
#include<bits/stdc++.h>
using namespace std;
vector<pair<int,int>>dp;
vector<int>a;
vector<vector<int>>adj;
int n,m;
void init(int N, int M, std::vector<int> P, std::vector<int> A) {
  dp.resize(N+M);
  adj.resize(N+M);
  a.resize(M);
  n=N;
  m=M;
  for(int i=1;i<N+M;i++){
    adj[P[i]].push_back(i);
  }
  for(int i=0;i<M;i++){
    a[i]=A[i];
  }

}
void dfs(int u, int p, vector<pair<int,int>>&Dp){
  if(u>=n) return;
  int l=0,l1=0,r=0,r1=0,cont=0;
  for(int v: adj[u]){
    if(v!=p){
      cont++;
      dfs(v,u,Dp);
      if(cont==1){
        l=Dp[v].second; 
        l1=Dp[v].first;
      }
      else{
        r=Dp[v].second; 
        r1=Dp[v].first;
      }
    }
  }
  Dp[u].first=l*r1+l1*r+2*l1*r1;
  Dp[u].second=l*r1+l1*r+2*l*r;
  //cout<<":)))"<<Dp[u].first<<" "<<Dp[u].second<<"\n";
  return;
}
int count_ways(int L, int R) {
  for(int i=L;i<=R;i++){
    a[i-n]=!a[i-n];
  }
  //f->prendido s->apagado
  for(int i=0;i<m;i++){
    if(a[i]==1){
      dp[n+i].first=1;
      dp[n+i].second=0;
    }
    else{
      dp[n+i].first=0;
      dp[n+i].second=1;
    }
  }
  dfs(0,-1,dp);

  return dp[0].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...