제출 #46771

#제출 시각아이디문제언어결과실행 시간메모리
46771RayaBurong25_1곤돌라 (IOI14_gondola)C++17
100 / 100
88 ms7876 KiB
#include "gondola.h"
#include <vector>
#include <set>
#include <algorithm>
#include <stdio.h>
#define MOD 1000000009LL
int Vis[250005];
int valid(int n, int inputSeq[])
{
    int i, r = -1;
    for (i = 0; i < n; i++)
    {
        if (Vis[inputSeq[i]])
            return 0;
        Vis[inputSeq[i]] = 1;
        if (inputSeq[i] <= n)
        {
            if (r == -1)
                r = (inputSeq[i] + n - (i + 1))%n;
            else if ((inputSeq[i] + n - (i + 1))%n != r)
                return 0;
        }
    }
    return 1;
}

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

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
    int i, r = -1;
    for (i = 0; i < n; i++)
    {
        if (gondolaSeq[i] <= n)
        {
            if (r == -1)
            {
                r = (gondolaSeq[i] + n - (i + 1))%n;
                break;
            }
        }
    }
    if (r == -1)
        r = 0;
    std::vector<std::pair<int, int> > V;
    for (i = 0; i < n; i++)
    {
        if (gondolaSeq[i] > n)
        {
            V.push_back({gondolaSeq[i], i});
            gondolaSeq[i] = (i + r)%n + 1;
        }
    }
    if (V.size() == 0)
        return 0;
    std::sort(V.begin(), V.end());
    r = 0;
    int j = 0;
    for (i = n + 1; i <= V.back().first; i++)
    {
        replacementSeq[r] = gondolaSeq[V[j].second];
        gondolaSeq[V[j].second] = i;
        if (V[j].first == i)
            j++;
        r++;
    }
    return r;
}

//----------------------
long long pow(long long b, int e)
{
    // printf("pow %lld %d\n", b, e);
    if (e == 0)
        return 1LL;
    else if (e == 1)
        return b;
    else
    {
        long long r = pow(b, e/2);
        r = (r*r)%MOD;
        if (e%2)
            r = (r*b)%MOD;
        return r;
    }
}
int countReplacement(int n, int inputSeq[])
{
    int i, r = -1;
    std::set<int> S;
    for (i = 0; i < n; i++)
    {
        // printf("i%d\n", i);
        if (S.find(inputSeq[i]) != S.end())
            return 0;
        S.insert(inputSeq[i]);
        if (inputSeq[i] <= n)
        {
            if (r == -1)
                r = (inputSeq[i] + n - (i + 1))%n;
            else if ((inputSeq[i] + n - (i + 1))%n != r)
                return 0;
        }
    }
    // printf("r%d\n", r);
    std::vector<int> V;
    for (i = 0; i < n; i++)
    {
        if (inputSeq[i] > n)
        {
            V.push_back(inputSeq[i]);
        }
    }
    // printf("%d\n", V.size());
    if (V.size() == 0)
        return 1;
    std::sort(V.begin(), V.end());
    long long ans;
    if (V.size() == n)
        ans = n;
    else
        ans = 1LL;
    int j;
    for (j = 0; j < V.size(); j++)
    {
        if (j == 0)
            ans = (ans*pow((long long) V.size() - j, V[j] - n - 1))%MOD;
        else
            ans = (ans*pow((long long) V.size() - j, V[j] - V[j - 1] - 1))%MOD;
    }
    return (int) ans;
}

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

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:119:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if (V.size() == n)
         ~~~~~~~~~^~~~
gondola.cpp:124:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (j = 0; j < V.size(); j++)
                 ~~^~~~~~~~~~
#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...