# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
45860 | OneSubmissionMan | Fireworks (APIO16_fireworks) | C++11 | 345 ms | 32068 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
# include <bits/stdc++.h>
# define x first
# define y second
# define mp make_pair
// everything go according to my plan
# define pb push_back
# define sz(a) (int)(a.size())
# define vec vector
// shimkenttin kyzdary, dzyn, dzyn, dzyn...
# define y1 Y_U_NO_y1
# define left Y_U_NO_left
# define right Y_U_NO_right
using namespace std;
typedef pair <int, int> pii;
typedef long long ll;
typedef long double ld;
const int Mod = (int)1e9 + 7;
const int MX = 1073741822;
const ll MXLL = 1e5 * 1e9 + 1;
const int Sz = 1110111;
// a pinch of soul
inline void Read_rap () {
ios_base :: sync_with_stdio(0);
cin.tie(0); cout.tie(0);
}
inline void randomizer3000 () {
unsigned int seed;
asm ("rdtsc" : "=A"(seed));
srand (seed);
}
void files (string problem) {
if (fopen ((problem + ".in").c_str(),"r")) {
freopen ((problem + ".in").c_str(),"r",stdin);
freopen ((problem + ".out").c_str(),"w",stdout);
}
}
void localInput(const char in[] = "s") {
if (fopen (in, "r")) {
freopen (in, "r", stdin);
}
else
cerr << "Warning: Input file not found" << endl;
}
int n, m;
vec<int> g[Sz];
const int N = 5e3 + 1;
int c[Sz];
ll dp[N][N];
ll mn[N];
ll dist[Sz];
vec<ll> W;
void pre_dfs (int v) {
for (int to : g[v]) {
dist[to] = dist[v] + c[to];
pre_dfs (to);
}
}
void calc (int v) {
for (int to : g[v])
calc (to);
if (!sz(g[v])) {
for (int i = 0; i < sz(W); i++)
dp[v][i] = MXLL;
dp[v][lower_bound (W.begin(), W.end(), dist[v]) - W.begin()] = 0;
}
for (int to : g[v]) {
for (int i = 0; i < sz(W); i++) {
dp[v][i] += dp[to][i];
dp[v][i] = min (dp[v][i], MXLL);
}
}
for (int i = 0; i < sz(W); i++) {
mn[i] = dp[v][i];
for (int j = 0; j < i; j++)
mn[i] = min (mn[i], W[i] - W[j] + dp[v][j]);
for (int j = i+1; j < sz(W); j++) {
if (W[j] - W[i] > c[v])
break;
mn[i] = min (mn[i], W[j] - W[i] + dp[v][j]);
}
}
for (int i = 0; i < sz(W); i++)
dp[v][i] = mn[i];
}
int main()
{
# ifdef Local
//localInput();
# endif
Read_rap();
cin >> n >> m;
for (int i = 2; i <= n + m; i++) {
static int pr;
cin >> pr >> c[i];
g[pr].pb (i);
}
pre_dfs (1);
for (int i = 1; i <= n + m; i++)
W.pb (dist[i]), W.pb (dist[i] + 1);
sort (W.begin(), W.end());
W.resize (unique (W.begin(), W.end()) - W.begin());
calc (1);
cout << *min_element (dp[1], dp[1] + sz(W));
return 0;
}
// Coded by Z..
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |