답안 #970911

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
970911 2024-04-27T13:54:26 Z vjudge1 Fireworks (APIO16_fireworks) C++14
7 / 100
87 ms 197164 KB
#include<bits/stdc++.h>

using namespace std;

#define int long long

const int N=5000+10, inf=1e18;
int n, m, f[N][N], d[N];
vector<int> vals;
vector<pair<int, int>> g[N];

void pre_dfs(int u){
   for (auto &e:g[u]){
      d[e.first]=d[u]+e.second;
      pre_dfs(e.first);
   }
}

void dfs(int u){
   if (g[u].empty()){
      f[u][lower_bound(vals.begin(), vals.end(), d[u])-vals.begin()]=0;
      return;
   }
   for (int i=0; i<N; ++i) f[u][i]=0;
   for (auto &e:g[u]){
      int v=e.first, w=e.second;
      dfs(v);
      deque<int> dq;
      for (int i=1, j=1; i<(int)vals.size(); ++i){
         while (dq.size() && dq.front()<i) dq.pop_front();
         while (j<(int)vals.size() && vals[j]-vals[i]<=w){
            while (dq.size() && f[v][dq.back()]+vals[dq.back()]>=f[v][j]+vals[j]) dq.pop_back();
            dq.push_back(j);
            ++j;
         }
         f[v][i]=min(f[v][i], f[v][dq.front()]+vals[dq.front()]-vals[i]);
      }
      for (int i=2; i<(int)vals.size(); ++i) f[v][i]=min(f[v][i], f[v][i-1]+vals[i]-vals[i-1]);
      for (int i=1; i<(int)vals.size(); ++i) f[u][i]=min(inf, f[u][i]+f[v][i]);
   }
}

int32_t main(){
   ios_base::sync_with_stdio(false);
   cin.tie(nullptr);
   cin >> n >> m;
   if (n==1){
      vector<int> v;
      for (int i=2; i<=n+m; ++i){
         int p, c; cin >> p >> c;
         v.push_back(c);
      }
      sort(v.begin(), v.end());
      int val=v[m/2], ans=0;
      for (auto &i:v) ans+=abs(i-val);
      cout << ans << '\n';
      return 0;
   }
   for (int i=2; i<=m+n; ++i){
      int p, c; cin >> p >> c;
      g[p].emplace_back(i, c);
   }
   for (int i=0; i<N; ++i) for (int j=0; j<N; ++j) f[i][j]=inf;
   pre_dfs(1);
   vals.push_back(-1);
   for (int i=n+1; i<=n+m; ++i) vals.push_back(d[i]);
   sort(vals.begin(), vals.end()); vals.resize(unique(vals.begin(), vals.end())-vals.begin());
   dfs(1);
   cout << *min_element(f[1]+1, f[1]+(int)vals.size()) << '\n';
   return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 87 ms 196948 KB Output is correct
2 Correct 45 ms 196948 KB Output is correct
3 Incorrect 46 ms 197164 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 87 ms 196948 KB Output is correct
12 Correct 45 ms 196948 KB Output is correct
13 Incorrect 46 ms 197164 KB Output isn't correct
14 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 0 ms 344 KB Output is correct
8 Correct 1 ms 344 KB Output is correct
9 Correct 1 ms 344 KB Output is correct
10 Correct 0 ms 348 KB Output is correct
11 Correct 87 ms 196948 KB Output is correct
12 Correct 45 ms 196948 KB Output is correct
13 Incorrect 46 ms 197164 KB Output isn't correct
14 Halted 0 ms 0 KB -