답안 #643010

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
643010 2022-09-21T04:12:15 Z ymm 공장들 (JOI14_factories) C++17
100 / 100
2803 ms 188676 KB
#include "factories.h"
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;

const int N = 510'010;
const int lg = 19;
vector<pll> A0[N];
vector<int> ord;
int rmq[lg+1][2*N];
int st[N], ft[N], h[N];
ll dis[N];
int n;

void dfs(int v, int p, ll d, int h)
{
	::h[v] = h;
	st[v] = ord.size();
	ord.push_back(v);
	dis[v] = d;
	for (auto [u, w] : A0[v]) {
		if (u != p) {
			dfs(u, v, d + w, h+1);
			ord.push_back(v);
		}
	}
	ft[v] = ord.size();
}

#define HMIN(x, y) (h[x]<h[y]?(x):(y))

void rmq_init()
{
	int n = ord.size();
	Loop (i,0,n)
		rmq[0][i] = ord[i];
	{ vector<int> dard; ord.swap(dard); }
	Loop (i,0,lg)
		for (int j = 0; j + (2<<i) <= n; ++j)
			rmq[i+1][j] = HMIN(rmq[i][j], rmq[i][j+(1<<i)]);
}

pair<ll,int> get_dis(int x, int y)
{
	ll ans = dis[x] + dis[y];
	if (st[x] > st[y]) {
		int tmp = x;
		x = y;
		y = tmp;
	}
	x = st[x];
	y = st[y]+1;
	int l = __lg(y - x);
	int a = HMIN(rmq[l][x], rmq[l][y - (1<<l)]);
	ans -= 2*dis[a];
	return {ans, a};
}

void Init(int N, int X[], int Y[], int D[])
{
	n = N;
	Loop (i,0,n) {
		A0[X[i]].push_back({Y[i],D[i]});
		A0[Y[i]].push_back({X[i],D[i]});
	}
	dfs(0, 0, 0, 0);
	rmq_init();
	Loop (i,0,N) {
		vector<pll> dard;
		A0[i].swap(dard);
	}
}

ll dij(const vector<vector<pll>> &A, const vector<int> &x, const vector<int> &y)
{
	static ll dis[N];
	fill(dis, dis+A.size(), (ll)1e18);
	priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> q;
	for (int v : x) {
		dis[v] = 0;
		q.push({0,v});
	}
	while (q.size()) {
		auto [d, v] = q.top();
		q.pop();
		if (d != dis[v])
			continue;
		for (auto [u, w] : A[v]) {
			if (d + w < dis[u]) {
				dis[u] = d + w;
				q.push({dis[u], u});
			}
		}
	}
	ll ans = 1e18;
	for (int v : y)
		ans = min(ans, dis[v]);
	return ans;
}

long long Query(int S, int X[], int T, int Y[])
{
	static bool imp_vis[N];
	vector<int> imp;
	Loop (i,0,S) {
		imp_vis[X[i]] = 1;
		imp.push_back(X[i]);
	}
	Loop (i,0,T) {
		imp_vis[Y[i]] = 1;
		imp.push_back(Y[i]);
	}
	if (!imp_vis[0]) {
		imp_vis[0] = 1;
		imp.push_back(0);
	}
	sort(imp.begin(), imp.end(), [](int v, int u){return st[v] < st[u];});
	int kooft_ = imp.size();
	Loop (i,1,kooft_) {
		int v = get_dis(imp[i], imp[i-1]).second;
		if (!imp_vis[v]) {
			imp_vis[v] = 1;
			imp.push_back(v);
		}
	}
	sort(imp.begin(), imp.end(), [](int v, int u){return st[v] < st[u];});
	vector<int> stk = {0};
	vector<vector<pll>> A(imp.size());
	Loop (i,1,imp.size()) {
		int v = imp[i];
		while (ft[imp[stk.back()]] <= st[v])
			stk.pop_back();
		ll d = get_dis(imp[stk.back()], v).first;
		A[stk.back()].push_back({i, d});
		A[i].push_back({stk.back(), d});
		stk.push_back(i);
	}
	for (auto v : imp)
		imp_vis[v] = 0;
	vector<int> x, y;
	static int dard1[N];
	Loop (i,0,imp.size())
		dard1[imp[i]] = i;
	Loop (i,0,S)
		x.push_back(dard1[X[i]]);
	Loop (i,0,T)
		y.push_back(dard1[Y[i]]);
	return dij(A, x, y);
}

Compilation message

factories.cpp: In function 'long long int Query(int, int*, int, int*)':
factories.cpp:3:40: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    3 | #define Loop(x,l,r) for (ll x = (l); x < (r); ++x)
      |                                        ^
factories.cpp:133:2: note: in expansion of macro 'Loop'
  133 |  Loop (i,1,imp.size()) {
      |  ^~~~
factories.cpp:3:40: warning: comparison of integer expressions of different signedness: 'll' {aka 'long long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    3 | #define Loop(x,l,r) for (ll x = (l); x < (r); ++x)
      |                                        ^
factories.cpp:146:2: note: in expansion of macro 'Loop'
  146 |  Loop (i,0,imp.size())
      |  ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 12756 KB Output is correct
2 Correct 962 ms 21516 KB Output is correct
3 Correct 1108 ms 21416 KB Output is correct
4 Correct 943 ms 21816 KB Output is correct
5 Correct 746 ms 21904 KB Output is correct
6 Correct 720 ms 21464 KB Output is correct
7 Correct 1079 ms 21452 KB Output is correct
8 Correct 995 ms 21680 KB Output is correct
9 Correct 741 ms 21808 KB Output is correct
10 Correct 719 ms 21504 KB Output is correct
11 Correct 1076 ms 21560 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 12500 KB Output is correct
2 Correct 1386 ms 137508 KB Output is correct
3 Correct 1492 ms 140364 KB Output is correct
4 Correct 909 ms 130856 KB Output is correct
5 Correct 1144 ms 165096 KB Output is correct
6 Correct 1593 ms 141812 KB Output is correct
7 Correct 1495 ms 44560 KB Output is correct
8 Correct 728 ms 42712 KB Output is correct
9 Correct 769 ms 48416 KB Output is correct
10 Correct 1462 ms 45680 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 12756 KB Output is correct
2 Correct 962 ms 21516 KB Output is correct
3 Correct 1108 ms 21416 KB Output is correct
4 Correct 943 ms 21816 KB Output is correct
5 Correct 746 ms 21904 KB Output is correct
6 Correct 720 ms 21464 KB Output is correct
7 Correct 1079 ms 21452 KB Output is correct
8 Correct 995 ms 21680 KB Output is correct
9 Correct 741 ms 21808 KB Output is correct
10 Correct 719 ms 21504 KB Output is correct
11 Correct 1076 ms 21560 KB Output is correct
12 Correct 9 ms 12500 KB Output is correct
13 Correct 1386 ms 137508 KB Output is correct
14 Correct 1492 ms 140364 KB Output is correct
15 Correct 909 ms 130856 KB Output is correct
16 Correct 1144 ms 165096 KB Output is correct
17 Correct 1593 ms 141812 KB Output is correct
18 Correct 1495 ms 44560 KB Output is correct
19 Correct 728 ms 42712 KB Output is correct
20 Correct 769 ms 48416 KB Output is correct
21 Correct 1462 ms 45680 KB Output is correct
22 Correct 2732 ms 139824 KB Output is correct
23 Correct 2423 ms 166784 KB Output is correct
24 Correct 2803 ms 167608 KB Output is correct
25 Correct 2730 ms 171692 KB Output is correct
26 Correct 2734 ms 166684 KB Output is correct
27 Correct 1993 ms 188676 KB Output is correct
28 Correct 1707 ms 159184 KB Output is correct
29 Correct 2663 ms 166456 KB Output is correct
30 Correct 2670 ms 165912 KB Output is correct
31 Correct 2673 ms 166352 KB Output is correct
32 Correct 1063 ms 65540 KB Output is correct
33 Correct 1031 ms 63532 KB Output is correct
34 Correct 1467 ms 55912 KB Output is correct
35 Correct 1471 ms 55920 KB Output is correct
36 Correct 1644 ms 56652 KB Output is correct
37 Correct 1607 ms 56744 KB Output is correct