Submission #1010884

#TimeUsernameProblemLanguageResultExecution timeMemory
1010884MardonbekhazratovGondola (IOI14_gondola)C++17
75 / 100
76 ms11616 KiB
    #include "gondola.h"
    #include<bits/stdc++.h>
     
    using namespace std;
     
    int valid(int n, int inputSeq[]){
        int mn=n,id=-1;
        map<int,int>cnt;
        for(int i=0;i<n;i++){
            cnt[inputSeq[i]]++;
            if(inputSeq[i]<=mn){
                mn=inputSeq[i];
                id=i;
            }
        }
        for(auto [x,y]:cnt){
            if(y>1) return 0;
        }
        if(mn==n) return 1;
        id=(id-mn+1+n)%n;
        for(int i=0;i<n;i++){
            if(inputSeq[(id+i)%n]==i+1 || inputSeq[(id+i)%n]>n) continue;
            return 0;
        }
        return 1;
    }
     
    //----------------------
     
     
    int replacement(int n, int gondolaSeq[], int replacementSeq[]){
        const int N=2.5e5;
        vector<int>cnt(N+1,0);
        int mn=N,id=0,mx=0;
        set<int>s;
        set<pair<int,int>>t;
        for(int i=0;i<n;i++){
            cnt[gondolaSeq[i]]++;
            if(gondolaSeq[i]<mn){
                mn=gondolaSeq[i];
                id=i;
            }
            mx=max(mx,gondolaSeq[i]);
            if(gondolaSeq[i]<=n) s.insert(gondolaSeq[i]);
            else t.insert({gondolaSeq[i],i});
        }
        if(mn<=n){
            id=(id-mn+1+n)%n;
        }
        int ans=0,last=n+1;
        for(auto [x,y]:t){
            int k=(y-id+n)%n;
            replacementSeq[ans++]=k+1;
            for(int j=last;j<x;j++) replacementSeq[ans++]=j;
            last=x+1;
        }
        return ans;
    }
     
    //----------------------
     
    int countReplacement(int n, int inputSeq[]){
        const int MOD=1e9+9;
        if(!valid(n,inputSeq)){
            return 0;
        }
        int c=0;
        map<int,int>cnt;
        int mx=0;
        for(int i=0;i<n;i++){
            if(inputSeq[i]>n) c++;
            cnt[inputSeq[i]]++;
            mx=max(inputSeq[i],mx);
        }
        int replacementSeq[(int)3e5];
        int l=replacement(n,inputSeq,replacementSeq);
        long long ans=1;
        for(int i=n+1;i<=mx;i++){
            if(cnt[i]>0) c--;
            else ans=ans*c%MOD;
        }
        return ans;
    }

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:76:13: warning: unused variable 'l' [-Wunused-variable]
   76 |         int l=replacement(n,inputSeq,replacementSeq);
      |             ^
#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...