제출 #308401

#제출 시각아이디문제언어결과실행 시간메모리
308401talant117408곤돌라 (IOI14_gondola)C++17
90 / 100
24 ms3968 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) (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;
    vector <int> vis(250007);
    
    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 <ll> bigger;
    for(ll i = 0; i < n; i++){
        if(gon[i] > n){
            bigger.pb(gon[i]);
        }
    }
    sort(all(bigger));
    
    ll 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;
    }
    if(sz(bigger) == n) res = mult(res, n);
    return res;
}

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

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:136:19: warning: comparison of integer expressions of different signedness: 'std::vector<long long int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  136 |     if(sz(bigger) == n) res = mult(res, 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...