Submission #996868

#TimeUsernameProblemLanguageResultExecution timeMemory
996868errorgornSpy 3 (JOI24_spy3)C++17
94 / 100
118 ms81524 KiB
#include "Aoi.h" #include <bits/stdc++.h> using namespace std; #define int long long #define ii pair<int,int> #define iii tuple<int,int,int> #define fi first #define se second #define pub push_back #define pob pop_back #define puf push_front #define pof pop_front #define lb lower_bound #define ub upper_bound #define rep(x,start,end) for(int x=(start)-((start)>(end));x!=(end)-((start)>(end));((start)<(end)?x++:x--)) #define all(x) (x).begin(),(x).end() #define sz(x) (int)(x).size() namespace { int n,m,q,k; vector<ii> al[20005]; int w[20005]; int hidden[20005]; vector<ii> al2[20005]; ii pp[20005]; int d[20005]; int typ[20005]; int CNT=2; int ID[1<<16]; string bs; int inf[305]; int CNT2=0; int posq[35]; void dfs(int i){ bool f=false; if (ID[typ[i]]==-1){ ID[typ[i]]=CNT++; f=true; bs+="0"; } if (n<=i){ //cout<<i<<" "<<ID[typ[i]]<<endl; posq[i-n]=CNT2++; } for (auto [it,id]:al2[i]) if ((typ[it])&1){ if (typ[it]){ dfs(it); if (hidden[id]!=-1) inf[hidden[id]]=ID[typ[it]]; //if (typ[it]!=typ[i]) cout<<"? "<<ID[typ[i]]<<" "<<ID[typ[it]]<<endl; } } for (auto [it,id]:al2[i]) if ((~typ[it])&1){ if (typ[it]){ dfs(it); if (hidden[id]!=-1) inf[hidden[id]]=ID[typ[it]]; //if (typ[it]!=typ[i]) cout<<"? "<<ID[typ[i]]<<" "<<ID[typ[it]]<<endl; } } if (f) bs+="1"; } } // namespace std::string aoi(signed N, signed M, signed Q, signed K, std::vector<signed> A, std::vector<signed> B, std::vector<long long> C, std::vector<signed> T, std::vector<signed> X) { n=N,m=M,q=Q,k=K; rep(x,0,m){ al[A[x]].pub({B[x],x}); al[B[x]].pub({A[x],x}); w[x]=C[x]; } memset(hidden,-1,sizeof(hidden)); rep(x,0,k) hidden[X[x]]=x; priority_queue<ii,vector<ii>,greater<ii> > pq; memset(d,63,sizeof(d)); d[0]=0; pq.push({d[0],0}); while (!pq.empty()){ int u,ww; tie(ww,u)=pq.top(); pq.pop(); if (d[u]!=ww) continue; for (auto [it,id]:al[u]) if (d[it]>ww+w[id]){ d[it]=ww+w[id]; pq.push({d[it],it}); pp[it]={u,id}; } } rep(x,1,n) al2[pp[x].fi].pub({x,pp[x].se}); rep(x,0,q){ int curr=T[x]; while (curr){ typ[curr]|=1<<x; curr=pp[curr].fi; } al2[T[x]].pub({n+x,20004}); typ[n+x]=1<<x; } memset(ID,-1,sizeof(ID)); typ[0]=(1<<q)-1; ID[(1<<q)-1]=1; dfs(0); //rep(x,0,n) cout<<typ[x]<<" "; cout<<endl; //rep(x,0,k) cout<<inf[x]<<" "; cout<<endl; string s; rep(x,0,k){ rep(i,0,5) s+='0'+((inf[x]>>i)&1); } rep(x,1,q){ //cout<<d[T[x]]<<endl; rep(i,0,4) s+='0'+((posq[x]>>i)&1); } if (bs=="") bs="01"; return s+bs.substr(1,sz(bs)-2); }
#include "Bitaro.h" #include <bits/stdc++.h> using namespace std; #define int long long #define ii pair<int,int> #define iii tuple<int,int,int> #define fi first #define se second #define pub push_back #define pob pop_back #define puf push_front #define pof pop_front #define lb lower_bound #define ub upper_bound #define rep(x,start,end) for(int x=(start)-((start)>(end));x!=(end)-((start)>(end));((start)<(end)?x++:x--)) #define all(x) (x).begin(),(x).end() #define sz(x) (int)(x).size() namespace { int n,m,q,k; vector<ii> al[10005]; int w[20005]; vector<int> imp; int rit[10005]; int d[610][10005]; ii pp[610][10005]; void add(int u){ int i=sz(imp); rit[u]=i; imp.pub(u); priority_queue<ii,vector<ii>,greater<ii> > pq; memset(d[i],63,sizeof(d[i])); d[i][u]=0; pq.push({d[i][u],u}); while (!pq.empty()){ int u,ww; tie(ww,u)=pq.top(); pq.pop(); if (d[i][u]!=ww) continue; for (auto [it,id]:al[u]) if (d[i][it]>ww+w[id]){ d[i][it]=ww+w[id]; pq.push({d[i][it],it}); pp[i][it]={u,id}; } } } int inf[305]; int sp[50]; ii PP[10005]; //this guys contains the actual answers int RR[50]; } // namespace void bitaro(signed N, signed M, signed Q, signed K, std::vector<signed> A, std::vector<signed> B, std::vector<long long> C, std::vector<signed> T, std::vector<signed> X, std::string s) { n=N,m=M,q=Q,k=K; rep(x,0,m) if (C[x]!=-1){ al[A[x]].pub({B[x],x}); al[B[x]].pub({A[x],x}); w[x]=C[x]; } memset(rit,-1,sizeof(rit)); add(0); rep(x,0,k){ rep(i,0,5) if (s[x*5+i]=='1') inf[x]+=1<<i; } int currn=2; vector<int> stk={1}; string bs="0"+s.substr(k*5+(q-1)*4,sz(s)-(k*5+(q-1)*4))+"1"; sp[1]=0; for (auto it:bs){ if (it=='0'){ sp[currn]=stk.back(); stk.pub(currn++); } else{ stk.pob(); } } vector<int> LL; rep(x,1,currn){ bool leaf=true; rep(y,1,currn) if (sp[y]==x) leaf=false; if (leaf) LL.pub(x); } //for (auto it:LL) cout<<it<<" "; cout<<endl; RR[0]=0; add(0); rep(x,1,currn){ set<int> st; rep(y,0,k) if (inf[y]==x) st.insert(y); int R=RR[sp[x]]; while (!st.empty()){ int mn=1e18; for (auto it:st){ mn=min(mn,d[rit[R]][A[X[it]]]); mn=min(mn,d[rit[R]][B[X[it]]]); } for (auto it:st){ if (mn==d[rit[R]][A[X[it]]]){ int curr=A[X[it]]; while (curr!=R){ PP[curr]={pp[rit[R]][curr].fi,pp[rit[R]][curr].se}; curr=pp[rit[R]][curr].fi; } PP[B[X[it]]]={A[X[it]],X[it]}; R=B[X[it]]; st.erase(it); break; } if (mn==d[rit[R]][B[X[it]]]){ int curr=B[X[it]]; while (curr!=R){ PP[curr]={pp[rit[R]][curr].fi,pp[rit[R]][curr].se}; curr=pp[rit[R]][curr].fi; } PP[A[X[it]]]={B[X[it]],X[it]}; R=A[X[it]]; st.erase(it); break; } } if (rit[R]==-1) add(R); } RR[x]=R; //cout<<"debug: "<<x<<" "<<R<<endl; } //rep(x,0,n) cout<<x<<" "<<PP[x].fi<<" "<<PP[x].se<<endl; rep(x,0,q){ int grp=0; if (x){ rep(i,0,4) if (s[k*5+(x-1)*4+i]=='1') grp+=1<<i; } grp=LL[grp]; int curr=T[x]; while (curr!=RR[grp]){ PP[curr]={pp[rit[RR[grp]]][curr].fi,pp[rit[RR[grp]]][curr].se}; curr=pp[rit[RR[grp]]][curr].fi; } vector<signed> stk; curr=T[x]; while (curr){ stk.pub(PP[curr].se); curr=PP[curr].fi; } reverse(all(stk)); //for (auto it:stk) cout<<it<<" "; cout<<endl; answer(stk); } }
#Verdict Execution timeMemoryGrader output
Fetching results...