답안 #345192

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
345192 2021-01-07T06:25:42 Z Kerim 공장들 (JOI14_factories) C++17
100 / 100
6868 ms 184324 KB
#include "factories.h"
#include "bits/stdc++.h"
#define MAXN 500009
#define INF 1000000007
#define mp(x,y) make_pair(x,y)
#define all(v) v.begin(),v.end()
#define pb(x) push_back(x)
#define wr cout<<"----------------"<<endl;
#define ppb() pop_back()
#define tr(ii,c) for(__typeof((c).begin()) ii=(c).begin();ii!=(c).end();ii++)
#define ff first
#define ss second
#define my_little_dodge 46
#define debug(x)  cerr<< #x <<" = "<< x<<endl;
using namespace std;
 
typedef long long ll;
typedef pair<int,ll> PII;
template<class T>bool umin(T& a,T b){if(a>b){a=b;return 1;}return 0;}
template<class T>bool umax(T& a,T b){if(a<b){a=b;return 1;}return 0;}
vector<PII>adj[MAXN],gr[MAXN];
const int LOG=19;
int in[MAXN],out[MAXN],P[MAXN][LOG];
int col[MAXN],lvl[MAXN],T;
ll val[MAXN];
void dfs1(int nd,int pr){
	in[nd]=++T;
	tr(it,adj[nd])
		if(it->ff!=pr){
			val[it->ff]=val[nd]+it->ss;
			lvl[it->ff]=lvl[nd]+1;
			P[it->ff][0]=nd;
			dfs1(it->ff,nd);	
		}
	out[nd]=T;
}
void Init(int N, int A[], int B[], int D[]) {
	for(int i=0;i<N-1;i++){
		int u=A[i],v=B[i],w=D[i];
		adj[u].pb(mp(v,w));	
		adj[v].pb(mp(u,w));
	}
	memset(col,-1,sizeof col);
	memset(P,-1,sizeof P);
	dfs1(0,-1);
	for(int j=1;j<LOG;j++)
		for(int i=0;i<N;i++)
			if(~P[i][j-1])
				P[i][j]=P[P[i][j-1]][j-1];
}
bool cmp(int x,int y){
	return (in[x]<in[y]);	
}
bool ata(int x,int y){
	return (in[x]<=in[y] and out[y]<=out[x]);
}
int LCA(int x,int y){
	if(lvl[x]<lvl[y])
		swap(x,y);
	for(int i=LOG-1;i>=0;i--)
		if(~P[x][i] and lvl[P[x][i]]>=lvl[y])
			x=P[x][i];
	if(x==y)return x;
	for(int i=LOG-1;i>=0;i--)
		if(~P[x][i] and P[x][i]!=P[y][i])
			x=P[x][i],y=P[y][i];
	return P[x][0];
}
const ll B=1e15;
ll dp[MAXN][2],ans;	
void dfs(int nd){
	dp[nd][0]=dp[nd][1]=B;
	if(~col[nd])dp[nd][col[nd]]=0;
	tr(it,gr[nd]){
		dfs(it->ff);
		umin(dp[nd][0],dp[it->ff][0]+it->ss);
		umin(dp[nd][1],dp[it->ff][1]+it->ss);
	}
	umin(ans,dp[nd][0]+dp[nd][1]);
}
long long Query(int S, int X[], int T, int Y[]) {
	vector<int>g;
	for(int i=0;i<S;i++)
		col[X[i]]=0,g.pb(X[i]);
	for(int i=0;i<T;i++)
		col[Y[i]]=1,g.pb(Y[i]);
	sort(all(g),cmp);vector<int>v=g;
	for(int i=0;i<int(g.size())-1;i++)
		v.pb(LCA(g[i],g[i+1]));
	sort(all(v),cmp);v.erase(unique(all(v)),v.end());
	stack<int>st;int root=v[0];
	tr(it,v){
		while(!st.empty() and !ata(st.top(),*it))
			st.pop();
		if(!st.empty())
			gr[st.top()].pb(mp(*it,val[*it]-val[st.top()]));
		st.push(*it);
	}
	ans=B;dfs(root);
	tr(it,v)gr[*it].clear();
	for(int i=0;i<S;i++)
		col[X[i]]=-1;
	for(int i=0;i<T;i++)
		col[Y[i]]=-1;
  	return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 69 ms 63468 KB Output is correct
2 Correct 1707 ms 81224 KB Output is correct
3 Correct 1370 ms 81260 KB Output is correct
4 Correct 1389 ms 81260 KB Output is correct
5 Correct 1363 ms 81568 KB Output is correct
6 Correct 1018 ms 81096 KB Output is correct
7 Correct 1562 ms 81076 KB Output is correct
8 Correct 1447 ms 81320 KB Output is correct
9 Correct 1372 ms 81456 KB Output is correct
10 Correct 901 ms 81116 KB Output is correct
11 Correct 1483 ms 81136 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 63084 KB Output is correct
2 Correct 2506 ms 137840 KB Output is correct
3 Correct 4451 ms 141524 KB Output is correct
4 Correct 1608 ms 134988 KB Output is correct
5 Correct 4140 ms 176736 KB Output is correct
6 Correct 4542 ms 143688 KB Output is correct
7 Correct 3943 ms 97232 KB Output is correct
8 Correct 1639 ms 96732 KB Output is correct
9 Correct 3420 ms 103728 KB Output is correct
10 Correct 3465 ms 98696 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 69 ms 63468 KB Output is correct
2 Correct 1707 ms 81224 KB Output is correct
3 Correct 1370 ms 81260 KB Output is correct
4 Correct 1389 ms 81260 KB Output is correct
5 Correct 1363 ms 81568 KB Output is correct
6 Correct 1018 ms 81096 KB Output is correct
7 Correct 1562 ms 81076 KB Output is correct
8 Correct 1447 ms 81320 KB Output is correct
9 Correct 1372 ms 81456 KB Output is correct
10 Correct 901 ms 81116 KB Output is correct
11 Correct 1483 ms 81136 KB Output is correct
12 Correct 42 ms 63084 KB Output is correct
13 Correct 2506 ms 137840 KB Output is correct
14 Correct 4451 ms 141524 KB Output is correct
15 Correct 1608 ms 134988 KB Output is correct
16 Correct 4140 ms 176736 KB Output is correct
17 Correct 4542 ms 143688 KB Output is correct
18 Correct 3943 ms 97232 KB Output is correct
19 Correct 1639 ms 96732 KB Output is correct
20 Correct 3420 ms 103728 KB Output is correct
21 Correct 3465 ms 98696 KB Output is correct
22 Correct 4551 ms 154192 KB Output is correct
23 Correct 4334 ms 155512 KB Output is correct
24 Correct 5271 ms 158980 KB Output is correct
25 Correct 5683 ms 161540 KB Output is correct
26 Correct 6493 ms 151824 KB Output is correct
27 Correct 5434 ms 184324 KB Output is correct
28 Correct 2343 ms 149872 KB Output is correct
29 Correct 6401 ms 150576 KB Output is correct
30 Correct 6868 ms 149992 KB Output is correct
31 Correct 6751 ms 150420 KB Output is correct
32 Correct 3115 ms 105652 KB Output is correct
33 Correct 1616 ms 100232 KB Output is correct
34 Correct 3034 ms 96116 KB Output is correct
35 Correct 3015 ms 95944 KB Output is correct
36 Correct 3695 ms 96836 KB Output is correct
37 Correct 3604 ms 96684 KB Output is correct