제출 #1321571

#제출 시각아이디문제언어결과실행 시간메모리
1321571orgiloogii곤돌라 (IOI14_gondola)C++20
60 / 100
39 ms5248 KiB
#include "gondola.h"
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int valid(int n, int g[]) {
	int idx = -1;
	map <int, bool> vis;
	for (int i = 0;i < n;i++) {
		if (vis[g[i]] == true) return 0;
		vis[g[i]] = true;
		if (g[i] <= n && idx == -1) {
			idx = i;
		}
	}
	if (idx == -1) return 1;
	int cnt = g[idx];
	for (int i = idx + 1;;i++) {
		i %= n;
		if (i == idx) break;
		cnt %= n;
		cnt++;
		if (g[i] <= n && g[i] != cnt) return 0;
	}
	return 1;
}

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

int replacement(int n, int g[], int r[]) {
    int idx = -1;
	map <int, bool> vis;
	int mx = 0;
	for (int i = 0;i < n;i++) {
		if (vis[g[i]] == true) return 0;
		vis[g[i]] = true;
		if (g[i] <= n && idx == -1) {
			idx = i;
		}
		mx = max(mx, g[i]);
	}
	int sz = 0;
	int exp[n] = {0};
	if (idx == -1) {
		exp[0] = 1;
		int cnt = 1;
		for (int i = 1;;i++) {
			i %= n;
			if (i == 0) break;
			cnt %= n;
			cnt++;
			exp[i] = cnt;
		}
	}
	else {
		exp[idx] = g[idx];
		int cnt = g[idx];
		for (int i = idx + 1;;i++) {
			i %= n;
			if (i == idx) break;
			cnt %= n;
			cnt++;
			exp[i] = cnt;
		}
	}
	// for (int i = 0;i < n;i++) {
	// 	cout << exp[i] << ' ';
	// }
	// cout << endl;
	vector <pair <int, int>> upd;
	for (int i = 0;i < n;i++) {
		if (exp[i] != g[i]) {
			upd.push_back({g[i], exp[i]});
		}
	}
	sort(upd.begin(), upd.end());
	for (auto [x, y] : upd) {
		r[sz] = y;
		sz++;
		for (int i = n + sz;i < x;i++) {
			r[sz] = i;
			sz++;
		}
	}
	return mx - n;
}
const int mod = 1e9 + 9;

int poww(int x, int y) {
    ll res = 1;
    x = x % mod;
    while (y > 0) {
        if (y % 2 == 1) {
            res = 1LL * res * x % mod;
        }
        x = 1LL * x * x % mod;
        y /= 2;
    }
    res = 1LL * res * x % mod;
    return res;
}

int countReplacement(int n, int g[]) {
	if (!valid(n, g)) {
		return 0;
	}
	ll mult = n;
	vector <ll> saves;
	for (int i = 0;i < n;i++) {
		if (g[i] > n) {
			saves.push_back(g[i]);
		}
		if (g[i] <= n) {
			mult = 1;
		}
	}

	sort(saves.begin(), saves.end());
	ll curr = n;
	int sz = saves.size();
	ll res = 1;
	for (int i = 0;i < saves.size();i++) {
		int iter = saves[i] - curr - 1;
		if (iter == 0) {
			sz--;
            curr = saves[i];
			continue;
		}
		res = (res * poww(sz, iter)) % mod;
		sz--;
		curr = saves[i];
	}
	return (res * mult) % mod;
}
#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...