Submission #250675

#TimeUsernameProblemLanguageResultExecution timeMemory
250675hhh07Gondola (IOI14_gondola)C++14
60 / 100
22 ms4352 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <utility>
#include <set>
#include <cmath>
#include <climits>
#include <cstring>
#include <stdio.h>
#include <assert.h>
#include "gondola.h"
 
using namespace std;
 
typedef long long ll;
typedef vector<ll> vi;
typedef pair<ll, ll> ii;

ll MOD = 1e9 + 9;

ll stepen(int x, int st){
    ll res = 1;
    for (int i = 1; i <= st; i++){
        res *= x;
        res %= MOD;
        if (i*2 <= st){
            i *= 2;
            res *= res;
            res %= MOD;
        }
        else{
            res *= stepen(x, st - i);
            res %= MOD;
            break;
        }
    }
    return res;
}

int valid(int n, int x[]){
    int j = -1;
    for (int i = 0; i < n; i++){
        if (x[i] > n)
            continue;
        j = i;
        break;
    }
    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] + (i - j);
            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] + (i - j);
            if (moze > n)
                moze -= n;
            x[i] = moze;
        }
    }
    vi res;
    vi a(250001, 0);
    for (int i = 0; i < t.size(); i++)
        a[x[t[i].second]] = true;
    for (int i = 0; i < t.size(); i++){
        int curr = t[i].first, idx = t[i].second;
        res.push_back(x[idx]);
        for (int j = x[idx] + 1; j <= curr; j++){
            if (!visited[j] && !a[j])
                res.push_back(j);
            visited[j] = true;
        }
        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;
    vi t;
    for (int i = 0; i < n; i++)
        if (x[i] > n)
            t.push_back(x[i]);

    sort(t.begin(), t.end());
    ll res = 1;
    int prev = n;
    for (int i = 0; i < t.size(); i++){
        res *= stepen(t.size() - i, t[i] - prev - 1);
        res = res%MOD;
        prev = t[i];
    }
    if (t.size() == n){
        res *= n;
        res = res%MOD;
    }
    return res;
}

Compilation message (stderr)

gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:103:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < t.size(); i++)
                     ~~^~~~~~~~~~
gondola.cpp:105:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < t.size(); i++){
                     ~~^~~~~~~~~~
gondola.cpp:115: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:133:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < t.size(); i++){
                     ~~^~~~~~~~~~
gondola.cpp:138:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if (t.size() == n){
         ~~~~~~~~~^~~~
#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...