답안 #250630

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
250630 2020-07-18T14:41:57 Z hhh07 곤돌라 (IOI14_gondola) C++14
5 / 100
6 ms 1788 KB
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <utility>
#include <set>
#include <cmath>
#include <climits>
#include <cstring>
#include "gondola.h"
 
using namespace std;
 
typedef long long ll;
typedef vector<int> vi;
typedef pair<ll, ll> ii;
 
ll MOD = 1e9 + 7;
int valid(int n, int x[]){
    int j = -1;
    for (int i = 0; i < n; i++){
        if (x[i] > n)
            continue;
        j = i;
        break;
    }
    if (j == -1)
        return true;
    vector<bool> visited(250001, 0);
    for (int i = 0; i < n; i++){
        if (visited[x[i]])
            return false;
        visited[x[i]] = true;
        if (j > i){
            int moze = x[j] - (j - i);
            if (moze < 1)
                moze += n;
            if (x[i] <= n && moze != x[i]){
                return false;
            }
        }
        else{
            int moze = x[j] + (j - i);
            if (moze > n)
                moze -= n;
            if (x[i] <= n && moze != x[i]){
                return false;
            }
        }
    }
    return true;
}

int replacement(int n, int x[], int y[]){
    vector<ii> t;
    vi visited(250001, false);
    int j = 0;
    for (int i = 0; i < n; i++){
        visited[x[i]] = true;
        if (x[i] > n)
            t.push_back(make_pair(x[i], i));
        else
            j = i;
    }
    
    sort(t.begin(), t.end());
    for (int i = 0; i < n; i++){
        if (j > i){
            int moze = x[j] - (j - i);
            if (moze < 1)
                moze += n;
            x[i] = moze;
        }
        else{
            int moze = x[j] + (j - i);
            if (moze > n)
                moze -= n;
            x[i] = moze;
        }
    }
    vi res;
    for (int i = 0; i < t.size(); i++){
        int curr = t[i].first, idx = t[i].second;
        for (int j = x[idx]; j <= curr; j++){
            if (!visited[j])
                res.push_back(j);
        }
        visited[curr] = true;
    }
    for (int i = 0; i < res.size(); i++)
        y[i] = res[i];
    return res.size();
}


int countReplacement(int n, int x[]){
    bool k = valid(n, x);
    if (!k)
        return 0;
    vector<ii> t;
    int j = 0;
    for (int i = 0; i < n; i++){
        if (x[i] > n)
            t.push_back(make_pair(x[i], i));
        else
            j = i;
    }
    
    sort(t.begin(), t.end());
    for (int i = 0; i < n; i++){
        if (j > i){
            int moze = x[j] - (j - i);
            if (moze < 1)
                moze += n;
            x[i] = moze;
        }
        else{
            int moze = x[j] + (j - i);
            if (moze > n)
                moze -= n;
            x[i] = moze;
        }
    }
    ll res = 1;
    for (int i = 0; i < t.size(); i++){
        int curr = t[i].first, idx = t[i].second;
        for (int j = x[idx]; j <= curr; j++){
            res *= (t.size() - i);
            res %= MOD;
        }
    }
    return res;
}
/*
int gondolaSequence[100001];
int replacementSequence[250001];

int main()
{
  int i, n, tag;
  int nr;
  assert(scanf("%d", &tag)==1);
  assert(scanf("%d", &n)==1);
  for(i=0;i< n;i++)
    assert( scanf("%d", &gondolaSequence[i]) ==1);
  
  switch (tag){
  case 1: case 2: case 3:
    printf("%d\n", valid(n, gondolaSequence));
    break;

  case 4: case 5: case 6:
    nr = replacement(n, gondolaSequence, replacementSequence);
    printf("%d ", nr);
    if (nr > 0)
      {
    for (i=0; i<nr-1; i++)
      printf("%d ", replacementSequence[i]);
    printf("%d\n", replacementSequence[nr-1]);
      }
    else printf("\n");
    break;

  case 7: case 8: case 9: case 10:
    printf("%d\n",  countReplacement(n, gondolaSequence));
    break;
  }

  return 0;
}
*/

Compilation message

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:82:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < t.size(); i++){
                     ~~^~~~~~~~~~
gondola.cpp:90:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < res.size(); i++)
                     ~~^~~~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:125:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < t.size(); i++){
                     ~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1280 KB Output is correct
2 Correct 1 ms 1280 KB Output is correct
3 Correct 1 ms 1280 KB Output is correct
4 Correct 1 ms 1280 KB Output is correct
5 Correct 1 ms 1280 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1280 KB Output is correct
2 Correct 1 ms 1280 KB Output is correct
3 Correct 1 ms 1280 KB Output is correct
4 Correct 1 ms 1280 KB Output is correct
5 Correct 1 ms 1280 KB Output is correct
6 Correct 1 ms 1280 KB Output is correct
7 Incorrect 6 ms 1788 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 1280 KB Output is correct
2 Correct 1 ms 1280 KB Output is correct
3 Correct 1 ms 1280 KB Output is correct
4 Correct 1 ms 1280 KB Output is correct
5 Correct 1 ms 1280 KB Output is correct
6 Correct 1 ms 1280 KB Output is correct
7 Incorrect 6 ms 1788 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -