Submission #1019288

#TimeUsernameProblemLanguageResultExecution timeMemory
1019288preskoGondola (IOI14_gondola)C++14
90 / 100
12 ms2460 KiB
#include<iostream> #include<vector> #include<algorithm> #include<utility> #include "gondola.h" #define MAXN 300010 #define MOD 1000000009 using namespace std; bool used[MAXN]; int valid(int n, int inputSeq[]) { for(int i=0;i<n;i++) { if(used[inputSeq[i]])return 0; used[inputSeq[i]]=1; if(inputSeq[i]<=n) { int prev=i-1,valp=inputSeq[i]-1; if(prev<0)prev=n-1; if(valp<1)valp=n; int next=i+1,valn=inputSeq[i]+1; if(next>=n)next=0; if(valn>n)valn=1; if(inputSeq[prev]<=n && inputSeq[prev]!=valp)return 0; if(inputSeq[next]<=n && inputSeq[next]!=valn)return 0; } } return 1; } //---------------------- vector<pair<int,int>> order; int replacement(int n, int gondolaSeq[], int replacementSeq[]) { order.clear(); int ans=0,pos=-1; for(int i=0;i<n;i++)if(gondolaSeq[i]<=n){pos=i;break;} if(pos==-1)for(int i=0;i<n;i++)order.push_back({gondolaSeq[i],i+1}); else { int curr=gondolaSeq[pos]; for(int i=pos-1;i>=0;i--) { curr--; if(curr==0)curr=n; if(gondolaSeq[i]>n)order.push_back({gondolaSeq[i],curr}); gondolaSeq[i]=curr; } for(int i=n-1;i>pos;i--) { curr--; if(curr==0)curr=n; if(gondolaSeq[i]>n)order.push_back({gondolaSeq[i],curr}); gondolaSeq[i]=curr; } } sort(order.begin(),order.end()); int last=n; for(int i=0;i<order.size();i++) { int ind=order[i].first; int frst=order[i].second; replacementSeq[ans++]=frst; for(int j=last+2;j<=ind;j++) { replacementSeq[ans++]=j-1; } last=ind; } return ans; } //---------------------- long long power(long long x, int n) { if(n==0)return 1; if(n==1)return x; long long half=power(x,n>>1); long long ne=(half*half)%MOD; if(n&1){ne*=x;ne%=MOD;} return ne; } int countReplacement(int n, int inputSeq[]) { order.clear(); if(!valid(n,inputSeq))return 0; int pos=-1; for(int i=0;i<n;i++)if(inputSeq[i]<=n){pos=i;break;} if(pos==-1)for(int i=0;i<n;i++)order.push_back({inputSeq[i],i+1}); else { int curr=inputSeq[pos]; for(int i=pos-1;i>=0;i--) { curr--; if(curr==0)curr=n; if(inputSeq[i]>n)order.push_back({inputSeq[i],curr}); inputSeq[i]=curr; } for(int i=n-1;i>pos;i--) { curr--; if(curr==0)curr=n; if(inputSeq[i]>n)order.push_back({inputSeq[i],curr}); inputSeq[i]=curr; } } if(order.size()==0)return 1; sort(order.begin(),order.end()); long long ans=1; if(pos==-1)ans=n; int last=n; for(int i=0;i<order.size();i++) { int ind=order[i].first; int frst=order[i].second; long long use=power(order.size()-i,ind-last-1); ans*=use; ans%=MOD; last=ind; } return ans; }

Compilation message (stderr)

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:62:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |   for(int i=0;i<order.size();i++)
      |               ~^~~~~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:119:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  119 |     for(int i=0;i<order.size();i++)
      |                 ~^~~~~~~~~~~~~
gondola.cpp:122:13: warning: unused variable 'frst' [-Wunused-variable]
  122 |         int frst=order[i].second;
      |             ^~~~
#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...