Submission #1291609

#TimeUsernameProblemLanguageResultExecution timeMemory
1291609yf_yusufToll (APIO13_toll)C++20
16 / 100
3 ms572 KiB
//```// YF YUSUF // #include <bits/stdc++.h> #include <iostream> #include <vector> #include <set> #include <map> #include <algorithm> #include <cmath> #include <numeric> #include <queue> #include <stack> #include <cassert> #include <climits> #include <string> #include <cstdlib> #include <random> #include <iomanip> #include <ctime> using namespace std; #ifdef YF_CHECK bool LOCAL = 1; #else #pragma GCC optimize ("unroll-loops") #pragma GCC optimize ("inline") #pragma GCC optimize ("Ofast") #pragma GCC optimize ("O3") bool LOCAL = 0; #endif using ll = long long; using ld = long double; using vll = vector <ll>; using mll = map <ll,ll>; using pll = pair <ll,ll>; using vvl = vector <vll>; using vpll = vector <pll>; template<class T>T MIN(T&a,T b){a=min(a,b);return a;} template<class T>T MAX(T&a,T b){a=max(a,b);return a;} #define all(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define sgr v+v+1,(tl+tr)/2+1,tr #define sgl v+v,tl,(tl+tr)/2 #define pb push_back #define ins insert #define S second #define F first mt19937_64 MT(time(0)); ll BP(ll a,ll b,ll mod=1e9+7){ if(b==0)return 1; ll q=BP(a,b/2,mod); return ((q*q)%mod*(b%2?a:1ll))%mod; } ll f(ll x){return x*(x+1)/2;} ll dup(ll a,ll b){return (a+b-1)/b;} ll lcm(ll a,ll b){return a/__gcd(a,b)*b;} ll invf(ll x){return (-1+sqrt(1+8*x))/2;} ll lg(ll x){return (x ? 63 - __builtin_clzll(x) : -1);} const ll mod=998244353; const ll INF=1e18; const ll inf=1e9+7; const ll N =1e5+7; ll a[N]; vpll K; vector<pair<ll, ll>>g[N]; ll n,m,k; struct DSU{ vll p,sz; ll n; DSU(ll n):n(n){ p.resize(n+1, 0); sz.resize(n+1, 1); build(); } DSU(); void build(){ for(int i=1;i<=n;i++){p[i] = i;sz[i] = 1;} } ll get(ll x){ return (x == p[x] ? x : p[x] = get(p[x])); } bool up(ll a,ll b){ a = get(a); b = get(b); if(a==b)return 0; if(sz[a] < sz[b])swap(a,b); p[b] = a; sz[a] += sz[b]; return 1; } }; ll pr[N], d[N]; ll up[5][N], add[5][N]; vvl e; void dfs(ll v,ll p){ for(auto [b, to] : g[v])if(to != p){ up[0][to] = v; up[1][to] = up[0][v]; up[2][to] = up[1][up[1][to]]; up[3][to] = up[2][up[2][to]]; up[4][to] = up[3][up[3][to]]; d[to] = d[v] + 1; dfs(to, v); e.pb({b, v, to}); } } void YF_MAIN(ll TEST){ cin>>n>>m>>k; vvl E, B; { vvl e; DSU graph(n); for(int i=1;i<=m;i++){ ll v,u,w; cin>>v>>u>>w; e.pb({w,v,u}); } sort(all(e)); for(auto V : e) if(graph.up(V[1], V[2]))E.pb(V); } DSU dsu(n); { DSU graph(n); for(int i=1;i<=k;i++){ ll v,u; cin>>v>>u; graph.up(v, u); K.pb({v,u}); } for(auto V : E){ if(graph.up(V[1], V[2])) dsu.up(V[1], V[2]); else B.pb(V); } } ll color[n+1]{}; long long suma[n+1]{}; long long b[n+1]{}; ll sz=0; { set<ll>st; mll mp; for(int i=1;i<=n;i++){ cin>>a[i]; color[i] = dsu.get(i); st.insert(color[i]); } for(auto i : st) mp[i] = ++sz; for(int i=1;i<=n;i++) color[i] = mp[color[i]]; // for(int i=1;i<=n;i++) cout<<color[i]<<" ";cout<<"\n"; for(int i=1;i<=n;i++) suma[color[i]] += a[i]; n = sz; for(auto &[v, u] : K){ v = color[v]; u = color[u]; } for(auto &V : B){ V[1] = color[V[1]]; V[2] = color[V[2]]; } } DSU cycle(n); long long ans = 0; bool out = 0; for(int mask = 1; mask < (1<<k); mask++){ out = (mask == 858); cycle.build(); for(int i=1;i<=n;i++){ g[i].clear(); b[i] = suma[i]; add[0][i] = add[1][i] = add[2][i] = add[3][i] = add[4][i] = inf; } bool can = 1; for(int i=0; i<k; i++)if((mask>>i)&1){ auto [v, u] = K[i]; if(!cycle.up(v, u)){ can = 0; break; } else{ g[v].pb({1, u}); g[u].pb({1, v}); // if(out)cout<<v<<" "<<u<<" g1\n"; } } if(!can)continue; vvl nd; for(auto V : B){ ll v = V[1], u = V[2]; if(cycle.up(v, u)){ g[v].pb({0, u}); g[u].pb({0, v}); // if(out)cout<<v<<" "<<u<<" g0\n"; } else{ nd.pb(V); } } d[color[1]] = 0; dfs(color[1], color[1]); // if(out){ // for(int v=1;v<=n;v++)cout<<d[v]<<" ";cout<<" d\n"; // for(int i=0;i<5;i++){ // for(int v=1;v<=n;v++)cout<<up[i][v]<<" ";cout<<" up\n"; // } // } // if only u KNEW, that im still here with u // im so alone, nothink feels like home // come fly with me, for(auto V : nd){//O(n * logn) ll w = V[0], v = V[1], u = V[2]; // if(out)cout<<v<<" "<<u<<" "<<w<<" W\n"; if(d[v] > d[u])swap(v, u); // cout<<u<<" "<<v<<" "<<w<<" nd\n"; for(int i=4;i>=0;i--){ if(!up[i][u])continue; if(d[up[i][u]] >= d[v]){ MIN(add[i][u], w); u = up[i][u]; } } for(int i=4;i>=0;--i){ // cout<<u<<" "<<v<<" "<<i<<" "<<up[i][u]<<" "<<up[i][v]<<" LAST\n"; if(!up[i][u])continue; if((up[i][v] ^ up[i][u])){ MIN(add[i][u], w); u = up[i][u]; MIN(add[i][v], w); v = up[i][v]; } } { MIN(add[0][u], w); u = up[0][u]; MIN(add[0][v], w); v = up[0][v]; } } // if(out){ // cout<<mask<<" mask\n"; // for(int i=0;i<5;i++){ // for(int v=1;v<=n;v++)cout<<(add[i][v] == inf ? -1 : add[i][v])<<" ";cout<<"\n"; // } // } for(int i=4;i>0;i--){// O(n log(n)) for(int u=1;u<=n;u++){ int v = up[i-1][u]; MIN(add[i-1][v], add[i][u]); MIN(add[i-1][u], add[i][u]); } } // cout<<mask<<" mask\n"; // for(int i=0;i<5;i++){ // for(int v=1;v<=n;v++)cout<<(add[i][v] == inf ? -1 : add[i][v])<<" ";cout<<"\n"; // } // for(auto V : e) if(V[0])cout<<V[2]<<" ";cout<<" V\n"; long long now = 0; for(auto V : e) b[V[1]] += b[V[2]]; //O(n) for(auto V : e) now += V[0] * 1ll * add[0][V[2]] * b[V[2]]; //O(n) // cout<<mask<<" "<<now<<"\n"; // if(out){ // cout<<mask<<" "<<now<<" m\n"; // for(int i=0; i<k; i++)if((mask>>i)&1)cout<<K[i].F<<" "<<K[i].S<<"\n"; // for(auto V : e){ // if(!V[0])continue; // cout<<b[V[2]]<<" "<<V[2]<<" "<<add[0][V[2]]<<",\n"; // } // cout<<"\n"; // } e.clear(); MAX(ans, now); } cout<<ans; } const bool TECT=0; const bool FLSH=0; const ll SN=1e0 + 7; ll SM[SN]; const ll FN=1e0 + 7; ll FACT[FN], inv[FN], FMOD=inf; ll PNK(ll n,ll k){return FACT[n] *inv[n-k]%FMOD;} ll CNK(ll n,ll k){return PNK(n,k)*inv[k ]%FMOD;} void BEFORE(){ for(ll i=2;i<SN;i++){ if(SM[i])continue; for(ll j=i;j<SN;j+=i) MAX(SM[j],i); } FACT[0]=inv[0]=1; for(int i=1;i<FN;i++){ FACT[i]=FACT[i-1]*i%FMOD; inv[i]=BP(FACT[i],FMOD-2,FMOD); } } signed main(){ // freopen(("input.txt"),"r",stdin);freopen(("output.txt"),"w",stdout); if(FLSH){ ios_base::sync_with_stdio(0); cout.setf(ios::fixed); cout.precision(0); cout.tie(0); cin.tie(0); } int TEST=1; if(TECT) cin>>TEST; BEFORE(); for(int T=1;T<=TEST;T++){ // cout<<"Case "<<T<<": "; YF_MAIN(T); cout<<(T==TEST ? "" : "\n"); } return 0; } // YF YUSUF ```
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...