Submission #537157

#TimeUsernameProblemLanguageResultExecution timeMemory
537157leakedWild Boar (JOI18_wild_boar)C++14
100 / 100
6258 ms941972 KiB
#include <bits/stdc++.h> #define f first #define s second #define m_p make_pair #define vec vector #define pb push_back #define all(x) (x).begin(),(x).end() #define rall(x) (x).rbegin(),(x).rend() #define pw(x) (1LL<<(x)) #define sz(x) (int)(x).size() #define fast_resp ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef long double ld; template<class T> bool chmin(T &a,const T &b){return (a>b?a=b,1:0);}; template<class T> bool chmax(T &a,const T &b){return (a<b?a=b,1:0);}; const ll inf=1e18; const int N=1e5+1; struct ar{ ll a;int b,c; ar(){ a=inf;b=-1;c=-1; } ar(ll _x,int x,int y):a(_x),b(x),c(y){} const bool operator <(const ar &o){ return make_tuple(a,b,c)<make_tuple(o.a,o.b,o.c); } }; void umin(ar &a,const ar &b){ if(a.a>b.a) a=b; } ar emp=ar(inf,-1,-1); struct T{ ar paths[5]; T(){ fill(paths,paths+5,emp); } ///cost,start,end void init(vec<ar> &goes){ fill(paths,paths+5,emp); for(auto &z : goes) umin(paths[0],z); for(auto &z : goes){ if(z.b!=paths[0].b) umin(paths[1],z); if(z.c!=paths[0].c) umin(paths[2],z); } for(auto &z : goes){ if(z.b!=paths[0].b && z.c!=paths[1].c) umin(paths[3],z); if(z.c!=paths[0].c && z.b!=paths[2].b) umin(paths[4],z); } goes.clear(); } }; vec<ar> goes; T dst[2001][2001]; vec<ar> jo[2001][2001]; ll dt[4001][4001]; T t[4*N]; int a[N]; vec<array<ll,3>> g[2001]; void pull(int v){ goes.clear(); for(int i=0;i<5;i++){ for(int j=0;j<5;j++){ if(t[v<<1].paths[i].c!=t[v<<1|1].paths[j].b && t[v<<1].paths[i].a!=inf && t[v<<1|1].paths[j].a!=inf) goes.emplace_back(t[v<<1].paths[i].a+t[v<<1|1].paths[j].a,t[v<<1].paths[i].b,t[v<<1|1].paths[j].c); } } t[v].init(goes); } void build(int v,int tl,int tr){ if(tl==tr){ t[v]=dst[a[tl-1]][a[tl]]; } else{ int tm=(tl+tr)>>1; build(v<<1,tl,tm);build(v<<1|1,tm+1,tr); pull(v); } } void upd(int i,int v,int tl,int tr){ if(tl==tr){ t[v]=dst[a[tl-1]][a[tl]]; return; } int tm=(tl+tr)>>1; if(tm>=i) upd(i,v<<1,tl,tm); else upd(i,v<<1|1,tm+1,tr); pull(v); } signed main(){ fast_resp; int n,m,k,q; cin>>n>>m>>q>>k; vec<array<ll,3>> e; priority_queue<array<ll,2>,vec<array<ll,2>>,greater<array<ll,2>>>pq; for(int i=0;i<m;i++){ int v,u,c; cin>>v>>u>>c;--v;--u; g[v].pb({c,u,sz(e)}); e.pb({v,u,c}); g[u].pb({c,v,sz(e)}); e.pb({u,v,c}); } for(int i=0;i<sz(e);i++){ fill(dt[i],dt[i]+sz(e),inf); dt[i][i]=e[i][2]; pq.push({e[i][2],i}); while(!pq.empty()){ auto c=pq.top();pq.pop(); if(c[0]!=dt[i][c[1]]) continue; int v=e[c[1]][1]; int last=e[c[1]][0]; ll cst=c[0]; // cout<<"I "<<i<<' '<<cst<<' '<< for(auto &u : g[v]){ if(last==u[1]) continue; if(chmin(dt[i][u[2]],cst+u[0])){ pq.push({dt[i][u[2]],u[2]}); } } } } for(int i=0;i<sz(e);i++){ for(int j=0;j<sz(e);j++){ if(dt[i][j]==inf) continue; int v=e[i][0],u=e[j][1]; jo[v][u].emplace_back(dt[i][j],e[i][1],e[j][0]); } } // return 0; for(int i=0;i<n;i++){ for(int j=0;j<n;j++) dst[i][j].init(jo[i][j]); } // return 0; for(int i=0;i<k;i++) cin>>a[i],--a[i]; // return 0; build(1,1,k-1); // return 0; while(q--){ int i,x; cin>>i>>x;--i;--x; a[i]=x; if(i+1<k) upd(i+1,1,1,k-1); if(i) upd(i,1,1,k-1); cout<<(t[1].paths[0].a==inf?-1:t[1].paths[0].a)<<'\n'; } return 0; } /* 4 4 1 3 1 2 1 2 3 1 1 3 1 1 4 1 2 4 2 2 4 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...