답안 #473271

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
473271 2021-09-15T11:11:13 Z _L__ Doktor (COCI17_doktor) C++17
50 / 100
1000 ms 30404 KB
// 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] = {}; for(ll i = 1; i <= n; ++i){cin >> a[i]; doc[a[i]] = a[i]-i;}a[0] = 1;
    map<ll, ll> freq_odd, freq_even;
    for(ll i = 1; i <= n; ++i)
        if(!(doc[a[i]]%2))
            freq_odd[i+(doc[a[i]]/2)]++;
    for(ll i = 1; i <= n; ++i)
        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, j = ans_odd;
        while(i > 0 && j <= n){
            reverse(a+i, a+j+1); ll x = 0;
            for(ll k = 1; k <= n; ++k) x += (a[k] == k);
                if(x >= sum){
                    a_1 = i, a_2 = j; sum = x;
            }
            reverse(a+i, a+j+1); ++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, j = a_4;
        while(i > 0 && j <= n){
            reverse(a+i, a+j+1); ll x = 0;
            for(ll k = 1; k <= n; ++k) x += (a[k] == k);
            if(x >= sum1){
                a_3 = i, a_4 = j; sum1 = x;
            }
            reverse(a+i, a+j+1); ++j, --i;
        }
        cout << a[a_3] << ' ' << a[a_4] << endl;
    } else {
        //cout << ans_odd << ' ' << ans_even << endl;
        ll a_1 = ans_odd, a_2 = ans_odd, sum = 0, i = ans_odd, j = ans_odd;
        while(i > 0 && j <= n){
            reverse(a+i, a+j+1); ll x = 0;
            for(ll k = 1; k <= n; ++k) x += (a[k] == k);
            if(x >= sum){
                a_1 = i, a_2 = j; sum = x;
            }
            reverse(a+i, a+j+1); ++j, --i;
        }
        ll a_3 = ans_even, a_4 = ans_even+1, sum1 = 0; i = a_3, j = a_4;
        while(i > 0 && j <= n){
            reverse(a+i, a+j+1); ll x = 0;
            for(ll k = 1; k <= n; ++k) x += (a[k] == k);
            if(x >= sum1){
                a_3 = i, a_4 = j; sum1 = x;
            }
            reverse(a+i, a+j+1); ++j, --i;
        }
        //cout << sum << ' ' << sum1 << endl;
        if(sum >= sum1) cout << a[a_1] << ' ' << a[a_2] << endl;
        else cout << a[a_3] << ' ' << a[a_4] << endl;
    }
} 
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 204 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 428 KB Output is correct
2 Correct 4 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 584 KB Output is correct
2 Correct 8 ms 460 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 124 ms 908 KB Output is correct
2 Execution timed out 1087 ms 4940 KB Time limit exceeded
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1083 ms 5804 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1083 ms 30404 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1077 ms 18120 KB Time limit exceeded
2 Halted 0 ms 0 KB -