제출 #587570

#제출 시각아이디문제언어결과실행 시간메모리
587570Bobonbush경주 (Race) (IOI11_race)C++17
0 / 100
1 ms340 KiB
#include <bits/stdc++.h> #define foreach for #define in : using namespace std; typedef long long ll; /* Konichiwa Konichiwa Ara ~~ ara Bob no taisuki - Shinobu Kocho * * * * * * * * * * * I love SHINOBU <3 <3 <3 * * * * * * * * * */ /* _________________________ Author : Bob15324 _________________________ */ template<class X , class Y> bool Minimize(X & x , Y y) { if( x == -1 || (x >y && y > 0)) { x = y; return true; } return false; } template<class X , class Y> bool Maximize(X & x , Y y) { if( x < y) { x = y; return true; } return false; } /* End of templates. Let's see what do we have here */ const int N = 2e5+1; int res = -1; class GRAPH { private: vector<set<pair<int ,int >>>vertices; vector<int>sub_size; vector<map<int ,int >>dict; public: GRAPH(int _n) { vertices.resize(_n+1); sub_size.resize(_n+1); dict.resize(_n+1); } void AddEdge(int u ,int v ,int w) { vertices[u].insert(make_pair(v , w)); vertices[v].insert(make_pair(u , w)); } int DFS(int u ,int daddy) { sub_size[u] = 1; foreach(pair<int ,int > adj in vertices[u]) { int v = adj.first; if(v == daddy) { continue; } sub_size[u] += DFS(v , u); } return sub_size[u]; } int centroid(int u ,int daddy , int lim) { foreach(pair<int ,int > adj in vertices[u]) { int v = adj.first; if(v == daddy) { continue; } if(sub_size[v] > lim) { return centroid(v , u , lim); } } return u; } void dfs2(int u ,int daddy ,int base , int distance , int s ,int k) { if(dict[base].count(s)) { Minimize(dict[base][s], distance ); }else { dict[base][s] = distance; } if(dict[base].count(k-s)) { Minimize(res , dict[base].count(k-s) + distance); } foreach(pair<int , int >adj in vertices[u]) { int v = adj.first; if ( v== daddy) { continue; } if(s + adj.second > k) { continue; } dfs2(v , u , base , distance + 1 , s + adj.second , k); } } void Build(int u, int daddy ,int k ) { int lim = DFS(u , daddy); int _c = centroid(u , daddy , lim >> 1); dfs2(_c , daddy , _c , 0 , 0 , k); set<pair<int ,int >> temp = vertices[_c]; foreach(pair<int ,int > adj in temp ) { vertices[_c].erase(adj); vertices[adj.first].erase(make_pair(_c , adj.second)); Build(adj.first , _c , k); } } }; int best_path(int n , int m ,int H[][2] , int L[]) { GRAPH graph(n); for(int i = 0 ; i < n -1 ; i++) { H[i][0]++; H[i][1]++; graph.AddEdge(H[i][0] , H[i][1] , L[i]); } graph.Build(1 , - 1 , m); return res; } //Ehem. My code is amazing. Pay me 2$.Thank you.

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

race.cpp: In instantiation of 'bool Minimize(X&, Y) [with X = int; Y = long unsigned int]':
race.cpp:120:64:   required from here
race.cpp:34:27: warning: comparison of integer expressions of different signedness: 'int' and 'long unsigned int' [-Wsign-compare]
   34 |         if( x == -1 || (x >y && y > 0))
      |                         ~~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...