제출 #396825

#제출 시각아이디문제언어결과실행 시간메모리
396825ly20곤돌라 (IOI14_gondola)C++17
60 / 100
62 ms5100 KiB
#include "gondola.h"
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e9 + 7;
int valid(int n, int seq[])
{
    bool vl = true;
    int id0 = n;
    map <int, int> freq;
    for(int i = 0; i < n; i++) {
        freq[seq[i]]++;
        if(freq[seq[i]] > 1) vl = false;
        if(seq[i] > n) continue;
        if(id0 == n) {
            id0 = (seq[i] - i + n) % n;
        }
        else {
            if(id0 != (seq[i] - i + n) % n) vl = false;
        }
    }
    if(vl) return 1;
    else return 0;
}

//----------------------
int vor[112345];
int replacement(int n, int seq[], int resp[])
{
    int ch = 0;
    for(int i = 0; i < n; i++) {
        if(seq[i] <= n && ch == 0) {
            ch = 1;
            int at = i;
            int cur = seq[i] - 1;
            while(vor[at] == 0) {
                vor[at] = cur + 1;
                cur++;
                at++;
                cur %= n;
                at %= n;
            }
        }
    }
    if(ch == 0) {
        for(int i = 0; i < n; i++) {
            vor[i] = i + 1;
        }
    }
    vector <pair <int, int> > mx;
    for(int i = 0; i < n; i++) {
        if(seq[i] > n) mx.push_back(make_pair(seq[i], i));
    }
    sort(mx.begin(), mx.end());
    int fim = n + 1;
    vector <int> rs;
    for(int i = 0; i < mx.size(); i++) {
        while(fim <= mx[i].first) {
            int id = mx[i].second;
            rs.push_back(vor[id]);
            vor[id] = fim;
            fim++;
        }
    }
    for(int i = 0; i < rs.size(); i++) {
        resp[i] = rs[i];
    }
    return rs.size();
}

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

long long fexp(long long n, int t) {
    long long at = 1;
    for(int i = 31; i >= 0; i--) {
        at = at * at;
        at %= MOD;
        if((1 << i) & t) {
            at *= n;
            at %= MOD;
        }
    }
    return at;
}
int countReplacement(int n, int seq[])
{
    if(!valid(n, seq)) return 0;
    long long resp = 1;
    vector <int> rp;
    for(int i = 0; i < n; i++) {
        if(seq[i] > n) rp.push_back(seq[i]);
    }
    int av = rp.size();
    int ls = n + 1;
    sort(rp.begin(), rp.end());
    for(int i = 0; i < rp.size(); i++) {
        //printf("%d %d %d\n", rp[i], ls, av);
        resp = resp * fexp(av, rp[i] - ls);
        //  printf("%lld\n", fexp(rp[i] - ls, av));
        resp %= MOD;
        av--;
        ls = rp[i] + 1;
    }
    if(rp.size() == n) resp = (resp * n) % MOD;
    return resp;
}
/*int v[1123456];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%d",&v[i]);
	printf("%d\n",countReplacement(n,v));
	return 0;
}
*/

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

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:56:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |     for(int i = 0; i < mx.size(); i++) {
      |                    ~~^~~~~~~~~~~
gondola.cpp:64:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |     for(int i = 0; i < rs.size(); i++) {
      |                    ~~^~~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:95:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |     for(int i = 0; i < rp.size(); i++) {
      |                    ~~^~~~~~~~~~~
gondola.cpp:103:18: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  103 |     if(rp.size() == n) resp = (resp * n) % MOD;
      |        ~~~~~~~~~~^~~~
#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...