Submission #1182638

#TimeUsernameProblemLanguageResultExecution timeMemory
1182638sano곤돌라 (IOI14_gondola)C++20
100 / 100
35 ms6336 KiB
//#pragma GCC optimize("O3")
//#pragma GCC target("tune=native")
//#pragma GCC optimize("O3,unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#include "gondola.h"
#include<iostream>
#include<vector>
#include<queue>
#include<deque>
#include<string>
#include<fstream>
#include<algorithm>
#include <iomanip>
#include<map>
#include <set>
#include <unordered_map>
#include <stack>
#include <unordered_set>
#include <cmath>
#include <cstdint>
#include <cassert>
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>

#define shit short int
#define ll long long
//#define int ll
#define For(i, n) for(int i = 0; i < (int)n; i++)
#define ffor(i, a, n) for(int i = (int)a; i < (int)n; i++)
#define rfor(i, n) for(int i = (int)n; i >= (int)0; i--)
#define rffor(i, a, n) for(int i = (int)n; i >= (int)a; i--)
#define vec vector
#define ff first
#define ss second
#define pb push_back
#define pii pair<int, int>
#define NEK 2000000000
#define mod 1000000009
#define mod2 1000000009
#define rsz resize
#define prv1 43
#define prv2 47
#define D 8
#define trav(a,x) for (auto& a: x)
#define pb push_back
#define ub upper_bound
#define lb lower_bound
#define all(x) (x).begin(), (x).end()
#define sig 0.0000001

using namespace std;
//using namespace __gnu_pbds;

//template <typename T1, typename T2>
//using indexed_set = tree<pair<T1, T2>, null_type, less<pair<T1, T2>>, rb_tree_tag, tree_order_statistics_node_update>;

int valid(int n, int p1[]) {
	vec<ll> p;
	ll minipoz = 0;
	set<ll> je;
	For(i, n) {
		if (p1[i] < p1[minipoz]) minipoz = i;
		je.insert(p1[i]);
	}
	if (je.size() != n) return 0;
	ffor(i, minipoz, n) {
		p.push_back(p1[i]);
	}
	For(i, minipoz) {
		p.push_back(p1[i]);
	}
	ll prv = p[0];
	if (prv > n) return 1;
	For(i, n) {
		if (p[i] > n) continue;
		if (p[i] != prv + i) {
			return 0;
		}
	}
	return 1;
}

int replacement(int n, int p1[], int r1[]) {
	vec<int> p;
	int minipoz = 0;
	For(i, n) {
		if (p1[i] < p1[minipoz]) minipoz = i;
	}
	ffor(i, minipoz, n) {
		p.push_back(p1[i]);
	}
	For(i, minipoz) {
		p.push_back(p1[i]);
	}
	int prv = p[0];
	vec<pii> d;
	For(i, n) {
		if (p[i] <= n) continue;
		d.push_back({ p[i], (i + prv - 1) % n + 1 });
	}
	sort(all(d));

	int som = 0;
	For(i, d.size()) {
		r1[som] = d[i].ss;
		som++;
		while (som + n + 1 <= d[i].ff) {
			r1[som] = n + som;
			som++;
		}
	}
	return som;
}

ll umocni(ll a, ll b) {
	ll vys = 1;
	while (b) {
		if (b % 2 == 1) {
			vys *= a;
			vys %= mod;
		}
		a *= a;
		a %= mod;
		b /= 2;
	}
	return vys;
}

int countReplacement(int n, int p1[]) {
	int mojo = valid(n, p1);
	if (mojo == 0) return 0;
	vec<ll> d;
	For(i, n) {
		if (p1[i] <= n) continue;
		d.push_back(p1[i]);
	}
	sort(all(d));
	int k = 1;
	if (d.size() == n) {
		k = n;
	}
	sort(all(d));
	ll pr = n + 1;
	ll vys = 1;
	ll disize = d.size();
	For(i, d.size()) {
		ll mozem = (d[i] - pr);
		mozem %= mod;
		vys *= umocni(disize - i, mozem);
		vys %= mod;
		pr = d[i] + 1;
	}
	return (vys * k) % mod;
}

/*
signed main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int t;
	t = 1;
	For(i, t) {
		int n; cin >> n;
		int p[100];
		For(i, n) cin >> p[i];
		cout << countReplacement(n, p) << '\n';
	}
	return 0;
}*/
#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...