제출 #1287999

#제출 시각아이디문제언어결과실행 시간메모리
1287999Faisal_Saqib곤돌라 (IOI14_gondola)C++20
100 / 100
70 ms10384 KiB
// #pragma once #include "gondola.h" #include <set> #include <vector> #include <algorithm> #include <map> #include <iostream> using namespace std; #define ll long long ll powmod(ll a,ll b,ll mod) { if(b==0) return 1; if(b==1) return a; ll h=powmod(a,b/2,mod); h=(h*h)%mod; if(b&1) h=(h*a)%mod; return h; } int valid(int n, int a[]) { int j=0; bool adspl=1; int val; for(int i=0;i<n;i++) { a[i]--; if(a[i]<=(n-1)) { j=i; val=a[j]; adspl=0; } } int level[n]; int ok=j; set<int> spp; map<int,int> kidr; int mx=0; if(adspl) val=0; vector<int> nep; bool posas=1; for(int ap=0;ap<n;ap++) { level[j]=(val+ap)%n; if(level[j]!=a[j]) { nep.push_back(a[j]); spp.insert(j); if(kidr.find(a[j])!=kidr.end()) { posas=0; } kidr[a[j]]=j; if(a[j]<n) { posas=0; } mx=max(mx,a[j]); } j+=1; j%=n; } return posas; // sort(begin(nep),end(nep)); // ll last=n; // for(int i=0;i<nep.size();i++) // { // } for(int ne=n;ne<=mx;ne++) { if(kidr.find(ne)==kidr.end()) { level[*begin(spp)]=ne; } else { int f=kidr[ne]; spp.erase(f); } } if(spp.size()==0) return 1; return 0; } int replacement(int n, int a[], int ans[])// Done { int j=0; bool adspl=1; int val; for(int i=0;i<n;i++) { a[i]--; if(a[i]<=(n-1)) { j=i; val=a[j]; adspl=0; } } int level[n]; int ok=j; set<int> spp; map<int,int> kidr; int mx=0; if(adspl) val=0; for(int ap=0;ap<n;ap++) { level[j]=(val+ap)%n; if(level[j]!=a[j]) { spp.insert(j); kidr[a[j]]=j; mx=max(mx,a[j]); } j+=1; j%=n; } int l=0; for(int ne=n;ne<=mx;ne++) { if(kidr.find(ne)==kidr.end()) { // Place some random place ans[l++]=level[*begin(spp)]+1; level[*begin(spp)]=ne; } else { int f=kidr[ne]; spp.erase(f); ans[l++]=level[f]+1; } } return l; } int countReplacement(int n, int a[]) { if(!valid(n,a)) return 0; ll ans=1,mod=1e9+9; int j=0; bool adspl=1; int val; int mx=0; for(int i=0;i<n;i++) { // a[i]--; mx=max(mx,a[i]); if(a[i]<=(n-1)) { j=i; val=a[j]; adspl=0; } } int ok=j,level=0; if(adspl) { val=0; ans=n; } vector<int> vape; for(int ap=0;ap<n;ap++) { level=(val+ap)%n; if(level!=a[j]) { vape.push_back(a[j]); mx=max(mx,a[j]); } j+=1; j%=n; } sort(begin(vape),end(vape)); ll last=n; ll top=vape.size(); for(int i=0;i<vape.size();i++) { ll len=vape[i]-last; ans=(ans*powmod(top,len,mod))%mod; last=vape[i]+1; top--; } 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...
#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...