Submission #288666

#TimeUsernameProblemLanguageResultExecution timeMemory
288666shayan_pGondola (IOI14_gondola)C++17
75 / 100
76 ms6392 KiB
#include<bits/stdc++.h> #include "gondola.h" #define F first #define S second #define PB push_back #define sz(s) (int(s.size())) #define bit(n, k) (((n)>>(k))&1) using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef long double ld; const int maxn = 1e5 + 10, mod = 1e9 + 7; int valid(int n, int inp[]){ int pos[n]; fill(pos, pos + n, -1); set<int> st; for(int i = 0; i < n; i++){ --inp[i]; if(inp[i] < 0) return 0; if(st.count(inp[i])) return 0; st.insert(inp[i]); if(inp[i] < n) pos[inp[i]] = i; } int lst = -1; for(int i = 0; i < n; i++){ if(pos[i] != -1){ if(lst == -1) lst = i; if((lst - i + n) % n != (pos[lst] - pos[i] + n) % n) return 0; } } for(int i = 0; i < n; i++){ if(pos[i] != -1){ if(lst == -1) lst = i; if((lst - i + n) % n != (pos[lst] - pos[i] + n) % n) return 0; } } return 1; } int replacement(int n, int inp[], int outp[]){ const int maxl = 3e5 + 10; int pos[maxl], arr[n]; memset(pos, -1, sizeof pos); int start = 0; for(int i = 0; i < n; i++){ pos[--inp[i]] = i; if(inp[i] < n) start = (i - inp[i] + n) % n; } for(int i = 0; i < n; i++){ arr[(i + start) % n] = i; } set<int> fre; for(int i = 0; i < n; i++){ if(inp[i] >= n) fre.insert(i); } int L = 0; for(int i = n; i < maxl; i++){ if(pos[i] == -1){ if(fre.empty()) break; int x = *fre.begin(); outp[L++] = arr[x] + 1; arr[x] = i; } else{ fre.erase(pos[i]); int x = pos[i]; outp[L++] = arr[x] + 1; arr[x] = i; } } return L; } int countReplacement(int n, int inp[]){ int chert[n + 10]; for(int i = 0; i < n; i++) chert[i] = inp[i]; if(!valid(n, chert)) return 0; const int mod = 1e9 + 9; const int maxl = 3e5 + 10; int pos[maxl], arr[n]; memset(pos, -1, sizeof pos); int start = 0; for(int i = 0; i < n; i++){ pos[--inp[i]] = i; if(inp[i] < n) start = (i - inp[i] + n) % n; } for(int i = 0; i < n; i++){ arr[(i + start) % n] = i; } set<int> fre; for(int i = 0; i < n; i++){ if(inp[i] >= n) fre.insert(i); } int ans = 1; for(int i = n; i < maxl; i++){ if(pos[i] == -1){ if(fre.empty()) break; ans = 1ll * ans * sz(fre) % mod; } else{ fre.erase(pos[i]); } } return ans; }

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:97:20: warning: variable 'arr' set but not used [-Wunused-but-set-variable]
   97 |     int pos[maxl], arr[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...