제출 #308407

#제출 시각아이디문제언어결과실행 시간메모리
308407talant117408곤돌라 (IOI14_gondola)C++17
75 / 100
66 ms4600 KiB
#include "gondola.h"
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef pair <int, int> pii;
 
#define precision(n) fixed << setprecision(n)
#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define mp make_pair
#define eps (double)1e-9
#define PI 2*acos(0.0)
#define endl "\n"
#define sz(v) int((v).size())
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define do_not_disturb ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);

const ll mod = 1e9+9;

ll mult(ll a, ll b){
    a = ((a%mod)+mod)%mod;
    b = ((b%mod)+mod)%mod;
    return (a*b)%mod;
}

ll binpow(ll a, ll b){
    ll res = 1;
    while(b){
        if(b&1) res = mult(res, a);
        a = mult(a, a);
        b >>= 1;
    }
    return res;
}

int valid(int n, int s[]){
    int in = -1, flag = 1, i;
    map <int, int> vis;
    
    for(i = 0; i < n; i++){
        if(vis[s[i]]){ 
            flag--; 
            break; 
        }
        vis[s[i]]++;
        
        if(in == -1 && s[i] <= n){ 
            in = s[i]; 
        }
        else if(s[i] <= n && in != s[i]){ 
            flag--; 
            break; 
        }
        
        in = (in == -1 ? in : (in+1 > n ? 1 : in+1));
    }
    
    return flag;
}

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

int replacement(int n, int gon[], int repl[]){
    int i, num = 0;
    
    vector <int> prev(n);
    iota(all(prev), 1);
    int in = -1, j;
    for(i = 0; i < n; i++){
        if(in == -1 && gon[i] <= n){
            in = gon[i];
            j = i;
            break;
        }
    }
    if(in != -1){
        for(i = j; i < n; i++){
            prev[i] = in;
            in = (in == n ? 1 : in+1);
        }
        for(i = 0; i < j; i++){
            prev[i] = in;
            in = (in == n ? 1 : in+1);
        }
    }
    
    vector <pii> bigger;
    for(i = 0; i < n; i++){
        if(gon[i] > n){
            bigger.pb({gon[i], i});
        }
    }
    
    int op = n;
    sort(all(bigger));
    
    for(auto to : bigger){
        for(j = op; j < to.first; j++){
            repl[num] = prev[to.second];
            num++;
            prev[to.second] = j+1;
        }
        op = to.first;
    }
    
    return num;
}

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

int countReplacement(int n, int gon[]){
    ll res = 1;
    if(!valid(n, gon)){
        return 0;
    }
    
    vector <int> bigger;
    for(int i = 0; i < n; i++){
        if(gon[i] > n){
            bigger.pb(gon[i]);
        }
    }
    sort(all(bigger));
    
    int prev = n;
    for(auto to : bigger){
        auto it = ub(all(bigger), prev)-bigger.begin();
        ll diff = to-prev-1;
        res = mult(res, binpow(ll(sz(bigger)-it), diff));
        prev = to;
    }
    
    return res*(sz(bigger) == n ? n : 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...