답안 #309341

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
309341 2020-10-03T08:39:59 Z jainbot27 곤돌라 (IOI14_gondola) C++17
100 / 100
35 ms 2552 KB
#include <bits/stdc++.h>
#ifndef ACMX
#include "gondola.h"
#endif
using namespace std;
 
#define f first
#define s second
#define pb push_back
#define ar array
#define all(x) x.begin(), x.end()
#define siz(x) (int)x.size()
 
#define FOR(x, y, z) for(int x = (y); x < (z); x++)
#define ROF(x, z, y) for(int x = (y-1); x >= (z); x--)
#define F0R(x, z) FOR(x, 0, z)
#define R0F(x, z) ROF(x, 0, z)
#define trav(x, y) for(auto&x:y)
 
using ll = long long;
using vi = vector<int>;
using vl = vector<long long>;
using pii = pair<int, int>;
using vpii = vector<pair<int, int>>;
 
template<class T> inline bool ckmin(T&a, T b) {return b < a ? a = b, 1 : 0;}
template<class T> inline bool ckmax(T&a, T b) {return b > a ? a = b, 1 : 0;}
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
 
const char nl = '\n';
const int mxN = 1e5 + 10;
const int MOD = 1'000'000'009;
const int mod = MOD;
const long long infLL = 1e18;
 
int32_t valid(int n, int* _inputSeq){
    vi inputSeq(n);
    F0R(i, n){
        inputSeq[i] = _inputSeq[i];
        inputSeq[i]--;
    }
    vi vals;
    F0R(i, n){
        vals.pb(inputSeq[i]);
    }
    sort(all(vals));
    vals.resize(unique(all(vals))-vals.begin());
    if(siz(vals)!=n) return 0;
    if(vals[0]>=n) return 1;
    int pos;
    F0R(i, n){
        if(inputSeq[i] <n){
            pos = i;
            break;
        }
    }
    int ff = inputSeq[pos];
    F0R(i, n){
        if(inputSeq[i]<n){
            int dif = i - pos;
            int should = (n + ff + dif)%n;
            if(inputSeq[i] != should) return 0;
        }
    }
    return 1;
}
int32_t replacement(int n, int _gondolaSeq[], int _replacementSeq[]){
    vi gs(n), rs;
    F0R(i, n){
        gs[i] = _gondolaSeq[i]-1;
    }
    int pos = 0, cnt = 0, mx = -1, sp, mxpos; 
    sp = 0;
    map<int, int> vals;
    F0R(i, n){
        if(ckmax(mx, gs[i])) mxpos = i;
        if(gs[i] < n){
            pos = i; 
            sp = gs[i];
            cnt++;
        }
    }
    if(cnt==n){
        return 0;
    }
    // cout << pos << " " <<  sp << endl;
    int foo;
    F0R(i, n){
        int dif = i - pos;
        int should=  (n + sp + dif) % n;
        // cout << i << " " << should << endl;
        if(mxpos==i){
            foo = should;
        }
        if(gs[i]<n&&gs[i]!=should) 
            assert(false);
        if(gs[i]==should)
            continue;
        vals[gs[i]]=should;     
    }
    int x = 0;
    // cout << mx << endl;
    FOR(i, n, mx+1){
        if(vals.find(i)!=vals.end()&&i!=mx){
            // cout << i << " " << vals[i] << endl;
            _replacementSeq[x] = vals[i]+1;
            x++;
            continue;
        }
        _replacementSeq[x] = foo+1;
        foo=i;
        x++;
        // cout<<i<<endl;
    }
    return x;
}
// modulo class
int fact[mxN];
int add(int x, int y){ x += y; while(x >= MOD) x -= MOD; while(x < 0) x += MOD; return x; } void ad(int &x, int y) {x = add(x, y);}
int sub(int x, int y){ x -= y; while(x >= MOD) x -= MOD; while(x < 0) x += MOD; return x; } void sb(int &x, int y) {x = sub(x, y);}
int mul(int x, int y){ return ((int64_t)x * (int64_t)y) % MOD; } void ml(int &x, int y) {x = mul(x, y);}
int binpow(int x, int y){ int z = 1; while(y > 0) { if(y % 2 == 1) z = mul(z, x); x = mul(x, x); y /= 2; } return z; }
int inv(int x){ return binpow(x, MOD - 2); }
int divide(int x, int y){ return mul(x, inv(y)); }
void precalc(){ fact[0] = 1; for(int i = 1; i < mxN; i++) fact[i] = mul(i, fact[i - 1]); }
int choose(int n, int k){ if(k > n) return 0; return divide(fact[n], mul(fact[n - k], fact[k])); }
 
long long x[1000001];
 
int countReplacement(int n, int inputSeq[])
{
    if(!valid(n, inputSeq)) return 0;
    sort(inputSeq, inputSeq + n);
    for(int i = 0 ; i < n; i++)
    x[i] = inputSeq[i];
    bool f=true;
    ll res=  1;
    for(int i = 0; i < n ; i++ ){
        if(x[i] > n){
            if(f){
                res = res*1ll*binpow((n- i), (x[i] - n - 1))%mod;
            }
            else{
                res = res*1ll*binpow((n- i), x[i] - x[i-1] - 1)%mod;
            }
            f=false;
        }
    }
    if(x[0] > n)
        res = res * 1ll * n % mod;
  return res;
}
 
// int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0);
 
//     int gondolaSeq[] = {7, 4, 7, 4};
//     int n = 4;
//     int ans =countReplacement(n, gondolaSeq);
//     cout << ans << nl;
//     return 0;
// }

Compilation message

gondola.cpp: In function 'int32_t replacement(int, int*, int*)':
gondola.cpp:110:33: warning: 'foo' may be used uninitialized in this function [-Wmaybe-uninitialized]
  110 |         _replacementSeq[x] = foo+1;
      |                              ~~~^~
gondola.cpp:92:9: warning: 'mxpos' may be used uninitialized in this function [-Wmaybe-uninitialized]
   92 |         if(mxpos==i){
      |         ^~
gondola.cpp: In function 'int32_t valid(int, int*)':
gondola.cpp:50:9: warning: 'pos' may be used uninitialized in this function [-Wmaybe-uninitialized]
   50 |     int pos;
      |         ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 1 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 9 ms 1024 KB Output is correct
7 Correct 20 ms 1660 KB Output is correct
8 Correct 15 ms 1532 KB Output is correct
9 Correct 6 ms 768 KB Output is correct
10 Correct 20 ms 1660 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 1 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 13 ms 1024 KB Output is correct
7 Correct 20 ms 1660 KB Output is correct
8 Correct 14 ms 1532 KB Output is correct
9 Correct 6 ms 768 KB Output is correct
10 Correct 21 ms 1660 KB Output is correct
11 Correct 0 ms 384 KB Output is correct
12 Correct 0 ms 384 KB Output is correct
13 Correct 9 ms 1024 KB Output is correct
14 Correct 1 ms 384 KB Output is correct
15 Correct 21 ms 1660 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 288 KB Output is correct
2 Correct 1 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 416 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Correct 1 ms 384 KB Output is correct
9 Correct 1 ms 384 KB Output is correct
10 Correct 1 ms 384 KB Output is correct
11 Correct 12 ms 896 KB Output is correct
12 Correct 13 ms 1024 KB Output is correct
13 Correct 29 ms 2552 KB Output is correct
14 Correct 12 ms 896 KB Output is correct
15 Correct 33 ms 2208 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 308 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 1 ms 384 KB Output is correct
7 Correct 0 ms 384 KB Output is correct
8 Correct 0 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 0 ms 384 KB Output is correct
6 Correct 0 ms 384 KB Output is correct
7 Correct 1 ms 384 KB Output is correct
8 Correct 0 ms 384 KB Output is correct
9 Correct 25 ms 1532 KB Output is correct
10 Correct 20 ms 1180 KB Output is correct
11 Correct 8 ms 808 KB Output is correct
12 Correct 10 ms 916 KB Output is correct
13 Correct 3 ms 512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
2 Correct 0 ms 384 KB Output is correct
3 Correct 0 ms 384 KB Output is correct
4 Correct 0 ms 384 KB Output is correct
5 Correct 1 ms 384 KB Output is correct
6 Correct 0 ms 384 KB Output is correct
7 Correct 0 ms 384 KB Output is correct
8 Correct 0 ms 384 KB Output is correct
9 Correct 27 ms 1532 KB Output is correct
10 Correct 21 ms 1280 KB Output is correct
11 Correct 8 ms 808 KB Output is correct
12 Correct 9 ms 916 KB Output is correct
13 Correct 3 ms 512 KB Output is correct
14 Correct 31 ms 1652 KB Output is correct
15 Correct 35 ms 1788 KB Output is correct
16 Correct 6 ms 696 KB Output is correct
17 Correct 23 ms 1280 KB Output is correct
18 Correct 13 ms 1016 KB Output is correct