제출 #102425

#제출 시각아이디문제언어결과실행 시간메모리
102425ansol4328곤돌라 (IOI14_gondola)C++11
100 / 100
42 ms2484 KiB
#include "gondola.h" #include<stack> #include<utility> #include<queue> #include<algorithm> using namespace std; typedef pair<int,int> P; typedef long long ll; int m2[100005]; bool exist[250005]; int res[250005], origin[100005]; const ll MOD=1e9+9; int valid(int N, int *M) { int val=M[0], idx=0; for(int i=0 ; i<N ; i++) m2[i]=M[i]; sort(m2,m2+N); for(int i=1 ; i<N ; i++) { if(m2[i]==m2[i-1]) return 0; } for(int i=1 ; i<N ; i++) { if(val>M[i]) val=M[i], idx=i; } if(val>N) return 1; int nxt=val; for(int i=1 ; i<N ; i++) { (idx+=1)%=N; nxt++; if(nxt>N) nxt=1; if(M[idx]>N) continue; if(M[idx]!=nxt) return 0; } return 1; } void make_origin(int N, int *M) { int val=M[0], idx=0; for(int i=1 ; i<N ; i++) if(val>M[i]) val=M[i], idx=i; if(val>N) { for(int i=0 ; i<N ; i++) origin[i]=i+1; return; } int nxt=val; origin[idx]=nxt; for(int i=1 ; i<N ; i++) { (idx+=1)%=N; nxt++; if(nxt>N) nxt=1; origin[idx]=nxt; } } int replacement(int N, int *M, int *ret) { make_origin(N,M); priority_queue<P> PQ; for(int i=0 ; i<N ; i++) { exist[M[i]]=true; PQ.push(P(M[i],i)); } stack<int> S; int idx=PQ.top().first; while(PQ.top().first!=N) { int pval, tsec=PQ.top().second; while(exist[idx]) idx--; pval=idx; if(idx<=N) pval=origin[tsec]; PQ.pop(); PQ.push(P(pval,tsec)); exist[pval]=true; S.push(pval); } int rcnt=0; while(!S.empty()) { ret[rcnt++]=S.top(); S.pop(); } return rcnt; } ll get_pow(ll x, int y) { if(y==0) return 1; if(y==1) return x; ll ret=get_pow(x,y/2); (ret*=ret)%=MOD; if(y%2==1) (ret*=x)%=MOD; return ret; } int countReplacement(int N, int *M) { int val=M[0], idx=0; ll ret=0, ecnt=0; if(!valid(N,M)) return (int)ret; for(int i=1 ; i<N ; i++) if(val>M[i]) val=M[i], idx=i; priority_queue<int,vector<int>,greater<int> > PQ; if(val>N) { ret=N, ecnt=N; for(int i=0 ; i<N ; i++) PQ.push(M[i]); } else { ret=1; int nxt=val; for(int i=1 ; i<N ; i++) { (idx+=1)%=N; nxt++; if(nxt>N) nxt=1; if(nxt!=M[idx]) PQ.push(M[idx]), ecnt++; } } val=N+1; while(!PQ.empty()) { int y=PQ.top()-val; (ret*=get_pow(ecnt,y))%=MOD; ecnt--; val=PQ.top()+1; PQ.pop(); } return (int)ret; }
#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...