Submission #112506

#TimeUsernameProblemLanguageResultExecution timeMemory
112506MercenaryGondola (IOI14_gondola)C++14
50 / 100
112 ms3480 KiB
#include "gondola.h" #include<bits/stdc++.h> using namespace std; typedef pair<int,int> ii; typedef long long ll; #define mp make_pair const int maxl = 25e4 + 5; const int mod = 1e9 + 7; int valid(int n, int inputSeq[]) { int root = -1; vector<int> cnt(maxl,0); for(int i = 0 ; i < n ; ++i){ if(inputSeq[i] <= n){ root = i; break; } } if(root == -1)return 1; for(int j = (root + 1) % n ; j != root ; j = (j + 1) % n){ if(cnt[inputSeq[j]]++ == 1)return 0; if(inputSeq[j] <= n && (inputSeq[j] - inputSeq[root] + n) % n != (j - root + n) % n){ return 0; } } return 1; } //---------------------- int replacement(int n, int gondolaSeq[], int replacementSeq[]) { assert(valid(n,gondolaSeq)); vector<ii> a; for(int i = 0 ; i < n ; ++i){ if(gondolaSeq[i] > n)a.push_back(mp(gondolaSeq[i],i)); } sort(a.begin(),a.end()); int now = 0; int l = 0; vector<int> avai , pos(maxl); int root = -1; for(int i = 0 ; i < n ; ++i){ if(gondolaSeq[i] <= n){ root = i; break; } } // printf("%d",root); for(int i = (root == -1 ? 1 : gondolaSeq[root]) , j = (root == -1 ? 0 : root) , cnt = n ; cnt-- ; j = (j + 1) % n , i = i % n + 1){ pos[i] = j; if(gondolaSeq[j] != i){ gondolaSeq[j] = i; avai.push_back(i); } } int res = 1; for(int j = n + 1 ; now < a.size() ; ++j){ if(a[now].first == j){ // printf("%d\n", gondolaSeq[a[now].second]); replacementSeq[l++] = gondolaSeq[a[now].second]; avai.erase(find(avai.begin(),avai.end(),gondolaSeq[a[now].second])); // cerr << gondolaSeq[a[now].second] << endl; ++now; }else{ replacementSeq[l++] = avai.back(); gondolaSeq[pos[avai.back()]] = j; pos[j] = pos[avai.back()]; avai.back() = j; res = (ll)res * avai.size() % mod; } } for(int i = 1 ; i <= n ; ++i)res = res * i % mod; return l; } //---------------------- int countReplacement(int n, int gondolaSeq[]) { if(valid(n,gondolaSeq) == 0)return 0; vector<ii> a; for(int i = 0 ; i < n ; ++i){ if(gondolaSeq[i] > n)a.push_back(mp(gondolaSeq[i],i)); } sort(a.begin(),a.end()); int now = 0; int l = 0; vector<int> avai , pos(maxl); int root = -1; for(int i = 0 ; i < n ; ++i){ if(gondolaSeq[i] <= n){ root = i; break; } } // printf("%d",root); for(int i = (root == -1 ? 1 : gondolaSeq[root]) , j = (root == -1 ? 0 : root) , cnt = n ; cnt-- ; j = (j + 1) % n , i = i % n + 1){ pos[i] = j; if(gondolaSeq[j] != i){ gondolaSeq[j] = i; avai.push_back(i); } } int res = 1; for(int j = n + 1 ; now < a.size() ; ++j){ if(a[now].first == j){ // printf("%d\n", gondolaSeq[a[now].second]); // replacementSeq[l++] = gondolaSeq[a[now].second]; avai.erase(find(avai.begin(),avai.end(),gondolaSeq[a[now].second])); // cerr << gondolaSeq[a[now].second] << endl; ++now; }else{ // replacementSeq[l++] = avai.back(); gondolaSeq[pos[avai.back()]] = j; pos[j] = pos[avai.back()]; avai.back() = j; res = (ll)res * avai.size() % mod; } } if(root == -1)for(int i = 1 ; i <= n ; ++i)res = res * i % mod; return res; }

Compilation message (stderr)

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:62:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int j = n + 1 ; now < a.size() ; ++j){
                         ~~~~^~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:110:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int j = n + 1 ; now < a.size() ; ++j){
                         ~~~~^~~~~~~~~~
gondola.cpp:92:9: warning: unused variable 'l' [-Wunused-variable]
     int l = 0;
         ^
#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...