제출 #1036654

#제출 시각아이디문제언어결과실행 시간메모리
1036654NonozeHacker (BOI15_hac)C++17
100 / 100
25 ms7192 KiB
    #include <bits/stdc++.h>
    using namespace std;
     
    namespace std {
     
    // https://judge.yosupo.jp/submission/193613
    struct IOPre {
        static constexpr int TEN = 10, SZ = TEN * TEN * TEN * TEN;
        std::array<char, 4 * SZ> num;
        constexpr IOPre() : num{} {
            for (int i = 0; i < SZ; i++) for (int n = i, j = 3; j >= 0; j--) num[i * 4 + j] = n % TEN + '0', n /= TEN;
        }
    };
     
    struct IO {
    #if !HAVE_DECL_FREAD_UNLOCKED
        #define fread_unlocked fread
    #endif
    #if !HAVE_DECL_FWRITE_UNLOCKED
        #define fwrite_unlocked fwrite
    #endif
        static constexpr int SZ = 1 << 17, LEN = 32, TEN = 10, HUNDRED = TEN * TEN,
                             THOUSAND = HUNDRED * TEN, TENTHOUSAND = THOUSAND * TEN,
                             MAGIC_MULTIPLY = 205, MAGIC_SHIFT = 11, MASK = 15,
                             TWELVE = 12, SIXTEEN = 16;
        static constexpr IOPre io_pre = {};
        std::array<char, SZ> input_buffer, output_buffer;
        int input_ptr_left, input_ptr_right, output_ptr_right;
     
        IO() : input_buffer{}, output_buffer{}, input_ptr_left{}, input_ptr_right{}, output_ptr_right{} {}
        IO(const IO&) = delete;
        IO(IO&&) = delete;
        IO& operator=(const IO&) = delete;
        IO& operator=(IO&&) = delete;
        ~IO() { flush(); }
     
        template<typename T> static constexpr bool is_char_v    = std::is_same_v<T, char>;
        template<typename T> static constexpr bool is_bool_v    = std::is_same_v<T, bool>;
        template<typename T> static constexpr bool is_string_v  =
                std::is_same_v<T, std::string> || std::is_same_v<T, const char*> ||
                std::is_same_v<T, char*> || std::is_same_v< std::decay_t<T>, char*>;
        template<typename T> static constexpr bool is_default_v =
                is_char_v<T> || is_bool_v<T> || is_string_v<T> || std::is_integral_v<T>;
     
        inline void load() {
            memmove(std::begin(input_buffer),
                    std::begin(input_buffer) + input_ptr_left,
                    input_ptr_right - input_ptr_left);
            input_ptr_right =
                input_ptr_right - input_ptr_left +
                fread_unlocked(
                    std::begin(input_buffer) + input_ptr_right - input_ptr_left, 1,
                    SZ - input_ptr_right + input_ptr_left, stdin);
            input_ptr_left = 0;
        }
     
        inline void read_char(char& c) {
            if (input_ptr_left + LEN > input_ptr_right) load();
            c = input_buffer[input_ptr_left++];
        }
        inline void read_string(std::string& x) {
            char c;
            while (read_char(c), c < '!') continue;
            x = c;
            while (read_char(c), c >= '!') x += c;
        }
        template<typename T>
        inline std::enable_if_t<std::is_integral_v<T>, void> read_int(T& x) {
            if (input_ptr_left + LEN > input_ptr_right) load();
            char c = 0;
            do c = input_buffer[input_ptr_left++];
            while (c < '-');
            [[maybe_unused]] bool minus = false;
            if constexpr (std::is_signed<T>::value == true)
                if (c == '-') minus = true, c = input_buffer[input_ptr_left++];
            x = 0;
            while (c >= '0')
                x = x * TEN + (c & MASK), c = input_buffer[input_ptr_left++];
            if constexpr (std::is_signed<T>::value == true)
                if (minus) x = -x;
        }
     
        inline void skip_space() {
            if (input_ptr_left + LEN > input_ptr_right) load();
            while (input_buffer[input_ptr_left] <= ' ') input_ptr_left++;
        }
     
        inline void flush() {
            fwrite_unlocked(std::begin(output_buffer), 1, output_ptr_right, stdout);
            output_ptr_right = 0;
        }
     
        inline void write_char(char c) {
            if (output_ptr_right > SZ - LEN) flush();
            output_buffer[output_ptr_right++] = c;
        }
     
        inline void write_bool(bool b) {
            if (output_ptr_right > SZ - LEN) flush();
            output_buffer[output_ptr_right++] = b ? '1' : '0';
        }
     
        inline void write_string(const std::string& s) {
            for (auto x : s) write_char(x);
        }
     
        inline void write_string(const char* s) {
            while (*s) write_char(*s++);
        }
     
        inline void write_string(char* s) {
            while (*s) write_char(*s++);
        }
     
        template <typename T>
        inline std::enable_if_t< std::is_integral_v<T>, void> write_int(T x) {
            if (output_ptr_right > SZ - LEN) flush();
            if (!x) {
                output_buffer[output_ptr_right++] = '0';
                return;
            }
            if constexpr (std::is_signed_v<T>) if (x < 0) output_buffer[output_ptr_right++] = '-', x = -x;
            int i = TWELVE;
            std::array<char, SIXTEEN> buf{};
            for (; x >= TENTHOUSAND; x /= TENTHOUSAND, i -= 4)
                memcpy(std::begin(buf) + i, std::begin(io_pre.num) + (x % TENTHOUSAND) * 4, 4);
            if (x < HUNDRED) {
                if (x < TEN) output_buffer[output_ptr_right++] = '0' + x;
                else {
                    uint32_t q = (uint32_t(x) * MAGIC_MULTIPLY) >> MAGIC_SHIFT;
                    uint32_t r = uint32_t(x) - q * TEN;
                    output_buffer[output_ptr_right++] = '0' + q;
                    output_buffer[output_ptr_right++] = '0' + r;
                }
            } else {
                if (x < THOUSAND) 
                    memcpy(std::begin(output_buffer) + output_ptr_right, std::begin(io_pre.num) + (x << 2) + 1, 3),
                    output_ptr_right += 3;
                else
                    memcpy(std::begin(output_buffer) + output_ptr_right, std::begin(io_pre.num) + (x << 2), 4),
                    output_ptr_right += 4;
            }
            memcpy(std::begin(output_buffer) + output_ptr_right, std::begin(buf) + i + 4, TWELVE - i);
            output_ptr_right += TWELVE - i;
        }
     
        template <typename T_>
        std::enable_if_t<(is_default_v< std::remove_cv_t< std::remove_reference_t<T_> > >), IO&> operator<<(T_&& x) {
            using T = std::remove_cv_t< std::remove_reference_t<T_> >;
            if constexpr (is_bool_v<T>) write_bool(x);
            else if constexpr (is_string_v<T>) write_string(x);
            else if constexpr (is_char_v<T>) write_char(x);
            else if constexpr (std::is_integral_v<T>) write_int(x);
            return *this;
        }
     
        template<typename T>
        std::enable_if_t<(is_default_v<T> && !is_bool_v<T>), IO&> operator>>(T& x) {
            if constexpr (is_string_v<T>) read_string(x);
            else if constexpr (is_char_v<T>) read_char(x);
            else if constexpr (std::is_integral_v<T>) read_int(x);
            return *this;
        }
     
        IO* tie(std::nullptr_t) { return this; }
        void sync_with_stdio(bool) {}
    } io;
     
    } // namespace std
     
    using std::io;
     
    #define cin io
    #define cout io
     
    #include <ext/pb_ds/assoc_container.hpp>
    #include <ext/pb_ds/tree_policy.hpp>
    using namespace __gnu_pbds;
    typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>ordered_set;
    typedef long long ll;
     
     
    #define sz(x) (int)(x.size())
    #define debug(x) cerr << (#x) << ": " << (x) << endl
    #define all(x) (x).begin(), (x).end()
    #define rall(x) (x).rbegin(), (x).rend()
     
     
    int n, k, m;
    vector<int> a;
     
    void solve() {
    	cin >> n;
    	a.clear(), a.resize(n);
    	for (auto &u: a) cin >> u;
    	vector<int> sum(n, 0);
    	int mid=n/2+n%2;
    	for (int i=0; i<mid; i++) sum[0]+=a[i];
    	for (int i=1; i<n; i++) {
    		sum[i]=sum[i-1]+a[(i+mid-1)%n]-a[i-1];
    	}
    	// priority_queue<int, vector<int>, greater<int>> curr;
    	deque<int> curr;
    	for (int i=0; i<mid; i++) {
    		while (!curr.empty() && sum[curr.front()]>=sum[i]) curr.pop_front();
    		curr.push_front(i);
    	}
    	int ans=0;
    	for (int i=mid; i<n+mid; i++) {
    		ans=max(ans, sum[curr.back()]);
    		while (!curr.empty() && sum[curr.front()]>=sum[i%n]) curr.pop_front();
    		if (!curr.empty() && curr.back()==i-mid) curr.pop_back();
    		curr.push_front(i%n);
    	}
    	cout << ans;
    	return;
    }
     
    signed main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0);
    	int tt=1;// cin >> tt;
    	while(tt--) solve();
    	return 0;
    }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...