제출 #422317

#제출 시각아이디문제언어결과실행 시간메모리
422317dreezy곤돌라 (IOI14_gondola)C++17
60 / 100
27 ms2872 KiB
#include <bits/stdc++.h>
#include "gondola.h"
using namespace std;

/**********************/
#define ll long long
const int mod = 1e9 + 7;
int valid(int n, int inputSeq[])
{
	
	
	vector<bool> vis(2.5e5, 0);
	
	for(int i=0; i<n; i++){
		if(vis[inputSeq[i]]) return false;
		vis[inputSeq[i]] = true;
	}
	
	int preval = -1;
	for(int i =n -1; i>=0; i--){
		if(inputSeq[i] <=n){
			preval = (n - i) + inputSeq[i];
			if(preval> n) preval-=n;
			break;
		} 
			
	}
	
	if(preval == -1) return true;
	preval -=1;
	for(int i =0; i<n; i++){
		//cout << preval<<endl;		
		if(inputSeq[i] <=n){
			if(preval == n){
				if(inputSeq[i] != 1) return false;
			}
			else
				if(inputSeq[i]!= preval+1) return false;
			preval = inputSeq[i];
		}
		else{
			//replacement, num can be anything
			
			if(preval == n)
				preval = 1;
			else preval++;
		}
	}
	
	return true;
	
}

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

int replacement(int n, int gondolaSeq[], int replacementSeq[])
{
	//debug second subtask, something weird is wrong but i am close
	
	int preval = -1;
	for(int i =n -1; i>=0; i--){
		if(gondolaSeq[i] <=n){
			preval = (n - i) + gondolaSeq[i];
			if(preval> n) preval-=n;
			break;
		} 

			
	}
	set<pair<int,int>> replace;
	
	if(preval == -1){
		//all of them were replaced
		for(int i =  0; i<n; i++){
			replace.insert({gondolaSeq[i], i+1});
		}
	}
	else{
		preval-=1;
		//cout << preval<<endl;
		
		
		for(int i =0; i<n; i++){

			if(gondolaSeq[i] <=n){
				preval = gondolaSeq[i];
			}
			else{
				//replacement, num can be anything
				
				if(preval == n){
					replace.insert({gondolaSeq[i], 1});
					preval = 1;
					
				}
				else {
					replace.insert({gondolaSeq[i], ++preval});
				}
				
			}
		}
	}
	
	int cnt = 0;
	int prev = n;
	for(pair<int,int> a : replace){
		//cout <<a.first<<", "<<a.second<<endl;
		replacementSeq[cnt] = a.second;
		cnt++;
		
		
		for(int i = prev+1; i< a.first; i++){
			replacementSeq[cnt] = i;
			cnt++;
			
		}
		
		prev =  a.first;
		
	}
	return cnt;
}

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

ll exp(ll a, int b){
	ll ans = 1;
	for(int i = 0; i<b; i++)
		{
			ans *= a;
			ans%= mod;
		}
	return ans;
}

int countReplacement(int n, int inputSeq[])
{
	
	if(!valid(n, inputSeq)) return 0;
 	int preval = -1;
	for(int i =n -1; i>=0; i--){
		if(inputSeq[i] <=n){
			preval = (n - i) + inputSeq[i];
			if(preval> n) preval-=n;
			break;
		} 

			
	}
	set<int> replace;
	
	if(preval == -1){
		//all of them were replaced
		for(int i =  0; i<n; i++){
			replace.insert(inputSeq[i]);
		}
	}
	else{
		preval-=1;
		//cout << preval<<endl;
		
		
		for(int i =0; i<n; i++){

			if(inputSeq[i] <=n){
				preval = inputSeq[i];
			}
			else{
				//replacement, num can be anything
				
				if(preval == n){
					replace.insert(inputSeq[i]);
					preval = 1;
					
				}
				else {
					++preval;
					replace.insert(inputSeq[i]);
				}
				
			}
		}
	}
	ll ans = 1;
	int prev = n+1;
	int cnt = 0;
	for( int a: replace){
		ans *= exp((replace.size() - cnt), (a - prev)) ;
		ans%= mod;
		cnt++;
		prev = a+1;
		
		//cout << a<<": "<<ans<<endl;
	}
	
	return ans;
}


/******************************/
#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...