제출 #783041

#제출 시각아이디문제언어결과실행 시간메모리
783041Rafi22Monster Game (JOI21_monster)C++17
100 / 100
94 ms424 KiB
#include <bits/stdc++.h> #include "monster.h" using namespace std; #define endl '\n' #define st first #define nd second #define pb push_back #define sz(x) (int)(x).size() #define all(x) (x).begin(), (x).end() #define ll long long ll mod=1000000007; int inf=1000000007; ll infl=1000000000000000007; /* const int N=1007; int p[N]; bool Query(int a, int b) { if(abs(p[a]-p[b])==1) return p[a]<p[b]; else return p[a]>p[b]; }*/ bool ok[1007]; vector<int>Sort(vector<int>V) { if(sz(V)<=1) return V; int m=sz(V)/2; vector<int>L,R,A; for(int i=0;i<m;i++) L.pb(V[i]); for(int i=m;i<sz(V);i++) R.pb(V[i]); L=Sort(L); R=Sort(R); int l=0,r=0; for(int i=0;i<sz(V);i++) { if(l==sz(L)) { A.pb(R[r]); r++; } else if(r==sz(R)) { A.pb(L[l]); l++; } else if(Query(L[l],R[r])) { A.pb(R[r]); r++; } else { A.pb(L[l]); l++; } } return A; } vector<int>Solve(int n) { memset(ok,0,sizeof ok); vector<int>V(n); for(int i=0;i<n;i++) V[i]=i; random_shuffle(all(V)); V=Sort(V); for(int b=0;b<4;b++) { if(b+4<n&&Query(V[b],V[b+2])&&Query(V[b+1],V[b+3])&&Query(V[b+2],V[b+4])) { ok[b]=1; ok[b+1]=1; ok[b+2]=1; ok[b+3]=1; ok[b+4]=1; int l=b+5; for(int j=b+3;j+2<n;j++) { if(!Query(V[j],V[j+2])) break; ok[j+2]=1; l++; } reverse(V.begin()+b,V.begin()+l); } } int A=-1,B=-1; for(int i=0;i<min(n,10);i++) { int c=0; for(int j=0;j<min(n,10);j++) if(i!=j) c+=Query(V[i],V[j]); if(c==1) { if(A==-1) A=i; else B=i; } } if(Query(V[A],V[B])) reverse(V.begin(),V.begin()+A+1); else reverse(V.begin(),V.begin()+B+1); for(int i=1;i<n;i++) { if(ok[i]) continue; for(int j=i;j<n;j++) { ok[j]=1; if(Query(V[i-1],V[j])) { reverse(V.begin()+i,V.begin()+j+1); break; } } } vector<int>ans(n,0); for(int i=0;i<n;i++) ans[V[i]]=i; return ans; } /* void Case1(int n) { for(int i=0;i<n;i++) cin>>p[i]; vector<int>V=Solve(n); for(auto x:V) cout<<x<<" "; } bool Case(int n) { for(int i=0;i<n;i++) p[i]=i; random_shuffle(p,p+n); vector<int>V=Solve(n); bool is=1; for(int i=0;i<n;i++) if(p[i]!=V[i]) is=0; if(!is) { for(auto x:V) cout<<x<<" "; cout<<endl; } return is; } int main() { int n; cin>>n; // Case1(n); while(true) { if(!Case(n)) break; } for(int i=0;i<n;i++) cout<<p[i]<<" "; cout<<endl; return 0; } */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...