Submission #50882

#TimeUsernameProblemLanguageResultExecution timeMemory
50882mirbek01Gondola (IOI14_gondola)C++17
100 / 100
38 ms12196 KiB
#include "gondola.h"
#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 2;

int valid(int n, int inputSeq[])
{
      vector <pair <int, int> > v;
      for(int i = 0; i < n; i ++)
            if(inputSeq[i] <= n)
                  v.push_back({inputSeq[i], i + 1});
      sort(v.begin(), v.end());
      for(int i = 1; i < v.size(); i ++){
            int ab = v[i].first - v[i - 1].first, ds;
            if(v[i].second > v[i - 1].second){
                  ds = v[i].second - v[i - 1].second;
            } else {
                  ds = v[i].second + (n - v[i - 1].second);
            }
            if(ds != ab) return 0;
      }
      sort(inputSeq, inputSeq + n);
      for(int i = 1; i < n; i ++){
            if(inputSeq[i] == inputSeq[i - 1]) return 0;
      }
      return 1;
}

//----------------------

int used[N];

int replacement(int n, int gondolaSeq[], int rp[])
{
      int pos = 1, mx = 0, sz = 0, id = 0;
      vector <int> v, nm(n);
      vector < pair <int, int> > d;
      for(int i = 0; i < n; i ++){
            mx = max(mx, gondolaSeq[i]);
            used[gondolaSeq[i]] = 1;
            if(gondolaSeq[i] > n){
                  d.push_back({gondolaSeq[i], i});
            }
            else
                  pos = gondolaSeq[i], id = i;
      }
      for(int i = n + 1; i <= mx; i ++){
            if(!used[i])
                  v.push_back(i);
      }
      for(int i = 0; i < n; i ++){
            nm[id] = pos;
            pos ++;
            id ++;
            if(pos > n) pos = 1;
            if(id >= n) id = 0;
      }
      sort(d.begin(), d.end());
      int cur = n + 1;
      for(int i = 0; i < d.size(); i ++){
            int ps = nm[d[i].second];
            rp[sz ++] = ps;
            while(cur < d[i].first){
                  if(!used[cur])
                        rp[sz ++] = cur;
                  cur ++;
            }
      }
      return sz;
}

//----------------------

const int mod = 1e9 + 9;

int bp(int a, int n){
      long long res = 1;
      while(n){
            if(n & 1)
                  res = (res * 1ll * a) % mod;
            a = (a * 1ll * a) % mod;
            n >>= 1;
      }
      return res;
}

int countReplacement(int n, int inputSeq[])
{
      if(!valid(n, inputSeq)) return 0;
      long long ans;
      vector <int> v;
      for(int i = 0; i < n; i ++){
            if(inputSeq[i] > n) v.push_back(inputSeq[i]);
      }
      ans = (v.size() == n)?n:1;
      sort(v.begin(), v.end());
      int l = n + 1;
      for(int i = 0; i < v.size(); i ++){
            ans = (ans * bp(v.size() - i, v[i] - l)) % mod;
            l = v[i] + 1;
      }
      return ans;
}

Compilation message (stderr)

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:14:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for(int i = 1; i < v.size(); i ++){
                      ~~^~~~~~~~~~
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:61:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for(int i = 0; i < d.size(); i ++){
                      ~~^~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:96:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       ans = (v.size() == n)?n:1;
              ~~~~~~~~~^~~~
gondola.cpp:99:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for(int i = 0; i < v.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...