답안 #128287

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
128287 2019-07-10T15:59:55 Z IOrtroiii Unique Cities (JOI19_ho_t5) C++14
0 / 100
237 ms 25164 KB
#include <bits/stdc++.h>

using namespace std;

const int N = 200200;

vector<int> g[N];
int color[N];
int ans[N];
int dep[N], down[N];

void dfs(int u, int p) {
   for (int v : g[u]) {
      if (v != p) {
         dep[v] = dep[u] + 1;
         dfs(v, u);
      }
   }
}

void dfsDown(int u, int p) {
   down[u] = 0;
   for (int v : g[u]) {
      if (v != p) {
         dfsDown(v, u);
         down[u] = max(down[u], down[v] + 1);
      }
   }
}

struct {
   int stSz;
   int st[N];
   int cnt[N];
   int curAns;
   bool empty() {
      return stSz == 0;
   }
   int top() {
      return st[stSz - 1];
   }
   void push(int u) {
      if (++cnt[color[u]] == 1) {
         ++curAns;
      }
      st[stSz++] = u;
   }
   void pop() {
      int u = top();
      if (--cnt[color[u]] == 0) {
         --curAns;
      }
      stSz--;
   }
} ms;

void solve(int u, int p) {
   vector<pair<int, int>> nxt;
   for (int v : g[u]) {
      if (v != p) {
         nxt.emplace_back(down[v] + 1, v);
      }
   }
   swap(nxt[0], nxt[max_element(nxt.begin(), nxt.end()) - nxt.begin()]);
   int len = 0;
   if (nxt.size() > 1) {
      len = max_element(nxt.begin() + 1, nxt.end())->first;
   }
   for (auto p : nxt) {
      int v = p.second;
      while (!ms.empty() && dep[ms.top()] >= dep[u] - len) {
         ms.pop();
      }
      ms.push(u);
      solve(v, u);
      if (!ms.empty() && ms.top() == u) {
         ms.pop();
      }
      len = max(len, p.first);
   }
   while (!ms.empty() && dep[ms.top()] >= dep[u] - len) {
      ms.pop();
   }
   ans[u] = max(ans[u], ms.curAns);
}

int main() {
   int n, m;
   scanf("%d %d", &n, &m);
   for (int i = 0; i < n - 1; ++i) {
      int u, v;
      scanf("%d %d", &u, &v);
      g[u].push_back(v);
      g[v].push_back(u);
   }
   for (int i = 1; i <= n; ++i) {
      scanf("%d", color + i);
   }
   int root = 1;
   dfs(1, 1);
   for (int rot = 0; rot < 2; ++rot) {;
      root = max_element(dep + 1, dep + 1 + n) - dep;
      dep[root] = 0;
      dfs(root, -1);
      dfsDown(root, -1);
      solve(root, -1);
      return 0;
   }
   for (int i = 1; i <= n; ++i) {
      printf("%d\n", ans[i]);
   }
}

Compilation message

joi2019_ho_t5.cpp: In function 'int main()':
joi2019_ho_t5.cpp:89:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d %d", &n, &m);
    ~~~~~^~~~~~~~~~~~~~~~~
joi2019_ho_t5.cpp:92:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d %d", &u, &v);
       ~~~~~^~~~~~~~~~~~~~~~~
joi2019_ho_t5.cpp:97:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d", color + i);
       ~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Runtime error 13 ms 10076 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 164 ms 20344 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 237 ms 25164 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 13 ms 10076 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -