제출 #1339573

#제출 시각아이디문제언어결과실행 시간메모리
1339573NHristovRooted MST (innopolis2021_final_E)C++20
100 / 100
460 ms101640 KiB
#include <bits/stdc++.h>
#define endl '\n'
#define ll long long
#define ar array
using namespace std;

const int N=3e5+5, INF=1e9+7;

int n, m, a[N], que, p[N], ord[N], btw[N], cst[N];
ll t[4*N][2][2];
vector<ar<int, 3>> e;
vector<int> st[N], wt[N];

void dsu() {
    for(int i=1; i<=n; i++)
        p[i]=i, st[i].push_back(i);
}
int rt(int u) {
    if(p[u]==u)
        return u;
    return p[u]=rt(p[u]);
}
void unite(int u, int v, int w) {
    u=rt(u), v=rt(v);
    if(u==v)
        return;
    if(st[u].size()>st[v].size())
        swap(u, v);
    for(int x : st[u])
        st[v].push_back(x);
    wt[v].push_back(w);
    for(int x : wt[u])
        wt[v].push_back(x);
    p[u]=v;
}
void mrg(int i, int l, int r, int m) {
    for(int a=0; a<2; a++)
        for(int b=0; b<2; b++)
            t[i][a][b]=t[2*i][a][1]+t[2*i+1][1][b];
    for(int a=0; a<2; a++) {
        for(int b=0; b<2; b++) {
            for(int c=0; c<2; c++) {
                for(int d=0; d<2; d++) {
                    if(b+c==1)
                        t[i][a][d]=min(t[i][a][d], t[2*i][a][b]+t[2*i+1][c][d]+btw[m]);
                }
            }
        }
    }
}
void bld(int i, int l, int r) {
    if(l==r) {
        t[i][0][0]=t[i][0][1]=t[i][1][0]=0;
        t[i][1][1]=cst[l];
        return;
    }
    int m=l+r>>1;
    bld(2*i, l, m);
    bld(2*i+1, m+1, r);
    mrg(i, l, r, m);
}
void upd(int i, int l, int r, int p) {
    if(l==r) {
        t[i][0][0]=t[i][0][1]=t[i][1][0]=0;
        t[i][1][1]=cst[l];
        return;
    }
    int m=l+r>>1;
    if(p<=m)
        upd(2*i, l, m, p);
    else
        upd(2*i+1, m+1, r, p);
    mrg(i, l, r, m);
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n >> m;
    for(int i=1; i<=n; i++)
        cin >> a[i];
    for(int i=1; i<=m; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        e.push_back({w, u, v});
    }
    for(int i=1; i<n; i++)
        e.push_back({INF, i, i+1});
    sort(e.begin(), e.end());
    dsu();
    for(auto [w, u, v] : e)
        unite(u, v, w);
    int root=rt(1);
    for(int i=0; i<st[root].size(); i++) {
        ord[st[root][i]]=i;
        if(i+1<st[root].size())
            btw[i]=wt[root][i];
    }
    for(int i=1; i<=n; i++)
        cst[ord[i]]=a[i];
    cin >> que;
    bld(1, 0, n-1);
    while(que--) {
        int id, w;
        cin >> id >> w;
        id=ord[id];
        cst[id]=w;
        upd(1, 0, n-1, id);
        cout << t[1][1][1] << endl;
    }    

    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...