Submission #563881

#TimeUsernameProblemLanguageResultExecution timeMemory
563881errorgornWild Boar (JOI18_wild_boar)C++17
100 / 100
9373 ms498480 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ii pair<int,int> #define i3 tuple<int,int,int> #define i4 tuple<int,int,int,int> #define fi first #define se second #define endl '\n' #define puf push_front #define pof pop_front #define pub push_back #define pob pop_back #define lb lower_bound #define ub upper_bound #define rep(x,s,e) for (int x=(s)-((s)>(e));x!=(e)-((s)>(e));((s)<(e)?x++:x--)) #define all(x) (x).begin(),(x).end() #define sz(x) (int) (x).size() mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int n,m,l,q; struct E{ int to,w,id; }; vector<E> al[2005]; vector<ii> w[2005]; //ok so we store the best 2 guys... priority_queue<i4,vector<i4>,greater<i4> > pq; void add(int i,ii val){ if (w[i][0]==val || w[i][1]==val) return; //prevent from inserting dupes //cout<<i<<" "<<val.fi<<" "<<val.se<<endl; //rep(x,0,2) cout<<w[i][x].fi<<" "<<w[i][x].se<<endl; if (val.fi<w[i][0].fi){ if (val.fi!=w[i][0].fi){ swap(w[i][0],w[i][1]); pq.push({w[i][1].fi,w[i][1].se,i,1}); } w[i][0]=val; pq.push({w[i][0].fi,w[i][0].se,i,0}); } else if (val.fi<w[i][1].fi && w[i][0].se!=val.se){ w[i][1]=val; pq.push({w[i][1].fi,w[i][1].se,i,1}); } } struct dat{ vector<i3> res; dat(){}; dat (vector<i3> temp){ //pick best 5 map<int,int> m1,m2; set<ii> s; sort(all(temp)); for (auto [w,a,b]:temp){ if (m1[a]==2 || m2[b]==2 || s.count({a,b})) continue; m1[a]++,m2[b]++; s.insert({a,b}); res.pub({w,a,b}); if (sz(res)==5) break; } } }; dat merge(dat i,dat j){ vector<i3> temp; for (auto [w,id1,id2]:i.res) for (auto [w2,id3,id4]:j.res){ if (id2!=id3) temp.pub({w+w2,id1,id4}); } return dat(temp); } vector<i3> v[2005]; dat trans[2005][2005]; int arr[100005]; struct node{ int s,e,m; dat val; node *l,*r; node (int _s,int _e){ s=_s,e=_e,m=s+e>>1; if (s!=e){ l=new node(s,m); r=new node(m+1,e); val=merge(l->val,r->val); } else{ val=trans[arr[s]][arr[s+1]]; } } void update(int i){ if (s==e) val=trans[arr[i]][arr[i+1]]; else{ if (i<=m) l->update(i); else r->update(i); val=merge(l->val,r->val); } } } *root; signed main(){ cin.tie(0); cout.tie(0); cin.sync_with_stdio(false); cin>>n>>m>>q>>l; int a,b,c; rep(x,0,m){ cin>>a>>b>>c; al[a].pub({b,c,x}); al[b].pub({a,c,x}); } rep(x,1,n+1){ rep(y,1,n+1) v[y].clear(); for (auto [y,_W,id]:al[x]){ rep(x,1,n+1){ w[x].clear(); rep(y,1,3) w[x].pub({1e18,-y}); } add(y,{_W,id}); while (!pq.empty()){ int W,id,u,pos; tie(W,id,u,pos)=pq.top(),pq.pop(); if (w[u][pos]!=ii(W,id)) continue; for (auto [it,w2,id2]:al[u]) if (id!=id2){ add(it,{W+w2,id2}); } } rep(y,1,n+1) for (auto [w,id2]:w[y]) if (w<1e18){ v[y].pub({w,id,id2}); } } rep(y,1,n+1) trans[x][y]=dat(v[y]); } rep(x,1,l+1) cin>>arr[x]; root=new node(1,l-1); while (q--){ cin>>a>>b; arr[a]=b; if (a!=1) root->update(a-1); if (a!=l) root->update(a); if (root->val.res.empty()) cout<<"-1"<<endl; else cout<<get<0>(root->val.res[0])<<endl; } }

Compilation message (stderr)

wild_boar.cpp: In constructor 'node::node(long long int, long long int)':
wild_boar.cpp:88:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   88 |     s=_s,e=_e,m=s+e>>1;
      |                 ~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...