結果

問題 No.3568 Range Restriction
コンテスト
ユーザー hos.lyric
提出日時 2026-06-05 22:36:50
言語 C++14
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=c++14 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 182 ms / 2,000 ms
コード長 2,994 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,182 ms
コンパイル使用メモリ 151,988 KB
実行使用メモリ 34,816 KB
最終ジャッジ日時 2026-06-06 05:19:37
合計ジャッジ時間 10,136 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_1
純コード判定待ち
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 21
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <chrono>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

using namespace std;

using Int = long long;

template <class T> ostream &operator<<(ostream &os, const vector<T> &as);
template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; };
template <class T> ostream &operator<<(ostream &os, const vector<T> &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; }
template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; }
template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; }
template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; }
#define COLOR(s) ("\x1b[" s "m")


int N, M;
vector<int> X, Y, Z;
vector<Int> V, L, R;

int main() {
  for (int numCases; ~scanf("%d", &numCases); ) { for (int caseId = 1; caseId <= numCases; ++caseId) {
    scanf("%d%d", &N, &M);
    X.resize(M);
    Y.resize(M);
    Z.resize(M);
    V.resize(M);
    L.resize(M);
    R.resize(M);
    for (int i = 0; i < M; ++i) {
      scanf("%d%d%d%lld%lld%lld", &X[i], &Y[i], &Z[i], &V[i], &L[i], &R[i]);
      --X[i];
      --Y[i];
      --Z[i];
    }
    
    vector<Int> as(N, 0);
    queue<int> que;
    vector<int> vis(M, 0);
    using Entry = pair<Int, int>;
    vector<priority_queue<Entry, vector<Entry>, greater<Entry>>> alarms(N);
    
    auto check = [&](int i) -> void {
      if (vis[i]) return;
      const Int b = as[X[i]] + as[Y[i]];
      if (b >= V[i]) {
        vis[i] = 1;
        que.push(i);
      } else {
        const Int t = (V[i] - b + 1) / 2;
        alarms[X[i]].emplace(as[X[i]] + t, i);
        alarms[Y[i]].emplace(as[Y[i]] + t, i);
      }
    };
    for (int i = 0; i < M; ++i) check(i);
    for (; que.size(); ) {
      const int i = que.front();
      que.pop();
      const int u = Z[i];
      chmax(as[u], L[i]);
      for (; alarms[u].size() && alarms[u].top().first <= as[u]; ) {
        const int j = alarms[u].top().second;
        alarms[u].pop();
        check(j);
      }
    }
    
    bool ok = true;
    for (int i = 0; i < M; ++i) if (as[X[i]] + as[Y[i]] >= V[i]) ok = ok && (as[Z[i]] <= R[i]);
    if (ok) {
      for (int u = 0; u < N; ++u) {
        if (u) printf(" ");
        printf("%lld", as[u]);
      }
      puts("");
    } else {
      puts("-1");
    }
  }
#ifndef LOCAL
  break;
#endif
  }
  return 0;
}
0