Submission #1025420

#TimeUsernameProblemLanguageResultExecution timeMemory
1025420vjudge1Gondola (IOI14_gondola)C++17
100 / 100
56 ms6152 KiB
#include "gondola.h" #include<bits/stdc++.h> using namespace std; int valid(int n, int inputSeq[]) { int PS=-1; set<int>st; for(int i=0;i<n;i++){ st.insert(inputSeq[i]); if(inputSeq[i]>n) continue; int k=n+i-inputSeq[i]; k%=n; if(PS==-1) PS=k; if(PS-k) return 0; } return 1&&st.size()==n; } map<int,int>IMPORTANT; set<int>alive; int replacement(int n, int gondolaSeq[], int replacementSeq[]){ int k=*max_element(gondolaSeq,gondolaSeq+n)-n; int gondolaSeq2[250100],dn=0; for(int i=0;i<n;i++){ if(gondolaSeq[i]<=n){ if(!dn){ dn=1; int j=i,k=gondolaSeq[i]; do { gondolaSeq2[j]=k; j=(j+1)%n; k=k%n+1; }while(j-i); } } else { IMPORTANT[gondolaSeq[i]]=i+1; alive.insert(i); } } if(!dn){ iota(gondolaSeq2,gondolaSeq2+n,1); } for(int i=n;i++<n+k;){ if(IMPORTANT[i]){ int k=IMPORTANT[i]-1; replacementSeq[i-n-1]=gondolaSeq2[k]; gondolaSeq2[k]=i; alive.erase(k); } else { IMPORTANT.erase(i); replacementSeq[i-n-1]=gondolaSeq2[*alive.begin()]; gondolaSeq2[*alive.begin()]=i; } } return k; } //---------------------- #define int long long typedef signed I; const int mod=1e9+9; int quickp(int a,int b){ int ans=1; while(b){ if(b&1) ans=ans*a%mod; b>>=1; a=a*a%mod; } return ans; } I countReplacement(I n, I inputSeq[]) { if(!valid(n,inputSeq))return 0; int ans=1; set<int>onesabove; for(int i=0;i<n;i++) if(inputSeq[i]>n) onesabove.insert(inputSeq[i]); if(size(onesabove)==n) ans=n; int prev=n,K=onesabove.size(); for(auto i:onesabove){ ans=ans*quickp(K,i-prev-1)%mod; K--; prev=i; } return ans; } #undef int

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:18:24: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   18 |     return 1&&st.size()==n;
      |               ~~~~~~~~~^~~
gondola.cpp: In function 'I countReplacement(I, I*)':
gondola.cpp:80:23: warning: comparison of integer expressions of different signedness: 'std::set<long long int>::size_type' {aka 'long unsigned int'} and 'I' {aka 'int'} [-Wsign-compare]
   80 |     if(size(onesabove)==n)
      |        ~~~~~~~~~~~~~~~^~~
#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...