Submission #615670

#TimeUsernameProblemLanguageResultExecution timeMemory
615670nohaxjustsofloGondola (IOI14_gondola)C++17
60 / 100
19 ms3156 KiB
#include <bits/stdc++.h> #include <iostream> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; typedef tree<ll,null_type,less_equal<ll>,rb_tree_tag,tree_order_statistics_node_update> order_set; mt19937 mt_rand(chrono::high_resolution_clock::now().time_since_epoch().count()); //uniform_int_distribution<int> gen; ///(min, max) //int random() {return gen(mt_rand);} const int mxN=1e6+5; const int mod=1e9+7; const int mxlogN=40; const int mxK=26; const int inf=2e9; const int K=600; #include "gondola.h" int valid(int n, int a[]) { for(int i=0; i<n; i++) { if(a[i]<=n) { for(int j=i+1; j-i<n; j++) if(a[j%n]<=n&&a[j%n]!=(a[i]+j-i-1)%n+1) return 0; break; } } sort(a,a+n); for(int i=0; i+1<n; i++) if(a[i]==a[i+1]) return 0; return 1; } //---------------------- int replacement(int n, int a[], int b[]) { int c[n]; iota(c,c+n,1); for(int i=0; i<n; i++) { if(a[i]<=n) { for(int j=i; j-i<n; j++) c[j%n]=(a[i]+j-i-1)%n+1; break; } } int w[250001]; for(int i=1; i<=250000; i++) w[i]=-1; for(int i=0; i<n; i++) w[a[i]]=c[i]; for(int i=249999; i>n; i--) if(!~w[i]) w[i]=w[i+1]; int j=0; for(int i=n+1; i<=250000; i++) { if(!~w[i]) break; if(w[i]==w[i-1]) b[j++]=i-1; else b[j++]=w[i]; } return j; } //---------------------- ll powb(ll a, ll x) { ll ret=1; a%=mod; while(x) { if(x&1)ret=ret*a%mod; x>>=1; a=a*a%mod; } return ret; } ll inv(ll x) { return powb(x, mod-2); } ll f[mxN], finv[mxN]; ll chose(ll a, ll b) { if(a<0||a>b) return 0; return f[b]*finv[a]%mod*finv[b-a]%mod; } /* int countReplacement(int n, int a[]) { if(!valid(n, a)) return 0; sort(a,a+n); f[0]=1; for(int i=1; i<mxN; i++) f[i]=f[i-1]*i%mod; finv[mxN-1]=inv(f[mxN-1]); for(int i=mxN-2; i>=0; i--) finv[i]=finv[i+1]*(i+1)%mod; ll ways=1; bool ok=1; for(int i=0; i<n; i++) { if(a[i]>n) { int sz; if(i) sz=a[i]-max(n,a[i-1]); else sz=a[i]-n; ways=ways*powb(n-i,sz-1)%mod; } else ok=0; } if(ok) return ways*f[n]%mod; return ways; }*/ int countReplacement(int n, int a[]) { if(!valid(n, a)) return 0; int c[n]; iota(c,c+n,1); bool ok=1; for(int i=0; i<n; i++) { if(a[i]<=n) { for(int j=i; j-i<n; j++) c[j%n]=(a[i]+j-i-1)%n+1; ok=0; break; } } int w[250001]; for(int i=1; i<=250000; i++) w[i]=-1; for(int i=0; i<n; i++) w[a[i]]=c[i]; set<int> s; for(int i=249999; i>n; i--) { if(!~w[i]) w[i]=w[i+1]; else s.insert(w[i]); } ll ways=1; for(int i=n+1; i<=250000; i++) { if(!~w[i]) break; if(w[i]==w[i-1]) ways=ways*(ll)s.size()%mod; else s.erase(w[i-1]); } //if(ok) for(int i=2; i<=n; i++) ways=ways*i%mod; return ways; } /* int main() { int n,m,k; cin >> n >> m >> k; int r[m][2], l[m], p[n]; for(int i=0; i<m; i++) cin >> r[i][0] >> r[i][1] >> l[i]; for(int i=0; i<k; i++) cin >> p[i]; cout << travel_plan(n,m,r,l,k,p) << "\n"; } */ /* 5 4 3 0 1 2 0 2 3 3 2 1 2 4 4 1 3 4 */

Compilation message (stderr)

gondola.cpp: In function 'int countReplacement(int, int*)':
gondola.cpp:124:10: warning: variable 'ok' set but not used [-Wunused-but-set-variable]
  124 |     bool ok=1;
      |          ^~
#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...