Submission #473373

#TimeUsernameProblemLanguageResultExecution timeMemory
473373_L__Doktor (COCI17_doktor)C++17
80 / 100
570 ms42148 KiB
// This code is written by _L__ #include <bits/stdc++.h> using namespace std; #define endl '\n' #define F_word ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL); typedef long long ll; typedef long double ld; const ll mod = 1e9+7, N = 2e5+13, inf = 1e9+1; const ld E = 1e-6; #define ff first #define ss second int main(void){ F_word; ll n; cin >> n; ll a[n+2] = {}, doc[n+4] = {}, pref[n+3] = {}; for(ll i = 1; i <= n; ++i){ cin >> a[i]; doc[a[i]] = a[i]-i; pref[i] += pref[i-1]; pref[i] += (doc[a[i]] == 0); } a[0] = 1; if(n <= 500){ ll sum = 0, ans1 = 1, ans2 = 1; for(int i = 1; i <= n; ++i){ for(int j = i; j <= n; ++j){ reverse(a+i, a+j+1); ll x = 0; for(int k = 1; k <= n; ++k) x += (a[k] == k); if(x >= sum){ ans1 = i, ans2 = j, sum = x; } reverse(a+i, a+j+1); } } cout << a[ans1] << ' ' << a[ans2] << endl; return 0; } map<ll, ll> freq_odd, freq_even; for(ll i = 1; i <= n; ++i){ if(!(doc[a[i]]%2)) freq_odd[(i+a[i])/2]++; if(doc[a[i]]%2) freq_even[(a[i]+i)/2]++; } ll ans_odd = 0, tar = 0, ans_even = 0; for(auto u: freq_odd) if(u.ss >= tar) {tar = u.ss, ans_odd = u.ff;} tar = 0; for(auto u: freq_even) if(u.ss >= tar) {tar = u.ss, ans_even = u.ff;} if(ans_even == 0 && ans_odd == 0)return cout << 1 << ' ' << 1 << endl, 0; if(ans_even == 0){ ll a_1 = ans_odd, a_2 = ans_odd, sum = 0, i = ans_odd-1, j = ans_odd+1, total = (a[a_1] == a_1); while(i > 0 && j <= n){ ll c = (a[i]+i)/2; if(c==ans_odd)++total; c = (a[j]+j)/2; if(c == ans_odd)++total; ll x = total+pref[i-1]+(pref[n]-pref[j]); if(x >= sum){ a_1 = i, a_2 = j; sum = x; } ++j; --i; } cout << a[a_1] << ' ' << a[a_2] << endl; } else if(ans_odd == 0){ ll a_3 = ans_even, a_4 = ans_even+1, sum1 = 0, i = a_3-1, j = a_4+1, total = (a[a_3] == a_4) + (a[a_4] == a_3); while(i > 0 && j <= n){ ll c = (a[i]+i)/2; if(c==ans_even)++total; c = (a[j]+j)/2; if(c == ans_even)++total; ll x = total+pref[i-1]+(pref[n]-pref[j]); if(x >= sum1){ a_3 = i, a_4 = j; sum1 = x; } ++j; --i; } cout << a[a_3] << ' ' << a[a_4] << endl; } else { ll a_1 = ans_odd, a_2 = ans_odd, sum = 0, i = ans_odd-1, j = ans_odd+1, total = (a[a_1] == a_1); while(i > 0 && j <= n){ ll c = (a[i]+i)/2; if(c==ans_odd)++total; c = (a[j]+j)/2; if(c == ans_odd)++total; ll x = total+pref[i-1]+(pref[n]-pref[j]); if(x >= sum){ a_1 = i, a_2 = j; sum = x; } ++j; --i; } ll a_3 = ans_even, a_4 = ans_even+1, sum1 = 0; i = a_3-1, j = a_4+1, total = (a[a_3] == a_4) + (a[a_4] == a_3); while(i > 0 && j <= n){ ll c = (a[i]+i)/2; if(c==ans_even)++total; c = (a[j]+j)/2; if(c == ans_even)++total; ll x = total+pref[i-1]+(pref[n]-pref[j]); if(x >= sum1){ a_3 = i, a_4 = j; sum1 = x; } ++j; --i; } if(sum >= sum1) cout << a[a_1] << ' ' << a[a_2] << endl; else cout << a[a_3] << ' ' << a[a_4] << endl; } }
#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...