Submission #198092

#TimeUsernameProblemLanguageResultExecution timeMemory
198092model_codeSecret Permutation (RMI19_permutation)C++17
100 / 100
2201 ms448 KiB
/** * user: pavic-9e7 * fname: Patrick * lname: Pavić * task: permutation * score: 100.0 * date: 2019-10-11 08:46:49.328394 */ #include "permutation.h" #include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> #define X first #define Y second #define PB push_back using namespace std; typedef vector < int > vi; const int N = 505; int raz[N], bio[N], n; vi cur, p; vector < pair < vi , int > > qv; bool dobar(int x){ return !(x < 1 || x > n || bio[x]); } int eval(vi p, vi v){ int ret = 0; for(int i = 0;i + 1 < n;i++){ ret += abs(p[v[i] - 1] - p[v[i + 1] - 1]); } return ret; } void brute(int i){ //printf("i = %d\n", i); if(i == n){ if(abs(cur.back() - cur[0]) != raz[0]) return; vi fin, inv; fin.resize(n); inv.resize(n); for(int i = 0;i < n;i++) fin[p[i] - 1] = cur[i], inv[cur[i] - 1] = p[i]; //printf("mislim da ga imam : \n"); //for(int x : fin) // printf("%d ", x); //printf("\n"); //if(query(inv) != n - 1) // return; answer(fin); return; } if(dobar(cur.back() - raz[i])){ cur.PB(cur.back() - raz[i]); bio[cur.back()]++; brute(i + 1); bio[cur.back()]--; cur.pop_back(); } if(dobar(cur.back() + raz[i])){ cur.PB(cur.back() + raz[i]); bio[cur.back()]++; brute(i + 1); bio[cur.back()]--; cur.pop_back(); } } void solve(int nn) { n = nn; if(n <= 7){ vi v, fin; for(int i = 0;i < n;i++){ v.PB(i + 1); fin.PB(i + 1); } for(int i = 0;i < n ;i++){ random_shuffle(v.begin(), v.end()); random_shuffle(v.begin(), v.end()); qv.PB({v, query(v)}); } do{ bool good = 1; for(pair < vi, int > q : qv){ if(eval(fin, q.X) != q.Y){ //printf("%d %d\n", q.Y, eval(fin, q.X)); good = 0; } } //printf("fin : "); //for(int x : fin) printf("%d ", x); //printf("\n"); if(good){ answer(fin); return; } } while(next_permutation(fin.begin(), fin.end())); return; } for(int i = 0;i < n;i++){ p.PB(i + 1); } random_shuffle(p.begin(), p.end()); random_shuffle(p.begin(), p.end()); int sm = 0; for(int i = 0;i < n;i++){ raz[i] = query(p); sm += raz[i]; p.push_back(p[0]); p.erase(p.begin()); } sm /= (n - 1); for(int i = 0;i < n;i++) raz[i] = sm - raz[i];// printf("raz %d = %d\n", i, raz[i]); for(int i = n;i >= 1;i--){ bio[i]++; cur.PB(i); brute(1); bio[i]--; cur.pop_back(); } }

Compilation message (stderr)

stub.cpp: In function 'int query(int*)':
stub.cpp:15:9: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   fscanf(stdin, "%d", &x);
   ~~~~~~^~~~~~~~~~~~~~~~~
stub.cpp: In function 'int main(int, char**)':
stub.cpp:48:9: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   fscanf(stdin, "%d", &N);
   ~~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...