제출 #164474

#제출 시각아이디문제언어결과실행 시간메모리
164474dantoh000Gondola (IOI14_gondola)C++14
100 / 100
78 ms8808 KiB
#include "gondola.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1000000009;
ll exp(int a, int x){
    if (x == 0) return 1ll;
    ll p = exp(a,x/2);
    p *= p;
    p %= mod;
    if (x & 1) p *= a;
    p %= mod;
    return p;
}
int valid(int n, int inputSeq[]) {
    int anchor[n];
    unordered_set<int> s;
    int last = -1;
    for (int i = 0; i < n; i++){
        s.insert(inputSeq[i]);
        if (inputSeq[i] > n) continue;
        anchor[i] = (i+n-inputSeq[i])%n;
        //printf("%d ",anchor[i]);
        if (last == -1){
            last = anchor[i];
        }
        else{
            if (last != anchor[i]) return 0;
        }
    }
    if (s.size() != n) return 0;
    return 1;
}

int replacement(int n, int gondolaSeq[], int replacementSeq[]) {
    int l = 0;
    int maxpos = 1;
    unordered_map<int,int> pos;
    for (int i = 0; i < n; i++){
        if (gondolaSeq[maxpos-1] < gondolaSeq[i]) maxpos = i+1;
    }
    l = gondolaSeq[maxpos-1] - n;
    int curseq[n];
    bool can = false;
    for (int i = 0; i < n; i++){
        pos[gondolaSeq[i]] = i+1;
        if (gondolaSeq[i] <= n){
            can = true;
            curseq[i] = gondolaSeq[i];
        }
        else curseq[i] = (curseq[(n+i-1)%n]) % n +1 ;
    }
    for (int i = 0; i < n; i++){
        if (can) curseq[i] = (curseq[(n+i-1)%n]) % n + 1;
        else curseq[i] = i+1;
        pos[curseq[i]] = i+1;
        //printf("%d ",curseq[i]);
    }
    for (int i = 0; i < l; i++){
        if (pos[i+n+1] == 0) pos[i+n+1] = maxpos;
        //printf("replacing %d %d\n",i+n+1,pos[i+n+1]);
        replacementSeq[i] = curseq[pos[i+n+1]-1];
        curseq[pos[i+n+1]-1] = i+n+1;
        pos[replacementSeq[i]] = pos[i+n+1];
    }
    return l;
}

int countReplacement(int n, int inputSeq[]) {
    if (!valid(n,inputSeq)) return 0;
    int mx = *max_element(inputSeq,inputSeq+n);
    ll ans = 1;
    int ct = n;
    vector<int> v;
    for (int i = 0; i < n; i++){
        if (inputSeq[i] <= n) ct--;
        else v.push_back(inputSeq[i]);
    }
    if (ct == n) ans = n;
    v.push_back(n);
    sort(v.begin(),v.end());
    for (int i = 1; i < (int)v.size(); i++){
        ans *= exp(ct,v[i]-v[i-1]-1);
        ans %= mod;
        ct--;
    }
    return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:31:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if (s.size() != n) return 0;
         ~~~~~~~~~^~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:71:9: warning: unused variable 'mx' [-Wunused-variable]
     int mx = *max_element(inputSeq,inputSeq+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...