제출 #741743

#제출 시각아이디문제언어결과실행 시간메모리
741743myrcella즐거운 행로 (APIO20_fun)C++17
100 / 100
260 ms23500 KiB
//by szh #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define pii pair<int,int> #define pll pair<long long,long long> #define pb push_back #define debug(x) cerr<<#x<<"="<<x<<endl #define pq priority_queue #define inf 0x3f #define rep(i,a,b) for (int i=a;i<(b);i++) #define MP make_pair #define SZ(x) (int(x.size())) #define ll long long #define mod 1000000007 #define ALL(x) x.begin(),x.end() void inc(int &a,int b) {a=(a+b)%mod;} void dec(int &a,int b) {a=(a-b+mod)%mod;} int lowbit(int x) {return x&(-x);} ll p0w(ll base,ll p) {ll ret=1;while(p>0){if (p%2ll==1ll) ret=ret*base%mod;base=base*base%mod;p/=2ll;}return ret;} #include "fun.h" const int maxn = 1e5+10; int n; int val[maxn]; int dis[maxn]; vector <int> rt; vector <pii> node[3]; vector <int> solve(vector<vector <pii> > nodee) { vector <int> ans; int cur = 0; if (SZ(nodee[1])>SZ(nodee[0])) cur = 1; while (!nodee[cur].empty()) { ans.pb(nodee[cur].back().se); nodee[cur].pop_back(); cur ^= 1; } return ans; } std::vector<int> createFunTour(int N, int Q) { if (N==2) { vector <int> tmp = {0,1}; return tmp; } int cent = -1; n = N; rep(i,0,n) { val[i] = attractionsBehind(0,i); if (val[i]*2>=N) if (cent==-1 or val[i]<val[cent]) cent=i; } rep(i,0,n) if (cent!=i) { dis[i] = hoursRequired(cent,i); if (dis[i]==1) rt.pb(i); } rep(i,0,n) if (cent!=i) { bool ok = false; rep(j,0,SZ(rt)-1) if (hoursRequired(rt[j],i)+1==dis[i]) { ok = true; node[j].pb({dis[i],i}); break; } if (ok==false) node[SZ(rt)-1].pb({dis[i],i}); } sort(ALL(node[0]));sort(ALL(node[1])); vector <int> ans; // debug(cent); //for (auto it:node[1]) debug(it.se); if (SZ(rt)==2) { ans = solve({node[0],node[1]}); } else { sort(ALL(node[2])); bool ok = false; int lst,lstrt = -1; rep(i,0,3) { if (SZ(node[i])>=SZ(node[0])+SZ(node[1])+SZ(node[2]) - SZ(node[i])) { vector <pii> small; rep(j,0,3) if (i!=j) while (!node[j].empty()) small.pb(node[j].back()),node[j].pop_back(); sort(ALL(small)); vector <int> hmm = solve({small,node[i]}); for (auto it:hmm) ans.pb(it); ok = true; break; } } if (ok==false) while (1) { int tmp = -1; if (lstrt!=0 and (tmp==-1 or node[1].back().fi > node[tmp].back().fi)) tmp = 0; if (lstrt!=1 and (tmp==-1 or node[1].back().fi > node[tmp].back().fi)) tmp = 1; if (lstrt!=2 and (tmp==-1 or node[2].back().fi > node[tmp].back().fi)) tmp = 2; ans.pb(node[tmp].back().se); lst = node[tmp].back().fi; lstrt = tmp; node[tmp].pop_back(); ok = false; rep(i,0,3) { if (SZ(node[i])==SZ(node[0])+SZ(node[1])+SZ(node[2]) - SZ(node[i])) { vector <pii> small; rep(j,0,3) if (i!=j) while (!node[j].empty()) small.pb(node[j].back()),node[j].pop_back(); sort(ALL(small)); if (small.back().fi>lst) { ans.pb(small.back().se); small.pop_back(); } vector <int> hmm = solve({node[i],small}); for (auto it:hmm) ans.pb(it); ok = true; break; } } if (ok) break; } } ans.pb(cent); return ans; }
#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...