제출 #43785

#제출 시각아이디문제언어결과실행 시간메모리
43785PowerOfNinjaGo곤돌라 (IOI14_gondola)C++14
100 / 100
37 ms2608 KiB
//Power Of Ninja Go
#include <bits/stdc++.h>
#ifdef atom
    #include "grader.cpp"
#else
    #include "gondola.h"
#endif
using namespace std;
typedef long long ll; typedef pair<int, int> ii;
#define X first
#define Y second
#define vi vector<int>
#define vii vector< ii >
#define pb push_back
int valid(int n, int arr[])
{
    for(int i = 0; i< n; i++) arr[i]--;
    vi vec;
    for(int i = 0; i< n; i++) vec.pb(arr[i]);
    sort(vec.begin(), vec.end()); vec.resize(unique(vec.begin(), vec.end())-vec.begin());
    if(vec.size() != n) return 0;
    vi tmp;
    for(int i = 0; i< n; i++) if(arr[i]< n) tmp.pb((arr[i]-i+n)%n);
    sort(tmp.begin(), tmp.end()); tmp.resize(unique(tmp.begin(), tmp.end())-tmp.begin());
    return (tmp.size()<= 1);
}
int replacement(int n, int arr[], int ans[])
{
    for(int i = 0; i< n; i++) arr[i]--;
    vi tmp;
    for(int i = 0; i< n; i++) if(arr[i]< n) tmp.pb((arr[i]-i+n)%n);
    sort(tmp.begin(), tmp.end()); tmp.resize(unique(tmp.begin(), tmp.end())-tmp.begin());
    int q = tmp.size();
    int st = q?tmp[0]:0;
    vii strange;
    for(int i = 0; i< n; i++) if(arr[i]>= n) strange.pb(ii(arr[i], (i+st)%n));
    sort(strange.begin(), strange.end());
    int ptr = 0;
    for(int i = 0; i< strange.size(); i++)
    {
        //printf("%d %d\n", strange[i].X, strange[i].Y);
        int prv = i?strange[i-1].X:n-1;
        int rounds = strange[i].X-prv;
        rounds--;
        ans[ptr++] = strange[i].Y+1;
        while(rounds--)
        {
            ans[ptr] = n+ptr;
            ptr++;
        }
    }
    return ptr;
}

//----------------------
const int md = 1e9+9;
int mul(int a, int b)
{
    return (1LL*a*b)%md;
}
int ninja(int a, int b)
{
    if(b == 0) return 1;
    int x = ninja(a, b/2);
    int y = mul(x, x);
    if(b%2) y = mul(y, a);
    return y;
}
int countReplacement(int n, int arr[])
{
    if(!valid(n, arr)) return 0;
    vi tmp;
    for(int i = 0; i< n; i++) if(arr[i]< n) tmp.pb((arr[i]-i+n)%n);
    sort(tmp.begin(), tmp.end()); tmp.resize(unique(tmp.begin(), tmp.end())-tmp.begin());
    int q = tmp.size();
    int st = q?tmp[0]:0;
    vii strange;
    for(int i = 0; i< n; i++) if(arr[i]>= n) strange.pb(ii(arr[i], (i+st)%n));
    sort(strange.begin(), strange.end());
    int ptr = 0;
    int res = 1;
    for(int i = 0; i< strange.size(); i++)
    {
        //printf("%d %d\n", strange[i].X, strange[i].Y);
        int prv = i?strange[i-1].X:n-1;
        int rounds = strange[i].X-prv;
        rounds--;
        //printf("pow %d %d\n", strange.size()-i, rounds);
        res = mul(res, ninja(strange.size()-i, rounds));
    }
    if(!q) res = mul(res, strange.size());
    return res;
}

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

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:21:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(vec.size() != n) return 0;
                   ^
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:39:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i< strange.size(); i++)
                     ^
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:82:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i< strange.size(); i++)
                     ^
gondola.cpp:80:9: warning: unused variable 'ptr' [-Wunused-variable]
     int ptr = 0;
         ^
#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...