답안 #125230

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
125230 2019-07-04T21:24:36 Z khulegub 곤돌라 (IOI14_gondola) C++14
60 / 100
29 ms 2412 KB
#include "gondola.h"
#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define xx first
#define yy second
using namespace std;
typedef long long i64;
typedef pair<int, int> pii;
const i64 MOD = 1e9 + 7;



int valid(int n, int arr[]){
	vector<pii> rep;
	vector<pii> v;
	for (int i = 0; i < n; i++){
		arr[i]--;
		// cout << arr[i] << ' ';
		if (arr[i] >= n){
			rep.pb(mp(arr[i] - n, i) );
		}
		else v.pb(mp(i, arr[i]) );
	}
	if(v.size() > 0){
		int diff = v[0].yy - v[0].xx;
		int end = (n - 1) - diff;
		int diff2 = diff - n;
		// cout << diff2;
		int vn = v.size();
		for (int i = 0; i < vn; i++){
			if (v[i].xx <= end){
				if (v[i].yy - v[i].xx != diff) return 0;
			}
			else{
				if (v[i].yy - v[i].xx != diff2) return 0;
			}
		}
	}
	sort(rep.begin(), rep.end());
	for(int i = 0; i + 1 < rep.size(); i++){
		if(rep[i].xx == rep[i + 1].xx) return 0;
	}
	// cout << "veve";
	return 1;
}
//----------------------
 
int replacement(int n, int arr[], int repl[]){
	vector<pii> rep;
	vector<pii> v;
	for (int i = 0; i < n; i++){
		arr[i]--;
		if (arr[i] >= n){
			rep.pb( mp(arr[i] - n, i) );
		}
		else {
			v.pb( mp(i, arr[i]) );
		}
	}
	sort(rep.begin(), rep.end() );
	if(v.size() > 0){
		int diff = v[0].yy - v[0].xx;
		int end = (n - 1) - diff;
		int diff2 = diff - n;
		int repsz = 0;
		int last = 0;
		for(int i = 0; i < rep.size(); i++){
			for(int j = last; j <= rep[i].xx; j++){
				int tmp;
				if(j == last){
					if(rep[i].yy <= end) tmp = rep[i].yy + diff;
					else tmp = rep[i].yy + diff2;
				}
				else{
					tmp = n + j - 1;
				}
				tmp++;
				repl[j] = tmp;
				repsz++;
			}
			last = rep[i].xx + 1;
		}
		return repsz;
		// cout << diff2;
	}
	else{ //wtf evdreegu neg ch bdggu nasss
		int repsz = 0;
		int last = 0;
		for(int i = 0; i < rep.size(); i++){
			for(int j = last; j <= rep[i].xx; j++){
				int tmp;
				if(j == last){
					tmp = rep[i].yy;
				}
				else{
					tmp = n + j - 1;
				}
				tmp++;
				// cout << tmp << ' ';
				repl[j] = tmp;
				repsz++;
			}
			last = rep[i].xx + 1;
		}
		return repsz;
	}
}
 
//----------------------
i64 pow(i64 x, i64 zereg){
	if(zereg == 1) return x;
	i64 tmp = pow(x, zereg >> 1);
	if(zereg & 1) return (zereg * ((tmp * tmp) % MOD) ) % MOD;
	return ((tmp * tmp) % MOD);
}
int countReplacement(int n, int arr[]){
	if(!valid(n, arr)) return 0; //sha
	vector<int> rep;
	i64 res = 1;
	for (int i = 0; i < n; i++){
		if(arr[i] > n) rep.pb(arr[i]);
	}
	if(rep.size() == n) res = rep.size();
	if(rep.size() == 0) return 1; //yu ch evdreegue
	int cnt = rep.size();
	int lst = n;
	sort(rep.begin(), rep.end());
	for (int i = 0; i < rep.size(); i++) {
		res *= pow(cnt * 1LL, rep[i] - lst - 1);
		lst = rep[i];
		res %= MOD;
		cnt--;
	}
	return res;
}

Compilation message

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:41:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i + 1 < rep.size(); i++){
                 ~~~~~~^~~~~~~~~~~~
gondola.cpp: In function 'int replacement(int, int*, int*)':
gondola.cpp:68:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < rep.size(); i++){
                  ~~^~~~~~~~~~~~
gondola.cpp:90:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i = 0; i < rep.size(); i++){
                  ~~^~~~~~~~~~~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:124:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(rep.size() == n) res = rep.size();
     ~~~~~~~~~~~^~~~
gondola.cpp:129:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < rep.size(); i++) {
                  ~~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 256 KB Output is correct
3 Correct 2 ms 256 KB Output is correct
4 Correct 2 ms 252 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 256 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 256 KB Output is correct
5 Correct 2 ms 396 KB Output is correct
6 Correct 7 ms 1268 KB Output is correct
7 Correct 29 ms 2412 KB Output is correct
8 Correct 13 ms 2160 KB Output is correct
9 Correct 5 ms 1016 KB Output is correct
10 Correct 14 ms 2288 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 380 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Correct 7 ms 1268 KB Output is correct
7 Correct 15 ms 2288 KB Output is correct
8 Correct 12 ms 2160 KB Output is correct
9 Correct 6 ms 1016 KB Output is correct
10 Correct 14 ms 2288 KB Output is correct
11 Correct 2 ms 376 KB Output is correct
12 Correct 2 ms 376 KB Output is correct
13 Correct 9 ms 1396 KB Output is correct
14 Correct 2 ms 376 KB Output is correct
15 Correct 17 ms 2032 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 256 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 256 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
7 Correct 2 ms 376 KB Output is correct
8 Correct 4 ms 380 KB Output is correct
9 Correct 2 ms 376 KB Output is correct
10 Correct 3 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 376 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
7 Correct 2 ms 376 KB Output is correct
8 Correct 2 ms 376 KB Output is correct
9 Correct 2 ms 376 KB Output is correct
10 Correct 2 ms 376 KB Output is correct
11 Correct 13 ms 2288 KB Output is correct
12 Correct 16 ms 2288 KB Output is correct
13 Correct 17 ms 1536 KB Output is correct
14 Correct 13 ms 2284 KB Output is correct
15 Correct 25 ms 2404 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 504 KB Output is correct
3 Correct 2 ms 252 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 504 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 256 KB Output is correct
5 Incorrect 2 ms 376 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 376 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Incorrect 2 ms 376 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 484 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Incorrect 2 ms 256 KB Output isn't correct
6 Halted 0 ms 0 KB -