Submission #30351

#TimeUsernameProblemLanguageResultExecution timeMemory
30351inqrGondola (IOI14_gondola)C++14
30 / 100
46 ms7768 KiB
#include "gondola.h" #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define rt insert #define st first #define nd second #define ll long long #define pii pair < int , int > #define DB printf("debug\n"); #define umax( x , y ) x = max( x , (y) ) #define umin( x , y ) x = min( x , (y) ) #define all(x) x.begin() , x.end() #define MOD 1000000009 using namespace std; int nx(int i,int sz){ return (i+1)%(sz); } map < int,int > timesseen; int origl=-1; int broken=0; long long ans=1; int valid(int n, int inputSeq[]) { vector < int > orig; for(int i=0;i<n;i++){ int nxx=nx(i,n); timesseen[inputSeq[i]]++; if(timesseen[inputSeq[i]]>1)return 0; if(inputSeq[i]<=n)orig.pb(inputSeq[i]); if(inputSeq[i]<=n&&inputSeq[nxx]<=n){ if(inputSeq[i]==n && inputSeq[nxx]!=1)return 0; else if(inputSeq[i]<n && inputSeq[nxx]!=inputSeq[i]+1)return 0; } } int startover=0; for(int i=0;i<orig.size();i++){ int nxx=nx(i,orig.size()); if(orig[i]<orig[nxx])continue; else if(startover==0)startover++; else if(startover==1)return 0; } return 1; } int replacement(int n, int gondolaSeq[], int replacementSeq[]) { for(int i=0;i<n;i++){ int nxx=nx(i,n); if(gondolaSeq[i]<=n){ origl=i-(gondolaSeq[i]-1)+n; origl%=n; } umax(broken,gondolaSeq[i]-n); } if(origl==-1){ origl=0; ans*=n; ans%=MOD; } int repind[broken+5]; set < int > repcand; int orig[n+5]; for(int i=0;i<n;i++){ int ogon=(i+1)-origl+n; if(ogon>n)ogon%=n; orig[i]=ogon; if(gondolaSeq[i]>n){ repcand.insert(i); repind[gondolaSeq[i]-n-1]=i; } } for(int i=0;i<broken;i++){ if(!repind[i]){ ans*=repcand.size();ans%=MOD; replacementSeq[i]=orig[*repcand.begin()]; orig[*repcand.begin()]=i+n+1; } else{ replacementSeq[i]=orig[repind[i]]; orig[repind[i]]=i+n+1; repcand.erase(repcand.find(repind[i])); } } return broken; } int replacement2(int n, int gondolaSeq[]) { for(int i=0;i<n;i++){ int nxx=nx(i,n); if(gondolaSeq[i]<=n){ origl=i-(gondolaSeq[i]-1)+n; origl%=n; } umax(broken,gondolaSeq[i]-n); } if(origl==-1){ origl=0; ans*=n; ans%=MOD; } int repind[broken]; set < int > repcand; int orig[n]; for(int i=0;i<n;i++){ int ogon=(i+1)-origl+n; if(ogon>n)ogon%=n; orig[i]=ogon; if(gondolaSeq[i]>n){ repcand.insert(i); repind[gondolaSeq[i]-n-1]=i; } } for(int i=0;i<broken;i++){ if(!repind[i]){ ans*=repcand.size();ans%=MOD; orig[*repcand.begin()]=i+n+1; } else{ orig[repind[i]]=i+n+1; repcand.erase(repcand.find(repind[i])); } } return broken; } //---------------------- int countReplacement(int n, int inputSeq[]) { if(valid(n,inputSeq)==0)return 0; int a=replacement2(n,inputSeq); if(a==0)return 1; return ans; }

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:37:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<orig.size();i++){
               ^
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:48:7: warning: unused variable 'nxx' [-Wunused-variable]
   int nxx=nx(i,n);
       ^
gondola.cpp: In function 'int replacement2(int, int*)':
gondola.cpp:92:7: warning: unused variable 'nxx' [-Wunused-variable]
   int nxx=nx(i,n);
       ^
gondola.cpp:107:6: warning: variable 'orig' set but not used [-Wunused-but-set-variable]
  int orig[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...