/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 1ms 328.0 KiB
#2 Accepted 19ms 812.0 KiB
#3 Accepted 32ms 624.0 KiB
#4 Accepted 48ms 772.0 KiB
#5 Accepted 96ms 760.0 KiB
#6 Accepted 76ms 2.586 MiB
#7 Accepted 27ms 10.398 MiB
#8 Accepted 180ms 10.57 MiB
#9 Accepted 124ms 10.398 MiB
#10 Accepted 120ms 10.523 MiB
#11 Accepted 125ms 10.523 MiB
#12 Accepted 120ms 10.395 MiB

Code

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template <typename T> using o_set = tree<T, null_type, std::less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#define int long long
#define endl '\n'
#define F first
#define S second
#define pii pair<int, int>
#define sz(x) (int) x.size()
using namespace std;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int INF = 1e15 + 10;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

class SGTree {

public:
    struct Node {
        int sm = 0, mx = -INF, mn = INF;
    };
    vector<Node> seg;
    
    SGTree(int n) {
        seg.resize(4 * n + 1);
    }

    void pull(int ind) {
        seg[ind].sm = (seg[2 * ind + 1].sm + seg[2 * ind + 2].sm);
        seg[ind].mx = max(seg[2 * ind + 1].mx, seg[2 * ind + 2].mx);
        seg[ind].mn = min(seg[2 * ind + 1].mn, seg[2 * ind + 2].mn);
    }

    Node merge(Node a, Node b) {
        Node c;
        c.sm = a.sm + b.sm;
        c.mx = max(a.mx, b.mx);
        c.mn = min(a.mn, b.mn);
        return c;
    }

    void build(int ind, int low, int high, vector<int> &a) {
        if(low == high) {
            seg[ind].sm = seg[ind].mx = seg[ind].mn = a[low];
            return;
        }

        int mid = low + (high - low) / 2;
        build(2 * ind + 1, low, mid, a);
        build(2 * ind + 2, mid + 1, high, a);

        pull(ind);
    }

    Node query(int ind, int low, int high, int l, int r) {

        if(l > high || r < low) return Node();
        if(l <= low && r >= high) return seg[ind];

        int mid = low + (high - low) / 2;
        auto left = query(2 * ind + 1, low, mid, l, r);
        auto right = query(2 * ind + 2, mid + 1, high, l, r);
        return merge(left, right);
    }

    void update(int ind, int low, int high, int i, int val) {
        if(low == high) {
            seg[ind].sm = seg[ind].mx = seg[ind].mn = val;
            return;
        }

        int mid = low + (high - low) / 2;
        if(i <= mid) update(2 * ind + 1, low, mid, i, val);
        else update(2 * ind + 2, mid + 1, high, i, val);
        
        pull(ind);
    }
};

void solve() {
    int n, k; cin>>n>>k;
    vector<int> v(n);
    for(int i = 0; i < n; i++) cin>>v[i];
    
    SGTree st(n);
    st.build(0, 0, n - 1, v);

    // for(int i = 0; i < n; i++) cerr<<st.query(0, 0, n - 1, i, i).sm<<" "; cerr<<endl;

    int ans = INF;
    for(int i = 0; i + k - 1 < n; i++) {
        auto res = st.query(0, 0, n - 1, i, i + k - 1), l = st.query(0, 0, n - 1, 0, i - 1), r = st.query(0, 0, n - 1, i + k, n - 1);
        int cur = res.sm;
        ans = min(ans, cur);
        ans = min(ans, cur - res.mx + min(l.mn, r.mn));
    }

    cout<<ans<<endl;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int t = 1, c = 1; cin>>t;
    while(t--) {
        // cerr<<"Case "<<c++<<": \n";
        solve();
    }
}

Information

Submit By
Type
Submission
Problem
P1149 Swap and Minimize
Language
C++17 (G++ 13.2.0)
Submit At
2024-12-25 10:28:12
Judged At
2024-12-25 10:28:12
Judged By
Score
100
Total Time
180ms
Peak Memory
10.57 MiB