제출 #31704

#제출 시각아이디문제언어결과실행 시간메모리
31704top34051Gondola (IOI14_gondola)C++14
100 / 100
86 ms8268 KiB
#include "gondola.h"
#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define mod 1000000009LL

int n,m,mx;
int a[maxn];
set<int> vis;
map<int,int> s;

long long gpow(long long x,long long y) {
    if(y==0) return 1LL;
    if(y%2==0) return gpow((x*x)%mod,y/2);
    return (gpow(x,y-1)*x)%mod;
}

int valid(int N, int p[]) {
    int i, x = 0, val;
    n = N;
    //Build
    for(i=0;i<n;i++) if(p[i]<=n) x = i;
    val = p[x];
    for(i=0;i<n;i++) a[x] = val, x = (x+1)%n, val = val%n+1;
    //Check
    for(i=0;i<n;i++) if(p[i]<=n && a[i]!=p[i]) return 0;
    //Rep
    for(i=0;i<n;i++) {
        if(vis.find(p[i])!=vis.end()) return 0;
        vis.insert(p[i]);
    }
    return 1;
}

int replacement(int N, int p[], int res[]) {
    int i, x=-1, val;
    n = N;
    //Build
    for(i=0;i<n;i++) if(p[i]<=n) x = i;
    if(x==-1) val = 1, x = 0;
    else val = p[x];
    for(i=0;i<n;i++) a[x] = val, x = (x+1)%n, val = val%n+1;
    //Check
    for(i=0;i<n;i++) {
        mx = max(mx,p[i]);
        if(p[i]>n) s[p[i]] = i;
    }
    m = 0;
    for(i=n+1;i<=mx;i++) {
        if(s.find(i)!=s.end()) res[m++] = a[s[i]], a[s[i]] = i, s.erase(s.find(i));
        else if(s.size()>0) res[m++] = a[s.begin()->second], a[s.begin()->second] = i;
        else return 0;
    }
    return m;
}

int countReplacement(int N, int p[]) {
    int i, x=-1, val, cy;
    long long ans;
    n = N;
    //Build
    cy = 0;
    for(i=0;i<n;i++) if(p[i]<=n) x = i;
    if(x==-1) val = 1, x = 0, cy = 1;
    else val = p[x];
    for(i=0;i<n;i++) a[x] = val, x = (x+1)%n, val = val%n+1;
    //Check
    for(i=0;i<n;i++) if(p[i]<=n && a[i]!=p[i]) return 0;
    //Rep
    for(i=0;i<n;i++) {
        if(vis.find(p[i])!=vis.end()) return 0;
        vis.insert(p[i]);
    }
    //Check
    sort(&p[0],&p[n]);
    m = 0;
    for(i=0;i<n;i++) if(p[i]>n) m++;
    ans = 1;
    int last = n;
    for(i=0;i<n;i++) {
        x = p[i];
        if(x<=n) continue;
        ans = ((ans*gpow(m,x-last-1))%mod + mod)%mod;
//        printf("%d: m = %d\n",x,m);
        m--;
        last = x;
    }
    if(cy) ans = ((ans*n)%mod + mod)%mod;
    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...