Submission #1324314

#TimeUsernameProblemLanguageResultExecution timeMemory
1324314repmannNestabilnost (COI23_nestabilnost)C++20
7 / 100
147 ms49872 KiB
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int N;
int A[300001], F[300001], MIN[300001];
vector <int> VG[300001];
int pos, ET[300002];
void ETDFS(int node, int parent = 0)
{
  ET[++pos] = node;
  for(int x : VG[node]) if(x != parent) ETDFS(x, node);
  return;
}
ll DPC[300002];
void Chain()
{
  for(int i = 1; i <= N; i++) if(VG[i].size() > min(2, i)) return;
  ETDFS(1);
  ET[++pos] = N + 1;
  int r = N, r0, k = 0;
  set <pair <ll, int>> SET;
  DPC[ET[N]] = MIN[A[ET[N]] + 1];
  SET.insert({MIN[A[ET[N]] + 1], N});
  for(int i = N - 1; i; i--)
  {
    DPC[ET[i]] = MIN[A[ET[i]] + 1] + DPC[ET[i + 1]];
//    if(A[ET[i + 1]] && ((A[ET[i]] + 1) != A[ET[i + 1]]))
//    {
//      r = i;
//      k = 0;
//      SET.clear();
//    }
//    else if(!A[ET[i + 1]])
//    {
//      if(!k)
//      {
//        k = A[ET[i]] + 1;
//        SET.clear();
//        for(int j = i + 1; j <= r; j++)
//        {
//          if(A[ET[j]] >= k) {r = j - 1; break;}
//          SET.insert({F[k] + DPC[ET[j + 1]], j});
//        }
//      }
//      else if(k != (A[ET[i]] + 1))
//      {
//        k = A[ET[i]] + 1;
//        SET.clear();
//        for(int j = i + 1; j <= r0; j++)
//        {
//          if(A[ET[j]] >= k) {r = j - 1; break;}
//          SET.insert({F[k] + DPC[ET[j + 1]], j});
//        }
//      }
//      else if(k == (A[ET[i]] + 1))
//      {
//        for(int j = i + 1; j <= r0; j++)
//        {
//          SET.erase(SET.find({MIN[A[ET[j]] + 1] + DPC[ET[j + 1]], j}));
//          SET.insert({F[k] + DPC[ET[j + 1]], j});
//        }
//      }
//      r0 = i;
//    }
    if(SET.size()) DPC[ET[i]] = min(SET.begin()->first, DPC[ET[i]]);
    SET.insert({MIN[A[ET[i] + 1]] + DPC[ET[i + 1]], i});
  }
  cout << DPC[1] << '\n';
  exit(0);
}
ll DP[5001][5001];
void DPDFS(int node, int parent = 0)
{
  DP[0][node] = MIN[A[node] + 1];
  for(int x : VG[node])
  {
    if(x == parent) continue;
    DPDFS(x, node);
    DP[0][node] += DP[0][x];
    for(int k = A[node] + 1; k <= N; k++)
    {
      if(((A[node] + 1) % k) != A[x]) DP[k][node] += DP[0][x];
      else DP[k][node] += min(DP[0][x], DP[k][x]);
    }
  }
  for(int k = A[node] + 1; k <= N; k++) DP[0][node] = min(DP[k][node] + F[k], DP[0][node]);
  return;
}
void Brute()
{
  if(N > 5000) return;
  DPDFS(1);
  cout << DP[0][1] << '\n';
  exit(0);
}
int main()
{
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> N;
  for(int i = 1; i <= N; i++) cin >> A[i];
  for(int i = 1; i <= N; i++) cin >> F[i];
  MIN[N] = F[N];
  for(int i = N - 1; i; i--) MIN[i] = min(MIN[i + 1], F[i]);
  int u, v;
  for(int i = 1; i < N; i++)
  {
    cin >> u >> v;
    VG[u].push_back(v);
    VG[v].push_back(u);
  }
  Chain();
  Brute();

  return 0;
}
#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...