Submission #332518

#TimeUsernameProblemLanguageResultExecution timeMemory
332518CSQ31Gondola (IOI14_gondola)C++14
100 / 100
145 ms13192 KiB
#pragma GCC optimize("Ofast") #include "gondola.h" #include<bits/stdc++.h> using namespace std; #define pb push_back #define fi first #define se second #define sz(a) (int)a.size() #define all(a) a.begin(),a.end() #define lb lower_bound #define ub upper_bound #define owo ios_base::sync_with_stdio(0);cin.tie(0); #define MOD (ll)(1e9+9) #define INF (ll)(1e18) #define debug(...) fprintf(stderr, __VA_ARGS__),fflush(stderr) #define time__(d) for(long blockTime = 0; (blockTime == 0 ? (blockTime=clock()) != 0 : false);\ debug("%s time : %.4fs\n", d, (double)(clock() - blockTime) / CLOCKS_PER_SEC)) typedef long long int ll; typedef long double ld; typedef pair<ll,ll> PII; typedef pair<int,int> pii; typedef vector<vector<int>> vii; typedef vector<vector<ll>> VII; ll gcd(ll a,ll b){if(!b)return a;else return gcd(b,a%b);} ll binpow(ll n,ll k){ ll res = 1; while(k){ if(k&1)res*=n; res%=MOD; n*=n; n%=MOD; k/=2; } return res; } int valid(int n, int inputSeq[]) { vector<int>a(n); for(int i=0;i<n;i++)a[i] = inputSeq[i]; int mn=1e9,id=0,mx = 0; bool ok = 1; map<int,bool>seen; vector<pii>pos; for(int i=0;i<n;i++){ if(a[i] < mn){ mn = a[i]; id = i; } if(seen[a[i]])ok = 0; seen[a[i]] = 1; mx = max(mx,a[i]); } vector<int>b; for(int i=0;i<n;i++){ b.pb(a[(id+i)%n]); } for(int i=0;i<n;i++){ if(b[i]<=n)pos.pb({b[i],i}); } // for(auto x:pos)cout<<x.fi<<" "<<x.se<<'\n'; if(mx == n){ sort(all(a)); if(a != b)ok = 0; }else{ mx = 0; for(int i=0;i<sz(pos);i++){ if(i && pos[i].se - pos[i-1].se != pos[i].fi - pos[i-1].fi)ok = 0; } } return ok; } int replacement(int n, int gondolaSeq[], int replacementSeq[]) { vector<int>a(n); for(int i=0;i<n;i++)a[i] = gondolaSeq[i]; map<int,bool>seen; int mx = 0; for(int i=0;i<n;i++){ seen[a[i]] = 1; mx = max(mx,a[i]); } int ans = 0; bool fix = 0; for(int i=1;i<=n;i++)if(seen[i])fix = 1; if(fix){ vector<int>b(n); int sh = 0; for(int i=0;i<n;i++){ if(a[i] <= n){ sh = i - (a[i]-1); break; } } for(int i=0;i<n;i++)b[i] = a[(i+sh+n)%n]; for(int i=0;i<n;i++)a[i] = b[i]; } vector<pii>pos; for(int i=0;i<n;i++){ if(a[i] > n)pos.pb({a[i],i+1}); } sort(all(pos),greater<pii>()); vector<int>opt; for(int i=0;i<sz(pos);i++){ int num; if(i != sz(pos)-1)num = pos[i].fi-pos[i+1].fi; else num = pos[i].fi - n; ans+=num; while(num--){ opt.pb(pos[i].se); } } reverse(all(opt)); vector<int>c(n+1); for(int i=1;i<=n;i++)c[i] = i; int cnt = n; int i = 0; for(int x:opt){ replacementSeq[i] = c[x]; i++; c[x] = ++cnt; } return ans; } int countReplacement(int n, int inputSeq[]) { if(!valid(n,inputSeq))return 0; vector<int>a(n); for(int i=0;i<n;i++)a[i] = inputSeq[i]; map<int,bool>seen; int mx = 0; for(int i=0;i<n;i++){ seen[a[i]] = 1; mx = max(mx,a[i]); } bool fix = 0; for(int i=1;i<=n;i++)if(seen[i])fix = 1; if(fix){ vector<int>b(n); int sh = 0; for(int i=0;i<n;i++){ if(a[i] <= n){ sh = i - (a[i]-1); break; } } for(int i=0;i<n;i++)b[i] = a[(i+sh+n)%n]; for(int i=0;i<n;i++)a[i] = b[i]; } vector<pii>pos; for(int i=0;i<n;i++){ if(a[i] > n)pos.pb({a[i],i+1}); } sort(all(pos),greater<pii>()); /* vector<int>opt; for(int i=0;i<sz(pos);i++){ int num; if(i != sz(pos)-1)num = pos[i].fi-pos[i+1].fi; else num = pos[i].fi - n; while(num--){ opt.pb(pos[i].se); } } map<int,bool>diff; for(int x:opt)diff[x] = 1; int s = sz(diff); //there are only s fix points in opt //the rest we can just go wild; int ans = 1; for(int i=0;i<sz(opt)-s;i++){ ans = (ans*s)%MOD; }*/ //wrong sol after each fix point,candidates decrease by one vector<ll>s; for(int i=0;i<n;i++){ if(a[i] > n)s.pb(a[i]); } sort(all(s)); ll ans = 1; ll cur = n+1; ll cnt = sz(s); for(int x:s){ ans = (ans*binpow(cnt,x-cur))%MOD; cnt--; cur = x+1; } if(!fix)ans = (ans*n)%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...