Submission #446816

#TimeUsernameProblemLanguageResultExecution timeMemory
446816Deepesson곤돌라 (IOI14_gondola)C++17
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
#include <gondola.h>

int valid(int n, int inputSeq[])
{
    std::map<int,bool> existe;
    for(int i = 0;i!=n;++i){
        auto&x=inputSeq[i];
        if(existe[x]){
            return false;
        }
        existe[x]=true;
    }
    int ind = -1;
    int val=1e6;
    for(int i=0;i!=n;++i){
        if(inputSeq[i]<=n){
            if(inputSeq[i]<val){
                val=inputSeq[i];
                ind=i;
            }
        }
    }
    if(ind==-1)ind=0;
    if(val>n){return true;}
    int imaginario[n];
    int count = inputSeq[ind];
    if(ind==-1)count=0;
    for(int i=ind;i!=n;++i){
        imaginario[i]=count;
        ++count;
    }
    for(int i=0;i!=ind;++i){
        imaginario[i]=count;
        ++count;
    }
    for(int i=0;i!=n;++i) {
        if(inputSeq[i]>n)continue;
        if(inputSeq[i]!=imaginario[i]){return false;}
    }
    return true;

}

//----------------------
long long modpow(long long a,long long b){
    if(!b)return 1;
    const long long mod = 1e9+9;
    typedef std::pair<long long,long long> pll;
    std::vector<pll> vec;
    long long c = 1;
    long long val = a;
    vec.push_back({1,val});
    while(c<b){
        c*=2;
        val=(val*val)%mod;
        vec.push_back({c,val});
    }
    long long resp = 1;
    while(vec.size()){
        while(vec.back().first<=b){
            b-=vec.back().first;
            resp=(resp*vec.back().second)%mod;
        }
        vec.pop_back();
    }
    return resp;
}
int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
  int array[n];
  for(int i=0;i!=n;++i)
    array[i]=gondolaSeq[i];
  std::map<int,int> vec;
  int max=0;
  for(int i=0;i!=n;++i){
    if(array[i]>n){
        vec[array[i]]=i;
        max=std::max(max,array[i]);
    }
  }
  if(!max)return 0;
  int cursor=0;
  int ind = -1;
  int val=1e6;
  for(int i=0;i!=n;++i){
    if(array[i]<=n){
        if(array[i]<val){
            val=array[i];
            ind=i;
        }
    }
  }
  int imaginario[n];
  int count = array[ind];
  if(ind==-1){count=1;ind=0;}
  for(int i=ind;i!=n;++i){
    imaginario[i]=count%(n);
    if(!imaginario[i])imaginario[i]=n;
    ++count;
  }
  for(int i=0;i!=ind;++i){
    imaginario[i]=count%(n);
    if(!imaginario[i])imaginario[i]=n;
    ++count;
  }
  for(;;){
    int proxima_gondola = cursor+n+1;
    auto it = vec.find(proxima_gondola);
    if(it==vec.end()){
        int subs = vec.begin()->second;
        replacementSeq[cursor]=imaginario[subs];
        imaginario[subs]=proxima_gondola;
    }else {
        int subs = it->second;
        replacementSeq[cursor]=imaginario[subs];
        imaginario[subs]=proxima_gondola;
        vec.erase(it);
    }
    ++cursor;
    if(!vec.size())break;
  }
  return cursor;
}

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

int countReplacement(int n, int inputSeq[])
{
  if(!valid(n,inputSeq))return 0;
  int array[n];
  for(int i=0;i!=n;++i)
    array[i]=inputSeq[i];
  std::priority_queue<int,std::vector<int>,std::greater<int>> queue;
  int count=0;
  for(int i=0;i!=n;++i){
    if(array[i]>n){
        queue.push(array[i]);
        count++;
    }
  }
  int gondola = n+1;
  long long resp = 1;
  if(count==n)resp=n;
  const long long mod = 1e9+9;
  while(count){
    int proximo = queue.top();
    int movs = proximo-gondola;
    long long x = modpow(count,movs);
    gondola=queue.top()+1;
    queue.pop();
    resp=(resp*x)%mod;
    --count;
  }
  return resp;
}

int gondolaSequence[100001];
int replacementSequence[250001];

int main()
{
  int i, n, tag;
  int nr;
  assert(scanf("%d", &tag)==1);
  assert(scanf("%d", &n)==1);
  for(i=0;i< n;i++)
    assert( scanf("%d", &gondolaSequence[i]) ==1);

  switch (tag){
  case 1: case 2: case 3:
    printf("%d\n", valid(n, gondolaSequence));
    break;

  case 4: case 5: case 6:
    nr = replacement(n, gondolaSequence, replacementSequence);
    printf("%d ", nr);
    if (nr > 0)
      {
	for (i=0; i<nr-1; i++)
	  printf("%d ", replacementSequence[i]);
	printf("%d\n", replacementSequence[nr-1]);
      }
    else printf("\n");
    break;

  case 7: case 8: case 9: case 10:
    printf("%d\n",  countReplacement(n, gondolaSequence));
    break;
  }

  return 0;
}

Compilation message (stderr)

/usr/bin/ld: /tmp/ccDqdmrK.o: in function `main':
grader.cpp:(.text.startup+0x0): multiple definition of `main'; /tmp/ccZOR7qI.o:gondola.cpp:(.text.startup+0x0): first defined here
/usr/bin/ld: /tmp/ccDqdmrK.o:(.bss+0xf4260): multiple definition of `gondolaSequence'; /tmp/ccZOR7qI.o:(.bss+0xf4260): first defined here
/usr/bin/ld: /tmp/ccDqdmrK.o:(.bss+0x0): multiple definition of `replacementSequence'; /tmp/ccZOR7qI.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status