제출 #288671

#제출 시각아이디문제언어결과실행 시간메모리
288671shayan_pGondola (IOI14_gondola)C++17
100 / 100
112 ms6764 KiB
#include<bits/stdc++.h>
#include "gondola.h"

#define F first
#define S second
#define PB push_back
#define sz(s) (int(s.size()))
#define bit(n, k) (((n)>>(k))&1)

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef long double ld;

const int maxn = 1e5 + 10, mod = 1e9 + 7;

int valid(int n, int inp[]){
    int pos[n];
    fill(pos, pos + n, -1);
    set<int> st;
    for(int i = 0; i < n; i++){	
	--inp[i];
	if(inp[i] < 0)
	    return 0;
	if(st.count(inp[i]))
	    return 0;
	st.insert(inp[i]);	    
	if(inp[i] < n)
	    pos[inp[i]] = i;
    }
    int lst = -1;
    for(int i = 0; i < n; i++){
	if(pos[i] != -1){
	    if(lst == -1)
		lst = i;
	    if((lst - i + n) % n != (pos[lst] - pos[i] + n) % n)
		return 0;
	}
    }
    for(int i = 0; i < n; i++){
	if(pos[i] != -1){
	    if(lst == -1)
		lst = i;
	    if((lst - i + n) % n != (pos[lst] - pos[i] + n) % n)
		return 0;
	}
    }
    return 1;
}
int replacement(int n, int inp[], int outp[]){
    const int maxl = 3e5 + 10;
    int pos[maxl], arr[n];
    memset(pos, -1, sizeof pos);
    int start = 0;
    for(int i = 0; i < n; i++){
	pos[--inp[i]] = i;
	if(inp[i] < n)
	    start = (i - inp[i] + n) % n;
    }
    for(int i = 0; i < n; i++){
	arr[(i + start) % n] = i;
    }
    
    set<int> fre;
    for(int i = 0; i < n; i++){
	if(inp[i] >= n)
	    fre.insert(i);
    }
    int L = 0;
    for(int i = n; i < maxl; i++){
	if(pos[i] == -1){
	    if(fre.empty())
		break;
	    int x = *fre.begin();
	    outp[L++] = arr[x] + 1;
	    arr[x] = i;
	}
	else{
	    fre.erase(pos[i]);
	    int x = pos[i];
	    outp[L++] = arr[x] + 1;
	    arr[x] = i;	    
	}
    }
    return L;
}
int Pow(int a, int b, int mod){
    int ans = 1;
    for(; b; b>>=1, a = 1ll * a * a % mod)
	if(b & 1)
	    ans = 1ll * ans * a % mod;
    return ans;
}
int countReplacement(int n, int inp[]){
    int chert[n + 10];
    for(int i = 0; i < n; i++)
	chert[i] = inp[i];
    if(!valid(n, chert))
    	return 0;
    const int mod = 1e9 + 9;
    map<int, int> pos;
    int ans = 1;
    int start = -1;
    for(int i = 0; i < n; i++){
	pos[--inp[i]] = i;
	if(inp[i] < n)
	    start = (i - inp[i] + n) % n;
    }
    if(start == -1)
	ans = n;

    int fre = 0;
    for(int i = 0; i < n; i++){
	if(inp[i] >= n)
	    fre++;
    }
    int lst = n-1;
    for(pii p : pos){
	if(p.F < n)
	    continue;
	ans = 1ll * ans * Pow(fre, p.F - lst - 1, mod) % mod;
	lst = p.F, fre--;
    }
    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...