Submission #1011516

#TimeUsernameProblemLanguageResultExecution timeMemory
1011516SonicMLGondola (IOI14_gondola)C++14
60 / 100
10 ms2264 KiB
#include <iostream> #include <vector> #include <algorithm> #include "gondola.h" using namespace std; int const NMAX = 1e5; int const MMAX = 250000; int freq[1 + MMAX]; int valid(int n, int inputSeq[]) { int minpos = 0; bool isUnbroken = false; for(int i = 0;i < n;i++) { freq[inputSeq[i]]++; if(inputSeq[i] <= n) { isUnbroken = true; if(inputSeq[minpos] > inputSeq[i]) { minpos = i; } } } for(int i = 1;i <= MMAX;i++) { if(freq[i] > 1) { return 0; } } if(isUnbroken) { for(int i = 0;i < n;i++) { if(inputSeq[i] <= n) { int distPos = (n + i - minpos) % n; int distVal = inputSeq[i] - inputSeq[minpos]; if(distPos != distVal) { return 0; } } } } return 1; } int arr[1 + NMAX]; void printArr(int n) { for(int i = 0;i < n;i++) { cout << arr[i] << ' '; } cout << '\n'; return; } int replacement(int n, int gondolaSeq[], int replacementSeq[]) { bool unmarked[1 + NMAX]; int pos[1 + MMAX]; int maxx = 0, minpos = 0; bool isUnbroken = false; for(int i = 1;i <= MMAX;i++) { pos[i] = -1; } for(int i = 0;i < n;i++) { if(gondolaSeq[i] <= n) { unmarked[i] = false; isUnbroken = true; if(gondolaSeq[minpos] > gondolaSeq[i]) { minpos = i; } } else { unmarked[i] = true; } pos[gondolaSeq[i]] = i; maxx = max(maxx, gondolaSeq[i]); } if(isUnbroken) { for(int i = 0;i < n;i++) { int dist = (n + i - minpos); int val = (gondolaSeq[minpos] + dist) % n; if(val == 0) { val = n; } arr[i] = val; } }else { for(int i = 0;i < n;i++) { arr[i] = i + 1; } } //printArr(n); int dump = 0, index = 0; for(int i = n+1;i <= maxx;i++) { if(pos[i] == -1) { while(!unmarked[dump]) { dump++; } replacementSeq[index] = arr[dump]; arr[dump] = i; index++; }else { replacementSeq[index] = arr[pos[i]]; arr[pos[i]] = i; index++; } } return index; } int const MODULO = 1e9+9; int logPow(int a, int b) { if(b == 0) { return 1; } else if(b == 1) { return a; } else { int mult = logPow(a, b/2); mult = (1LL * mult * mult) % MODULO; if(b % 2 == 1) { return (1LL * mult * a) % MODULO; } else { return mult; } } } int countReplacement(int n, int inputSeq[]) { if(!valid(n, inputSeq)) { //cerr << "SUDOKU\n"; return 0; } vector <int> toMark; int unmarked = n; bool isUnbroken = false; for(int i = 0;i < n;i++) { if(inputSeq[i] <= n) { unmarked--; isUnbroken = true; } else { toMark.push_back(inputSeq[i]); } } sort(toMark.begin(), toMark.end()); int prev = n, ans = 1; for(int i = 0;i < toMark.size();i++) { int dist = (toMark[i] - prev - 1); //cerr << unmarked << ' ' << logPow(unmarked, dist) << '\n'; ans = (1LL * ans * logPow(unmarked, dist)) % MODULO; unmarked--; prev = toMark[i]; } if(!isUnbroken) { ans = (1LL * ans * n) % MODULO; } return ans; }

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:144:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  144 |   for(int i = 0;i < toMark.size();i++) {
      |                 ~~^~~~~~~~~~~~~~~
#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...