제출 #701964

#제출 시각아이디문제언어결과실행 시간메모리
701964PCTprobability곤돌라 (IOI14_gondola)C++17
60 / 100
1092 ms4688 KiB
#include <bits/stdc++.h> #include "gondola.h" using namespace std; using ll = long long; const ll mod = 1000000009; ll modPow(ll a,ll b,ll c){ ll r=1; while(b){ if(b&1) (r*=a)%=c; (a*=a)%=c; } return r; } int valid(int n, int inputSeq[]){ for(int i=0;i<n;i++) inputSeq[i]--; set<int> s; for(int i=0;i<n;i++) s.insert(inputSeq[i]); if(s.size()!=n) return 0; for(int i=0;i<n;i++){ if(inputSeq[i]<n){ for(int j=0;j<n;j++){ if(inputSeq[(i+j)%n]<n&&inputSeq[(i+j)%n]!=(inputSeq[i]+j)%n) return 0; } return 1; } } return 1; } int replacement(int n, int gondolaSeq[], int replacementSeq[]){ for(int i=0;i<n;i++) gondolaSeq[i]--; int m=0; for(int i=0;i<n;i++) m=max(m,gondolaSeq[i]); vector<int> gon(n); int v=0; for(int i=0;i<n;i++){ if(gondolaSeq[i]<n){ v=(i-gondolaSeq[i]+n)%n; } } for(int i=0;i<n;i++) gon[(i+v)%n]=i; vector<int> rev(500000,-1); for(int i=0;i<n;i++) rev[gondolaSeq[i]]=i; set<int> idx; for(int i=0;i<n;i++){ if(gondolaSeq[i]>=n) idx.insert(i); } for(int i=n;i<=m;i++){ if(rev[i]==-1){ int id=(*idx.begin()); replacementSeq[i-n]=gon[id]+1; gon[id]=i; } else{ replacementSeq[i-n]=gon[rev[i]]+1; idx.erase(rev[i]); gon[rev[i]]=i; } } return m-n+1; } int countReplacement(int n, int inputSeq[]){ for(int i=0;i<n;i++) inputSeq[i]--; bool ok=true; set<int> s; for(int i=0;i<n;i++) s.insert(inputSeq[i]); if(s.size()!=n) ok=false; for(int i=0;i<n;i++){ if(inputSeq[i]<n){ for(int j=0;j<n;j++){ if(inputSeq[(i+j)%n]<n&&inputSeq[(i+j)%n]!=(inputSeq[i]+j)%n) ok=false; } break; } } if(!ok) return 0; int m=0; for(int i=0;i<n;i++) m=max(m,inputSeq[i]); vector<int> gon(n); int v=0; ll c=n; for(int i=0;i<n;i++){ if(inputSeq[i]<n){ c=1; v=(i-inputSeq[i]+n)%n; } } ll ans=1; for(int i=0;i<n;i++) gon[(i+v)%n]=i; vector<int> rev(500000,-1); for(int i=0;i<n;i++) rev[inputSeq[i]]=i; set<int> idx; for(int i=0;i<n;i++){ if(inputSeq[i]>=n) idx.insert(i); } vector<int> id; id.push_back(n-1); for(int i=0;i<n;i++){ if(inputSeq[i]>=n) id.push_back(inputSeq[i]); } sort(id.begin(),id.end()); ll now=idx.size(); for(int i=0;i+1<id.size();i++){ ans*=modPow(now,id[i+1]-id[i]-1,mod); ans%=mod; now--; } ans*=c; ans%=mod; return int(ans); }

컴파일 시 표준 에러 (stderr) 메시지

gondola.cpp: In function 'int valid(int, int*)':
gondola.cpp:18:14: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   18 |   if(s.size()!=n) return 0;
      |      ~~~~~~~~^~~
gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:66:14: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   66 |   if(s.size()!=n) ok=false;
      |      ~~~~~~~~^~~
gondola.cpp:102:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |   for(int i=0;i+1<id.size();i++){
      |               ~~~^~~~~~~~~~
#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...