제출 #428600

#제출 시각아이디문제언어결과실행 시간메모리
428600markthitrin곤돌라 (IOI14_gondola)C++14
75 / 100
68 ms4844 KiB
#include "gondola.h"
#include <map>
#include <queue>
#include <algorithm>
#include <iostream>
class name {
public:
    int value;
    int base;
    bool operator<(const name& b) const{
        return value > b.value;
    }
    void operator=(const name& b){
        value = b.value;
        base = b.base;
    }
}put_in;
int mod = 1000000009;
int valid(int n, int inputSeq[])
{
    std::map<int,bool> g;
    int max = 0;
    int find_min = 2000000000;
    int min_pos = 0;
    for(int q = 0 ;q<n;q++){
        if(g[inputSeq[q]])
            return 0;
        g[inputSeq[q]] = true;
        if(find_min > inputSeq[q]){
            find_min = inputSeq[q];
            min_pos = q;
        }
    }
    if(find_min > n)
        return 1;
    int last_pos = min_pos - find_min;
    for(int q = min_pos;q < min_pos + n;q++){
        if(max < inputSeq[q % n] && inputSeq[q % n] <= n){
            if(inputSeq[q % n] - max != q - last_pos)
                return 0;
            max = inputSeq[q % n];
            inputSeq[q % n] = 2000000000;
            last_pos = q;
        }
    }
    for(int q = 0 ;q<n;q++){
        if(inputSeq[q] <= n)
        return 0;
    }
    return 1;
}

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

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
    std::priority_queue<name> g;
    int max = 0;
    for(int q = 0 ;q<n;q++){
        max = std::max(max,gondolaSeq[q]);
    }
    int find_min = 2000000000;
    int min_pos;
    for(int q = 0 ;q<n;q++){
        if(find_min > gondolaSeq[q]){
            find_min = gondolaSeq[q];
            min_pos = q;
        }
    }
    if(find_min > n)
        min_pos = 0;
    else {
        min_pos -= find_min - 1;
        if(min_pos < 0) min_pos += n;
    }
    for(int q = min_pos;q<min_pos + n;q++){
        put_in.value = gondolaSeq[q % n];
        put_in.base = q + 1 - min_pos;
        g.push(put_in);
    }
    int cnt = 0;
    int last_value = n;
    while(!g.empty()){
        put_in = g.top();
        g.pop();
        if(put_in.value <= n)
            continue;
        replacementSeq[cnt++] = put_in.base;
        for(int q = last_value + 1;q<put_in.value;q++){
            replacementSeq[cnt++] = q;
        }
        last_value = put_in.value;
    }
    return cnt;
}

//----------------------
bool valid_g(std::vector<int> inputSeq){
    int n = inputSeq.size();
    std::map<int,bool> g;
    int max = 0;
    int find_min = 2000000000;
    int min_pos = 0;
    for(int q = 0 ;q<n;q++){
        if(g[inputSeq[q]])
            return false;
        g[inputSeq[q]] = true;
        if(find_min > inputSeq[q]){
            find_min = inputSeq[q];
            min_pos = q;
        }
    }
    if(find_min > n)
        return false;
    int last_pos = min_pos - find_min;
    for(int q = min_pos;q < min_pos + n;q++){
        if(max < inputSeq[q % n] && inputSeq[q % n] <= n){
            if(inputSeq[q % n] - max != q - last_pos)
                return false;
            max = inputSeq[q % n];
            inputSeq[q % n] = 2000000000;
            last_pos = q;
        }
    }
    for(int q = 0 ;q<n;q++){
        if(inputSeq[q] <= n)
        return false;
    }
    return true;
}
long long power(long long a,int number){
    if(number == 0)
        return 1;
    if(number == 1)
        return a;
    long long ans = 1;
    if(number% 2)
        ans *= a;
    ans %= mod;
    ans *= power(a,number/2);
    ans%= mod;
    ans*= power(a,number/2);
    ans%=mod;
    return ans;
}
int countReplacement(int n, int inputSeq[])
{
    std::vector<int> copy;
    for(int q = 0 ;q<n;q++){
        copy.push_back(inputSeq[q]);
    }
    if(!valid_g(copy))
        return 0;
    long long ans = 1;
    std::vector<int> h;
    for(int q = 0 ;q<n;q++){
        if(inputSeq[q] > n)
        h.push_back(inputSeq[q]);
    }
    if(h.size() == 0)
        return 1;
    std::sort(h.begin(),h.end());
    int last_value = n;
    int cnt =0;
    while(h.size() != cnt) {
        ans *= power(h.size() - cnt,h[cnt] - last_value - 1);
        ans %= mod;
        last_value = h[cnt];
        cnt++;
    }
    ans %= mod;
    if(ans < 0)
        while(true){
        
        }
    return int(ans);
}

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

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:165:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  165 |     while(h.size() != cnt) {
      |           ~~~~~~~~~^~~~~~
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:73:17: warning: 'min_pos' may be used uninitialized in this function [-Wmaybe-uninitialized]
   73 |         min_pos -= find_min - 1;
      |         ~~~~~~~~^~~~~~~~~~~~~~~
#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...