Problem p03768 (C++)

Buggy submission (status: Time Limit Exceeded):

// Problem : B - Splatter Painting
// Contest : AtCoder - AtCoder Grand Contest 012
// URL : https://atcoder.jp/contests/agc012/tasks/agc012_b
// Memory Limit : 256 MB
// Time Limit : 2000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define ll long long
#define int long long
#define mod 1000000007 // 998244353
#define fast                                                                   \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(0);                                                                  \
  cout.tie(0);
#define f(i, n) for (ll i = 0; i < n; i++)
#define fore(i, a, b) for (ll i = (ll)(a); i <= (ll)(b); ++i)
#define nl "\n"
#define trace(x) cerr << #x << ": " << x << " " << endl
#define trace2(x, y) cerr << #x << ": " << x << " | " << #y << ": " << y << endl
#define trace3(x, y, z)                                                        \
  cerr << #x << ":" << x << " | " << #y << ": " << y << " | " << #z << ": "    \
       << z << endl
#define trace4(a, b, c, d)                                                     \
  cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": "   \
       << c << " | " << #d << ": " << d << endl
#define cout1(a) cout << a << nl
#define cout2(a, b) cout << a << " " << b << nl
#define cout3(a, b, c) cout << a << " " << b << " " << c << nl
#define cout4(a, b, c, d) cout << a << " " << b << " " << c << " " << d << nl
#define vcout(v, i) cout << v[i].fi << " " << v[i].se << nl
#define x first
#define y second
#define vc vector
#define pb push_back
#define ar array
#define all(a) (a).begin(), (a).end()
#define ms(v, n, x) fill(v, v + n, x);
#define init(c, a) memset(c, a, sizeof(c))
#define pll pair<ll, ll>
#define mll map<ll, ll>
#define sll set<ll>
#define vll vector<ll>
#define vpll vector<pll>
#define inf 9e18
#define cases                                                                  \
  ll T;                                                                        \
  cin >> T;                                                                    \
  while (T--)
#define BLOCK 500
// const double PI = 3.141592653589793238460;
template <typename T> bool mmax(T &m, const T q) {
  if (m < q) {
    m = q;
    return true;
  } else
    return false;
}
template <typename T> bool mmin(T &m, const T q) {
  if (m > q) {
    m = q;
    return true;
  } else
    return false;
}
typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
void __print(int x) { cerr << x; }
void __print(long x) { cerr << x; }
// void __print(long long x) {cerr << x;}
void __print(unsigned x) { cerr << x; }
void __print(unsigned long x) { cerr << x; }
void __print(unsigned long long x) { cerr << x; }
void __print(float x) { cerr << x; }
void __print(double x) { cerr << x; }
void __print(long double x) { cerr << x; }
void __print(char x) { cerr << '\'' << x << '\''; }
void __print(const char *x) { cerr << '\"' << x << '\"'; }
void __print(const string &x) { cerr << '\"' << x << '\"'; }
void __print(bool x) { cerr << (x ? "true" : "false"); }

template <typename T, typename V> void __print(const pair<T, V> &x) {
  cerr << '{';
  __print(x.first);
  cerr << ',';
  __print(x.second);
  cerr << '}';
}
template <typename T> void __print(const T &x) {
  int f = 0;
  cerr << '{';
  for (auto &i : x)
    cerr << (f++ ? "," : ""), __print(i);
  cerr << "}";
}
void _print() { cerr << "]\n"; }
template <typename T, typename... V> void _print(T t, V... v) {
  __print(t);
  if (sizeof...(v))
    cerr << ", ";
  _print(v...);
}
#ifndef ONLINE_JUDGE
#define debug(x...)                                                            \
  cerr << "[" << #x << "] = [";                                                \
  _print(x)
#else
#define debug(x...)
#endif

std::mt19937
    rng((int)std::chrono::steady_clock::now().time_since_epoch().count());

const int N = 1 << 18;
ll n, m;
// vll g[N];

ll col[N];

ll seen[N];

ll t = 1;

ll vis[N][15];

vll g[N];

void bfs(ll v, ll d, ll c) {
  if (d < 0)
    return;

  seen[v] = t;

  queue<pll> q;

  q.push({v, d});

  while (!q.empty()) {

    ll u = q.front().x;
    ll x = q.front().y;

    q.pop();

    if (x < 0)
      continue;

    vis[u][x] = 1;

    if (!col[u])
      col[u] = c;

    for (auto to : g[u]) {
      if (seen[to] != t and !vis[to][x]) {
        seen[to] = t;
        q.push({to, x - 1});
      }
    }
  }
}

int32_t main() {

  fast cout << fixed << setprecision(12);

  cin >> n >> m;
  f(i, m) {
    ll a, b;
    cin >> a >> b;
    g[a].pb(b);
    g[b].pb(a);
  }

  vc<pair<ll, pll>> queries;
  ll q;
  cin >> q;

  f(i, q) {
    ll v, d, c;
    cin >> v >> d >> c;
    queries.pb({v, {d, c}});
  }

  reverse(all(queries));

  for (auto i : queries) {
    ll v = i.x;
    ll d = i.y.x;
    ll c = i.y.y;

    bfs(v, d, c);
    t++;
  }

  fore(i, 1, n) cout << col[i] << nl;

  return 0;
}

Fixed submission:

// Problem : B - Splatter Painting
// Contest : AtCoder - AtCoder Grand Contest 012
// URL : https://atcoder.jp/contests/agc012/tasks/agc012_b
// Memory Limit : 256 MB
// Time Limit : 2000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)

#include <bits/stdc++.h>
using namespace std;
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define ll long long
#define int long long
#define mod 1000000007 // 998244353
#define fast                                                                   \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(0);                                                                  \
  cout.tie(0);
#define f(i, n) for (ll i = 0; i < n; i++)
#define fore(i, a, b) for (ll i = (ll)(a); i <= (ll)(b); ++i)
#define nl "\n"
#define trace(x) cerr << #x << ": " << x << " " << endl
#define trace2(x, y) cerr << #x << ": " << x << " | " << #y << ": " << y << endl
#define trace3(x, y, z)                                                        \
  cerr << #x << ":" << x << " | " << #y << ": " << y << " | " << #z << ": "    \
       << z << endl
#define trace4(a, b, c, d)                                                     \
  cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": "   \
       << c << " | " << #d << ": " << d << endl
#define cout1(a) cout << a << nl
#define cout2(a, b) cout << a << " " << b << nl
#define cout3(a, b, c) cout << a << " " << b << " " << c << nl
#define cout4(a, b, c, d) cout << a << " " << b << " " << c << " " << d << nl
#define vcout(v, i) cout << v[i].fi << " " << v[i].se << nl
#define x first
#define y second
#define vc vector
#define pb push_back
#define ar array
#define all(a) (a).begin(), (a).end()
#define ms(v, n, x) fill(v, v + n, x);
#define init(c, a) memset(c, a, sizeof(c))
#define pll pair<ll, ll>
#define mll map<ll, ll>
#define sll set<ll>
#define vll vector<ll>
#define vpll vector<pll>
#define inf 9e18
#define cases                                                                  \
  ll T;                                                                        \
  cin >> T;                                                                    \
  while (T--)
#define BLOCK 500
// const double PI = 3.141592653589793238460;
template <typename T> bool mmax(T &m, const T q) {
  if (m < q) {
    m = q;
    return true;
  } else
    return false;
}
template <typename T> bool mmin(T &m, const T q) {
  if (m > q) {
    m = q;
    return true;
  } else
    return false;
}
typedef std::complex<double> Complex;
typedef std::valarray<Complex> CArray;
void __print(int x) { cerr << x; }
void __print(long x) { cerr << x; }
// void __print(long long x) {cerr << x;}
void __print(unsigned x) { cerr << x; }
void __print(unsigned long x) { cerr << x; }
void __print(unsigned long long x) { cerr << x; }
void __print(float x) { cerr << x; }
void __print(double x) { cerr << x; }
void __print(long double x) { cerr << x; }
void __print(char x) { cerr << '\'' << x << '\''; }
void __print(const char *x) { cerr << '\"' << x << '\"'; }
void __print(const string &x) { cerr << '\"' << x << '\"'; }
void __print(bool x) { cerr << (x ? "true" : "false"); }

template <typename T, typename V> void __print(const pair<T, V> &x) {
  cerr << '{';
  __print(x.first);
  cerr << ',';
  __print(x.second);
  cerr << '}';
}
template <typename T> void __print(const T &x) {
  int f = 0;
  cerr << '{';
  for (auto &i : x)
    cerr << (f++ ? "," : ""), __print(i);
  cerr << "}";
}
void _print() { cerr << "]\n"; }
template <typename T, typename... V> void _print(T t, V... v) {
  __print(t);
  if (sizeof...(v))
    cerr << ", ";
  _print(v...);
}
#ifndef ONLINE_JUDGE
#define debug(x...)                                                            \
  cerr << "[" << #x << "] = [";                                                \
  _print(x)
#else
#define debug(x...)
#endif

std::mt19937
    rng((int)std::chrono::steady_clock::now().time_since_epoch().count());

const int N = 1 << 18;
ll n, m;
// vll g[N];

ll col[N];

ll seen[N];

ll t = 1;

ll vis[N][15];

vll g[N];

void bfs(ll v, ll d, ll c) {
  if (d < 0)
    return;

  seen[v] = t;

  queue<pll> q;

  q.push({v, d});

  while (!q.empty()) {

    ll u = q.front().x;
    ll x = q.front().y;

    q.pop();

    if (x < 0)
      continue;

    vis[u][x] = 1;

    if (!col[u])
      col[u] = c;

    for (auto to : g[u]) {
      if (seen[to] != t and !vis[to][x - 1]) {
        seen[to] = t;
        q.push({to, x - 1});
      }
    }
  }
}

int32_t main() {

  fast cout << fixed << setprecision(12);

  cin >> n >> m;
  f(i, m) {
    ll a, b;
    cin >> a >> b;
    g[a].pb(b);
    g[b].pb(a);
  }

  vc<pair<ll, pll>> queries;
  ll q;
  cin >> q;

  f(i, q) {
    ll v, d, c;
    cin >> v >> d >> c;
    queries.pb({v, {d, c}});
  }

  reverse(all(queries));

  for (auto i : queries) {
    ll v = i.x;
    ll d = i.y.x;
    ll c = i.y.y;

    bfs(v, d, c);
    t++;
  }

  fore(i, 1, n) cout << col[i] << nl;

  return 0;
}