Submission #1150533

#TimeUsernameProblemLanguageResultExecution timeMemory
1150533brover29Cats or Dogs (JOI18_catdog)C++20
0 / 100
1 ms2624 KiB
#include "catdog.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N=1e5+29;
ll n,a[N],cntc[N],cntd[N],m,dp[N][8],dp2[8],cnt[N][4];
vector<ll>g[N];
bool can(ll v,ll mask){
  if(a[v]==4)return 1;
  if((mask>>(3^a[v]))&1)return 1;
  return 0;
}
void merge(ll v,ll u){
  if((a[v]^a[u])==3){
    for(ll mask=1;mask<=7;mask++){
      dp2[mask]=1e18;
      if(!((mask>>a[u])&1))continue;
      dp2[mask]=dp[v][mask]+1+min({dp[u][0],dp[u][1],dp[u][2],dp[u][3],dp[u][4],dp[u][5],dp[u][6],dp[u][7]});
    }
  }else{
    for(ll mask=0;mask<=7;mask++){
      dp2[mask]=1e18;
      if(can(v,mask)){
        dp2[mask]=dp[v][mask]+1+min({dp[u][0],dp[u][1],dp[u][2],dp[u][3],dp[u][4],dp[u][5],dp[u][6],dp[u][7]});
        if(!((mask>>a[u])&1))dp2[mask]=min(dp2[mask],dp[v][mask]+dp[u][mask]);
      }
    }
  }for(ll mask=0;mask<=7;mask++)dp[v][mask]=dp2[mask];
}void dfs(ll v,ll pr=0){
  for(ll mask=0;mask<=7;mask++){
    dp[v][mask]=0;
  }for(ll to:g[v]){
    if(to==pr)continue;
    dfs(to,v);
    merge(v,to);
  }
}
void initialize(int N, std::vector<int> A, std::vector<int> B) {
  m=A.size();
  n=N;
  for(ll i=1;i<=n;i++)a[i]=4;
  for(ll i=0;i<m;i++){
    ll u=A[i];
    ll v=B[i];
    assert(u>0&&u<=n);
    assert(v>0&&v<=n);
    g[v].push_back(u);  
    g[u].push_back(v);
  }
}
ll calc(){
  dfs(1);
  return min({dp[1][0],dp[1][1],dp[1][2],dp[1][3],dp[1][4],dp[1][5],dp[1][6],dp[1][7]});
}
int cat(int v) {
  a[v]=1;
  return calc();
}

int dog(int v) {
  a[v]=2;
  return calc();
}

int neighbor(int v) {
  ll x=a[v];
  a[v]=4;
  
  return calc();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...