Submission #947443

#TimeUsernameProblemLanguageResultExecution timeMemory
947443MestuRace (IOI11_race)C++14
100 / 100
689 ms40240 KiB
#include <bits/stdc++.h> using namespace std; //#include<ext/pb_ds/assoc_container.hpp> //#include<ext/pb_ds/tree_policy.hpp> //using namespace __gnu_pbds; //typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds; // find_by_order, order_of_key #define ll long long #define vi vector<int> #define pii pair<int, int> #define pll pair<ll, ll> #define vvi vector<vi> #define vll vector<ll> #define vvll vector<vector<ll>> #define vpii vector<pair<int,int>> #define vpll vector<pair<ll,ll>> int Set(int N, int pos) {return N = N | (1<<pos);} int Reset(int N, int pos) {return N = N & ~(1<<pos);} bool Cheek(int N, int pos) {return (bool)(N & (1<<pos));} #define least_one_pos(x) __builtin_ffs(x) #define leading_zeros(x) __builtin_clz(x) #define tailing_zeros(x) __builtin_ctz(x) #define num_of_one(x) __builtin_popcount(x) ///............x.........../// #define all(a) a.begin(), a.end() #define allr(a) a.rbegin(), a.rend() #define mp(a, b) make_pair(a, b) #define pb push_back #define UNIQUE(X) (X).erase(unique(all(X)), (X).end()) #define ft cout << "for test"<<endl; #define print(v) for (auto it : v)cout << it<<" ";cout << endl; #define cinv(v) for(auto &it : v)cin>>it; #define PI acos(-1.0) #define FIO ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define t_c int test, cs = 1;cin>>test;while (test--) ///................function...................../// //#define mod 1000000007 //........constant......../// const ll N = 1e6+5; void file(){ freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); } class CentroidDecomposition{ public: vector<vector<pii>>adj; vector<bool>removed; vector<int>subtree,parent; map<int,int>Count; int n,root,k; ll ans; CentroidDecomposition(int _n, int _k){ n = _n; k = _k; root=1; adj.resize(n+1); removed.resize(n+1); subtree.resize(n+1); parent.resize(n+1); ans=INT_MAX; } void readTree(int H[][2], int L[]){ for(int i=0; i<n-1; i++){ int a=H[i][0],b=H[i][1]; adj[a].push_back({b,L[i]}); adj[b].push_back({a,L[i]}); } centroid_decomposition(0); // cout<<ans<<endl; } int get_subtree_size(int node, int par=-1){ subtree[node]=1; for(auto x:adj[node]) if(!removed[x.first] and par!=x.first) subtree[node] += get_subtree_size(x.first,node); return subtree[node]; } int get_centroid(int node, int desired, int par=-1){ for(auto x:adj[node]) if(!removed[x.first] and x.first!=par and desired<=subtree[x.first]) return get_centroid(x.first,desired,node); return node; } void get_cnt(int nd, int par, int d, int l, bool tp){ if(d>k)return; // cout<<nd<<" "<<par<<" "<<d<<" "<<l<<" "<<tp<<endl; if(!tp){ if(Count.find(d)!=Count.end()) Count[d] = min(Count[d],l); else Count[d]=l; // cout<<"add "<<d<<" "<<Count[d]<<endl; } else{ if(Count.find(k-d)!=Count.end()){ ans = min(ans,(ll)l+Count[k-d]); // cout<<k-d<<" update "<<l<<" + "<<Count[k-d]<<endl; } } for(auto x:adj[nd]) if(!removed[x.first] and x.first!=par) get_cnt(x.first,nd,d+x.second,l+1,tp); } void centroid_decomposition(int node){ int centroid = get_centroid(node,get_subtree_size(node)>>1); removed[centroid]=true; // cout<<"centroid "<<centroid<<endl; Count.clear(); Count[0]=0; for(auto x:adj[centroid]){ if(!removed[x.first]){ get_cnt(x.first,centroid,x.second,1,1); get_cnt(x.first,centroid,x.second,1,0); } } for(auto x:adj[centroid]){ if(!removed[x.first]) centroid_decomposition(x.first); } } }; int best_path(int N, int K, int H[][2], int L[]){ CentroidDecomposition cd(N,K); cd.readTree(H,L); cd.centroid_decomposition(1); if(cd.ans==INT_MAX)cd.ans=-1; return cd.ans; }

Compilation message (stderr)

race.cpp: In function 'void file()':
race.cpp:41:11: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   41 |    freopen("input.txt","r",stdin);
      |    ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
race.cpp:42:11: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   42 |    freopen("output.txt","w",stdout);
      |    ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...