Submission #1162362

#TimeUsernameProblemLanguageResultExecution timeMemory
1162362hengliaoJOI tour (JOI24_joitour)C++20
20 / 100
3092 ms40336 KiB
#include "joitour.h"
#include<bits/stdc++.h>
using namespace std;

#define F first
#define S second
#define pll pair<ll, ll>
#define vll vector<ll>
#define pb push_back

typedef long long ll;

const ll mxN=2e5+5;

vll adj[mxN];
ll dp[mxN][5];
ll ans;
ll a[mxN];
ll sum[3];
ll con[mxN];


void dfs(ll cur, ll par){
  for(ll i=0;i<5;i++) dp[cur][i]=0;
  dp[cur][a[cur]]++;
  sum[a[cur]]++;
  for(auto &chd:adj[cur]){
    if(chd==par) continue;
    dfs(chd, cur);
    for(ll i=0;i<3;i++){
      dp[cur][i]+=dp[chd][i];
    }
  }
}

void dfs3(ll cur, ll par){
  if(a[cur]==1){
    dp[cur][3]=dp[cur][0];
    dp[cur][4]=dp[cur][2];
  }
  for(auto &chd:adj[cur]){
    if(chd==par) continue;
    dfs3(chd, cur);
    for(ll i=3;i<5;i++){
      dp[cur][i]+=dp[chd][i];
    }
  }
}

void dfs2(ll cur, ll par){
  // if(a[cur]==1){
  //   for(auto &chd:adj[cur]){
  //     if(chd==par) continue;
  //     ans+=dp[chd][0]*(sum[2]-dp[chd][2]);
  //   }
  //   ans+=(sum[0]-dp[cur][0])*dp[cur][2];
  // }

  con[cur]=0;

  for(auto &chd:adj[cur]){
    if(chd==par) continue;
    dfs2(chd, cur);
    con[cur]+=dp[chd][3]*(dp[cur][2]-dp[chd][2]);
    con[cur]+=dp[chd][4]*(dp[cur][0]-dp[chd][0]);
    if(a[cur]==1) con[cur]+=dp[chd][0]*(dp[cur][2]-dp[chd][2]);
  }

  ans+=con[cur];

} 

void init(int n, vector<int> tep, vector<int> u, vector<int> v, int q) {
  for(ll i=0;i<n;i++){
    a[i]=tep[i];
  }
  for(ll i=0;i<n-1;i++){
    adj[u[i]].pb(v[i]);
    adj[v[i]].pb(u[i]);
  }
}

void change(int X, int Y) {
  a[X]=Y;
}

long long num_tours() {
  ans=0;
  for(ll i=0;i<3;i++) sum[i]=0;
  dfs(0, -1);
  dfs3(0, -1);
  dfs2(0, -1);
  return ans;
}
#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...