# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
760121 | danikoynov | 사이버랜드 (APIO23_cyberland) | C++17 | 208 ms | 29064 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "cyberland.h"
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
struct edge
{
int ver, div;
double cost;
edge(int _ver = 0, int _div = 0, double _cost = 0)
{
ver = _ver;
div = _div;
cost = _cost;
}
bool operator < (const edge &e) const
{
if (div > e.div)
return true;
return cost > e.cost;
}
};
const int maxk = 31;
const double inf = 1e18;
vector < pair < int, double > > adj[maxn];
double dp[maxk][maxn];
int used[maxk][maxn];
double solve(int N, int M, int K, int H, vector<int> x, vector<int> y, vector<int> c, vector<int> arr)
{
if (K > 30)
K = 30;
for (int i = 0; i < N; i ++)
adj[i].clear();
for (int i = 0; i < M; i ++)
{
adj[x[i]].push_back({y[i], c[i]});
adj[y[i]].push_back({x[i], c[i]});
}
priority_queue < edge > q;
for (int j = 0; j <= K; j ++)
for (int i = 0; i < N; i ++)
{
used[j][i] = 0;
dp[j][i] = inf;
}
dp[0][0] = 0;
q.push(edge(0, 0, 0));
while(!q.empty())
{
edge cur = q.top();
q.pop();
///cout << q.size() << endl;
///cout << cur.ver << " " << cur.div << " " << cur.cost << endl;
//cout << used[cur.div][cur.ver] << endl;
if (used[cur.div][cur.ver])
continue;
used[cur.div][cur.ver] = 1;
if (cur.ver == H)
continue;
///cout << adj[cur.ver].size() << endl;
for (pair < int, double > nb : adj[cur.ver])
{
edge to(nb.first, cur.div, cur.cost + nb.second);
///cout << "here " << to.ver << " : " << to.cost << endl;
if (arr[to.ver] == 0)
{
to.cost = 0;
if (to.cost < dp[to.div][to.ver])
{
dp[to.div][to.ver] = to.cost;
q.push(to);
}
}
else if (arr[to.ver] == 1)
{
if (to.cost < dp[to.div][to.ver])
{
dp[to.div][to.ver] = to.cost;
q.push(to);
}
}
else
{
if (to.cost < dp[to.div][to.ver])
{
dp[to.div][to.ver] = to.cost;
q.push(to);
}
if (to.div < K)
{
to.cost = to.cost / 2.0;
to.div ++;
if (to.cost < dp[to.div][to.ver])
{
dp[to.div][to.ver] = to.cost;
q.push(to);
}
}
}
}
}
double ans = inf;
for (int j = 0; j <= K; j ++)
ans = min(ans, dp[j][H]);
if (ans == inf)
return -1;
return ans;
}
Compilation message (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... |
# | 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... |