제출 #1170586

#제출 시각아이디문제언어결과실행 시간메모리
1170586InvMODRestore Array (RMI19_restore)C++20
100 / 100
256 ms808 KiB
#include<bits/stdc++.h>

using namespace std;

#define sz(v) (int)(v).size()

struct Edge{
    int u,v,w;
    Edge(int _u = 0, int _v = 0, int _w = 0){
        u = _u,
        v = _v,
        w = _w;
    }
};

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

    int n,m; cin >> n >> m;

    vector<Edge> E;

    for(int i = 0; i < m; i++){
        int l,r,k,value;

        cin >> l >> r >> k >> value;

        /*
            k = 0:
            pref[r] - pref[l - 1] <= (r - l + 1) - k

            pref[l - 1] + (r - l + 1) - k >= pref[r]

            k = 1:

            pref[r] - pref[l - 1] >= (r - l + 1) - k + 1

            pref[r] - (r - l + 1) + k - 1 >= pref[l - 1]
        */

        l++, r++;

        if(!value){
            E.emplace_back(l - 1, r, (r - l + 1) - k);
        }
        else{
            E.emplace_back(r, l - 1, -(r - l + 1) + k - 1);
        }
    }

    // pref[i] + 1 >= pref[i + 1]
    // pref[i + 1] >= pref[i]
    for(int i = 1; i <= n; i++){
        E.emplace_back(i - 1, i, 1);
        E.emplace_back(i, i - 1, 0);
    }

    vector<int> ans(n + 1, n + 1);

    ans[0] = 0;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < sz(E); j++){
            int u = E[j].u, v = E[j].v, w = E[j].w;

            if(ans[u] + w < ans[v]){
                ans[v] = ans[u] + w;
            }
        }
    }

    for(int j = 0; j < sz(E); j++){
        int u = E[j].u, v = E[j].v, w = E[j].w;

        if(ans[u] + w < ans[v]){
            cout << "-1\n";
            return 0;
        }
    }

    for(int i = 1; i <= n; i++){
        cout << ans[i] - ans[i - 1] << " ";
    } cout << "\n";

    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...