Submission #1191352

#TimeUsernameProblemLanguageResultExecution timeMemory
1191352asli_bgFactories (JOI14_factories)C++20
0 / 100
8089 ms16304 KiB
#include <bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; //#define int long long #include "factories.h" typedef pair<int,int> pii; typedef vector<int> vi; typedef vector<pii> vii; typedef vector<bool> vb; typedef long long ll; typedef tree<pii,null_type,less<pii>,rb_tree_tag, tree_order_statistics_node_update> oset; #define fi first #define se second #define pb push_back #define pf push_front #define mid (l+r)/2 #define all(x) x.begin(),x.end() #define FOR(i,a) for(int i=0;i<(a);i++) #define FORE(i,a,b) for(int i=(a);i<(b);i++) #define cont(x) for(auto el:x) cout<<el<<' ';cout<<endl; #define contp(x) for(auto el:x) cout<<el.fi<<'-'<<el.se<<' ';cout<<endl; #define sp <<" "<< #define DEBUG(x) cout<<(#x) sp x<<endl #define carp(a,b) (((a%MOD)*(b%MOD))%MOD) #define topla(a,b) (((a%MOD)+(b%MOD))%MOD) const ll INF=1e18; const int MAXN=2e5+5; const int MAXK=26; const int MOD=1e9+7; /*int N; int a[MAXN], b[MAXN], d[MAXN];*/ int n; vii adj[MAXN]; void Init(int N, int a[], int b[], int d[]) { n=N; FOR(i,n){ a[i]++;b[i]++; adj[a[i]].pb({b[i],d[i]}); adj[b[i]].pb({a[i],d[i]}); } } int sub[MAXN]; bool mark[MAXN]; void dfs(int nd,int ata){ sub[nd]=1; for(auto [kom,cost]:adj[nd]){ if(mark[kom] or kom==ata) continue; dfs(kom,nd); sub[nd]+=sub[kom]; } } int find_cent(int nd,int sz,int ata){ for(auto [kom,cost]:adj[nd]){ if(mark[kom] or kom==ata) continue; if(sub[kom]*2>sz) return find_cent(kom,sz,nd); } return nd; } bool bir[MAXN], iki[MAXN]; ll mnx,mny; ll ans; void dfs2(int nd,int ata,ll h,bool f){ if(f){ if(bir[nd]){ //xlerden biri ans=min(ans,h+mny); } if(iki[nd]){ ans=min(ans,h+mnx); } } else{ if(bir[nd]){ //xlerden biri mnx=min(mnx,h); } if(iki[nd]){ //ylerden biri mny=min(mny,h); } } for(auto [kom,cost]:adj[nd]){ if(mark[kom] or kom==ata) continue; dfs2(kom,nd,h+cost,f); } } void solve(int nd){ dfs(nd,-1); int c=find_cent(nd,sub[nd],-1); mark[c]=true; //calculate here mnx=mny=INF; for(auto [kom,cost]:adj[c]){ if(!mark[kom]){ dfs2(kom,c,cost,true); //cevap ara dfs2(kom,c,cost,false); //updatele } } if(bir[c]){ ans=min(ans,mny); } if(iki[c]){ ans=min(ans,mnx); } for(auto [kom,cost]:adj[c]){ if(!mark[kom]){ solve(kom); } } } //int x[MAXN], y[MAXN]; ll Query(int s, int x[], int t, int y[]) { FOR(i,s){ int el=x[i]+1; bir[el]=true; } FOR(i,t){ int el=y[i]+1; iki[el]=true; } ans=INF; solve(1); FOR(i,s){ int el=x[i]+1; bir[el]=false; } FOR(i,t){ int el=y[i]+1; iki[el]=false; } FORE(i,1,n+1) mark[i]=false; return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...