提出 #75559409


ソースコード 拡げる

#include <bits/stdc++.h>
using namespace std;
#define int ll

#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;

mt19937_64 rng(std::chrono::system_clock::now().time_since_epoch().count());

struct SegTree{
    int size;
    vector<int>arr;
    vector<int>pre;
    vector<int>suf;
    vector<int>seg;
    vector<int>maxs;
    void init(int n){
        size = 1;
        while(size<n)size*=2;
        arr.assign(2*size,0LL);
        pre.assign(2*size,0LL);
        suf.assign(2*size,0LL);
        seg.assign(2*size,0LL);
        maxs.assign(2*size,0LL);
    }
    void set(int i, int v, int x, int lx, int rx){
        if(rx-lx==1){
            arr[x] = v;
            pre[x] = max(0LL,v);
            suf[x] = max(0LL,v);
            seg[x] = max(0LL,v);
            maxs[x] = v;
            return;
        }
        int m = (lx+rx)/2;
        if(i<m){
            set(i,v,2*x+1,lx,m);
        }
        else{
            set(i,v,2*x+2,m,rx);
        }
        arr[x] = arr[2*x+1]+arr[2*x+2];
        pre[x] = max(pre[2*x+1],arr[2*x+1]+pre[2*x+2]);
        suf[x] = max(suf[2*x+2],suf[2*x+1]+arr[2*x+2]);
        seg[x] = max(seg[2*x+1],max(seg[2*x+2],suf[2*x+1]+pre[2*x+2]));
        maxs[x] = max(maxs[2*x+1],maxs[2*x+2]);
    }
    void set(int i,int v){
        set(i,v,0,0,size);
    }
    vector<int> query(int l,int r, int x, int lx, int rx){
        vector<int>res(4);//sum,prefix,suffix,segment
        if(lx>=r||l>=rx)return {0,0,0,0};
        if(lx>=l&&rx<=r){
            res[0] = arr[x];
            res[1] = pre[x];
            res[2] = suf[x];
            res[3] = seg[x];
            return res;
        }
        int m = (lx+rx)/2;
        vector<int>res1 = query(l,r,2*x+1,lx,m);
        vector<int>res2 = query(l,r,2*x+2,m,rx);
        res[0] = res1[0]+res2[0];
        res[1] = max(res1[1],res1[0]+res2[1]);
        res[2] = max(res2[2],res1[2]+res2[0]);
        res[3] = max(res1[3],max(res2[3],res1[2]+res2[1]));
        return res;
    }
    int query(int l, int r){
        vector<int>res = query(l,r,0,0,size);
        return res[3];
    }
    int query2(int l,int r, int x, int lx, int rx){
        if(lx>=r||l>=rx)return -1*(int)1e9;
        if(lx>=l&&rx<=r)return maxs[x];
        int m = (lx+rx)/2;
        int s1 = query2(l,r,2*x+1,lx,m);
        int s2 = query2(l,r,2*x+2,m,rx);
        return max(s1,s2);
    }
    int query2(int l, int r){
        return query2(l,r,0,0,size);
    }
};

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int n,q;
    cin >> n >> q;
    vector<int>a(n+1);
    int sum = 0;
    for(int i = 1; i<=n; i++){
        cin >> a[i];
        sum += a[i];
    }
    SegTree seg; seg.init(n+5);
    auto modify = [&](int i) -> void {
        if(a[i] == 0){
            seg.set(i,-1);
        }
        else{
            seg.set(i,a[i]);
        }
    };
    for(int i = 1; i<=n; i++){
        modify(i);
    }
    while(q--){
        int i,v;
        cin >> i >> v;
        sum -= a[i];
        a[i] = v;
        sum += a[i];
        modify(i);
        cout << sum - seg.query(1,n+1) << '\n';
    }
    return 0;
}

提出情報

提出日時
問題 G - 口
ユーザ kevinyang
言語 C++23 (GCC 15.2.0)
得点 4
コード長 3335 Byte
結果 AC
実行時間 192 ms
メモリ 14536 KiB

ジャッジ結果

セット名 Sample Subtask All
得点 / 配点 0 / 0 2 / 2 2 / 2
結果
AC × 2
AC × 16
AC × 28
セット名 テストケース
Sample 00_sample_00.txt, 00_sample_01.txt
Subtask 00_sample_00.txt, 00_sample_01.txt, 01_subtask_00.txt, 01_subtask_01.txt, 01_subtask_02.txt, 01_subtask_03.txt, 01_subtask_04.txt, 01_subtask_05.txt, 01_subtask_06.txt, 01_subtask_07.txt, 01_subtask_08.txt, 01_subtask_09.txt, 01_subtask_10.txt, 01_subtask_11.txt, 01_subtask_12.txt, 01_subtask_13.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_subtask_00.txt, 01_subtask_01.txt, 01_subtask_02.txt, 01_subtask_03.txt, 01_subtask_04.txt, 01_subtask_05.txt, 01_subtask_06.txt, 01_subtask_07.txt, 01_subtask_08.txt, 01_subtask_09.txt, 01_subtask_10.txt, 01_subtask_11.txt, 01_subtask_12.txt, 01_subtask_13.txt, 02_random_00.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 02_random_07.txt, 02_random_08.txt, 02_random_09.txt, 02_random_10.txt, 02_random_11.txt
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 3508 KiB
00_sample_01.txt AC 1 ms 3536 KiB
01_subtask_00.txt AC 1 ms 3500 KiB
01_subtask_01.txt AC 27 ms 14432 KiB
01_subtask_02.txt AC 25 ms 14500 KiB
01_subtask_03.txt AC 25 ms 14520 KiB
01_subtask_04.txt AC 25 ms 14484 KiB
01_subtask_05.txt AC 25 ms 14484 KiB
01_subtask_06.txt AC 25 ms 14380 KiB
01_subtask_07.txt AC 26 ms 14536 KiB
01_subtask_08.txt AC 26 ms 14484 KiB
01_subtask_09.txt AC 26 ms 14484 KiB
01_subtask_10.txt AC 26 ms 14484 KiB
01_subtask_11.txt AC 24 ms 14520 KiB
01_subtask_12.txt AC 26 ms 14484 KiB
01_subtask_13.txt AC 24 ms 14468 KiB
02_random_00.txt AC 188 ms 14380 KiB
02_random_01.txt AC 189 ms 14420 KiB
02_random_02.txt AC 190 ms 14444 KiB
02_random_03.txt AC 188 ms 14520 KiB
02_random_04.txt AC 187 ms 14468 KiB
02_random_05.txt AC 192 ms 14492 KiB
02_random_06.txt AC 191 ms 14468 KiB
02_random_07.txt AC 191 ms 14536 KiB
02_random_08.txt AC 191 ms 14520 KiB
02_random_09.txt AC 191 ms 14432 KiB
02_random_10.txt AC 189 ms 14484 KiB
02_random_11.txt AC 173 ms 14432 KiB