제출 #388753

#제출 시각아이디문제언어결과실행 시간메모리
388753SavicS경주 (Race) (IOI11_race)C++14
31 / 100
363 ms34208 KiB
#include "race.h"

#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <bits/stdc++.h>

#define fi first
#define se second
#define pb push_back
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
#define ff(i,a,b) for(int i=a;i<=b;i++)
#define fb(i,b,a) for(int i=b;i>=a;i--)

using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef pair<ll,int> pii;
const int maxn = 200005;
const int inf = 1e9 + 5;

template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

// os.order_of_key(k) the number of elements in the os less than k
// *os.find_by_order(k)  print the k-th smallest number in os(0-based)

int n, K;

vector<pii> g[maxn];

int cnt[maxn];
bool bio[maxn];
void dfs_sz(int v, int p) {
	cnt[v] = 1;
	for(auto c : g[v]) {
		int u = c.fi;
		int w = c.se;
		if(u == p || bio[u])continue;
		dfs_sz(u, v);
		cnt[v] += cnt[u];
	}
}

int centroid(int v, int p, int vel) {
	for(auto c : g[v]) {
		int u = c.fi;
		int w = c.se;
		if(u == p || bio[u])continue;
		if(cnt[u] > vel / 2)return centroid(u, v, vel);
	}
	return v;
}

int rez = inf;

const int N = (int)1e6;
int kol[N + 5];

vector<pii> cuvaj;
void dfs_calc(int v, int p, int W, int duz) {
	if(W > K)return;

	cuvaj.pb({W, duz});
	if(kol[K - W] != inf)rez = min(rez, kol[K - W] + duz);

	for(auto c : g[v]) {
		int u = c.fi;
		int w = c.se;
		if(u == p || bio[u])continue;

		dfs_calc(u, v, W + w, duz + 1);

	}

}

void decompose(int v, int p) {
	dfs_sz(v, p);
	int cen = centroid(v, p, cnt[v]);
	bio[cen] = 1;

	cuvaj.clear();

	kol[0] = 0;

	vector<int> brisi;
	for(auto c : g[cen]) {
		int u = c.fi;
		int w = c.se;
		if(u == p || bio[u])continue;
		dfs_calc(u, cen, w, 1);

		for(auto c : cuvaj) {
			kol[c.fi] = min(kol[c.fi], c.se);
			brisi.pb(c.fi);
		}

	}

	for(auto c : brisi)kol[c] = inf;

	for(auto c : g[cen]) {
		int u = c.fi;
		int w = c.se;
		if(u == p || bio[u])continue;
		decompose(u, cen);
	}


}

int best_path(int N, int k, int H[][2], int L[]) {
	n = N;
	K = k;
	ff(i,0,n - 2) {
		int u = H[i][0] + 1;
		int v = H[i][1] + 1;
		int w = L[i];
		g[u].pb({v, w});
		g[v].pb({u, w});
	}

	ff(i,1,N)kol[i] = inf;
	decompose(1, -1);

	return (rez == inf ? -1 : rez);

}

//int main()
//{
//    ios::sync_with_stdio(false);
//    cout.tie(nullptr);
//    cin.tie(nullptr);
//	cin >> n >> K;
//	ff(i,1,n - 1){
//		int u, v, w;
//		cin >> u >> v >> w;
//		g[u].pb({v, w});
//		g[v].pb({u, w});
//	}
//
//	ff(i,1,N)kol[i] = inf;
//	decompose(1, -1);
//
//	cout << (rez == inf ? -1 : rez) << endl;
//
//	return 0;
//}
/**

3 3
1 2 1
2 3 1

11 12
1 2 3
1 3 4
3 4 5
4 5 4
5 6 6
1 7 3
7 8 2
7 9 5
9 10 6
9 11 7

// probati bojenje sahovski ili slicno

**/

컴파일 시 표준 에러 (stderr) 메시지

race.cpp: In function 'void dfs_sz(int, int)':
race.cpp:39:7: warning: unused variable 'w' [-Wunused-variable]
   39 |   int w = c.se;
      |       ^
race.cpp: In function 'int centroid(int, int, int)':
race.cpp:49:7: warning: unused variable 'w' [-Wunused-variable]
   49 |   int w = c.se;
      |       ^
race.cpp: In function 'void decompose(int, int)':
race.cpp:106:7: warning: unused variable 'w' [-Wunused-variable]
  106 |   int w = c.se;
      |       ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...