제출 #853510

#제출 시각아이디문제언어결과실행 시간메모리
853510lolismekRestore Array (RMI19_restore)C++14
100 / 100
557 ms41260 KiB
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>

#define pii pair <int, int>

using namespace std;

const int NMAX = 5001;
const int INF = 1e9 + 1;

vector <pii> adj[NMAX + 1];

int d[NMAX + 1];

bool inq[NMAX + 1];
int f[NMAX + 1];

int ans[NMAX + 1];

int main(){

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

    for(int i = 1; i <= m; i++){
        int l, r, k, v;
        cin >> l >> r >> k >> v;
        ++l, ++r;

        int a, b, c;

        if(v == 1){
            a = r, b = l - 1, c = -((r - l + 1) - k + 1);
        }else{
            a = l - 1, b = r, c = (r - l + 1) - k;
        }
        adj[a].push_back({b, c});
    }

    for(int i = 0; i <= n; i++){
        d[i] = INF;
    }

    int source = 0;

    for(int i = n; i >= 1; i--){
        adj[i].push_back({i - 1, 0});
        adj[i - 1].push_back({i, 1});
    }

    queue <int> Q;
    Q.push(source);
    d[source] = 0;
    inq[source] = true;

    while(!Q.empty()){
        int node = Q.front();
        Q.pop();

        inq[node] = false;

        if(++f[node] > n){
            cout << -1 << '\n';
            exit(0);
        }

        for(pii vec : adj[node]){
            if(d[node] + vec.second < d[vec.first]){
                
                d[vec.first] = d[node] + vec.second;
                if(!inq[vec.first]){
                    Q.push(vec.first);
                }
            }
        }
    }

    vector <pii> aux;
    for(int i = 1; i <= n; i++){
        if(d[i] != INF){
            aux.push_back({i, d[i]});
        }
    }

    sort(aux.begin(), aux.end());

    int mini = INF;
    for(int i = 0; i <= n; i++){
        mini = min(mini, d[i]);
    }

    for(int i = (int)aux.size() - 1; i >= 0; i--){
        int r = aux[i].second;
        int sz = aux[i].first;
        if(i > 0){
            r -= aux[i - 1].second;
            sz -= aux[i - 1].first;
        }

        if(r > sz){
            cout << -1 << '\n';
            exit(0);
        }

        for(int j = aux[i].first; r > 0; j--, r--){
            ans[j] = 1;
        }
    }

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

    return 0;
}

/*
5 1
0 4 3 1
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...