Submission #1205215

#TimeUsernameProblemLanguageResultExecution timeMemory
1205215akamizaneCats or Dogs (JOI18_catdog)C++20
Compilation error
0 ms0 KiB
#include<bits/stdc++.h>
#include "catdog.h"

using namespace std;

#define int long long

const int maxn = 1e5 + 5;
const int inf = 1e9;

struct Node {
   int dp[2][2];
   Node (int cat = 0, int dog = 0){
      dp[0][0] = cat;
      dp[1][1] = dog;
      dp[0][1] = dp[1][0] = inf;
   } 
   friend Node operator + (Node left, Node right){
      Node ans = Node(inf, inf);
      for (int l = 0; l < 2; l++){
         for (int r = 0; r < 2; r++){
            for (int a = 0; a < 2; a++){
               for (int b = 0; b < 2; b++){
                  ans.dp[l][r] = min(ans.dp[l][r], left.dp[l][a] + right.dp[b][r] + (a ^ b));
               }
            }
         }
      }
      return ans;
   }
};

struct Segtree {
   int n;
   vector<Node> t;
   Segtree(){}
   Segtree(int _n){
      n = _n;
      t.resize((n << 2) + 1);
   } 
   void update(int id, int l, int r, int pos, int cat, int dog){
      if (l == r){
         t[id].dp[0][0] += cat;
         t[id].dp[1][1] += dog;
         return;
      }
      else{
         int m = (l + r) >> 1;
         if (pos <= m) update(id << 1, l, m, pos, cat, dog);
         else update(id << 1 | 1, m + 1, r, pos, cat, dog);
         t[id] = t[id << 1] + t[id << 1 | 1]; 
      }
   }
   void upd(int pos, int cat, int dog){
      update(1, 1, n, pos, cat, dog);
   }

   int cat(){
      return min(t[1].dp[0][1], t[1].dp[0][0]);
   }

   int dog(){
      return min(t[1].dp[1][0], t[1].dp[1][1]);
   }
};

int sz[maxn], head[maxn], inChain[maxn], par[maxn], id[maxn], type[maxn], cursz[maxn], tin[maxn], pre[2][maxn], timeDfs, Chain, n;
vector<int> ad[maxn];
Segtree st[maxn];

void dfs(int u, int p){
   sz[u] = 1;
   par[u] = p;
   for (auto v : ad[u]){
      if (v == p) continue;
      dfs(v, u);
      sz[u] += sz[v];
   }
}

void hld (int u, int p){
   id[u] = Chain;
   tin[u] = ++timeDfs;
   if (!head[Chain]) head[Chain] = u;
   if (cursz[Chain] = 0) cursz[Chain] = 1;
   inChain[u] = cursz[Chain]++;
   int nxt = 0;
   for (auto v : ad[u]){
      if (v == p) continue;
      if (sz[v] > sz[nxt]) nxt = v;
   }
   if (nxt) hld(nxt, u);
   for (auto v : ad[u]){
      if (v == p || v == nxt) continue;
      Chain++;
      hld(v, u);
   }  
}

int update(int u, int ncat, int ndog){
   st[id[u]].upd(inChain[u], ncat, ndog);
   while(u){
      int v = par[head[id[u]]];
      if (v){
         st[id[v]].upd(inChain[v], -pre[0][id[u]], -pre[1][id[u]]);
      }
      pre[0][id[u]] = min(st[id[u]].cat(), st[id[u]].dog() + 1);
      pre[0][id[u]] = min(st[id[u]].dog(), st[id[u]].cat() + 1);
      if (v){
         st[id[v]].upd(inChain[v], pre[0][id[u]], pre[1][id[u]]);
      }
      u = par[head[id[u]]];
   }
   return min(st[1].dog(), st[1].cat());
}

void initialize(int N, vector<int> A, vector<int> B){
   n = N;
   for(int i = 0; i < n - 1; i++){
      ad[A[i]].push_back(B[i]);
      ad[B[i]].push_back(A[i]);
   }
   dfs(1, -1);
   Chain = 1, timeDfs = 0;
   hld(1, -1);
   for(int i = 1; i <= Chain; i++) st[i] = Segtree(cursz[i]);
}

int cat (int u){
   type[u] = 1;
   return update(u, 0, maxn);
}

int dog(int u){
   type[u] = 2;
   return update(u, maxn, 0);
}

int neighbor(int u){
   int val = type[u];
   type[u] = 0;
   return (val == 1 ? update(u, 0, - n) : update(u, -n, 0));
}

Compilation message (stderr)

/usr/bin/ld: /tmp/cc17cofI.o: in function `main':
grader.cpp:(.text.startup+0x1dc): undefined reference to `initialize(int, std::vector<int, std::allocator<int> >, std::vector<int, std::allocator<int> >)'
/usr/bin/ld: grader.cpp:(.text.startup+0x219): undefined reference to `neighbor(int)'
/usr/bin/ld: grader.cpp:(.text.startup+0x258): undefined reference to `dog(int)'
/usr/bin/ld: grader.cpp:(.text.startup+0x261): undefined reference to `cat(int)'
collect2: error: ld returned 1 exit status