Submission #1607803


Source Code Expand

/**
 * 最後に塗った色が優先されるので、クエリ列をケツから処理することで計
 * 算量を減らす
 */

// #include {{{
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cfloat>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <forward_list>
#include <functional>
#include <iomanip>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iterator>
#include <limits>
#include <list>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <stack>
#include <string>
#include <tuple>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

#ifdef DEBUG
#include <fmt/format.h>
#endif

using namespace std;
// }}}

// type {{{
using  s8 =   int8_t;
using  u8 =  uint8_t;
using s16 =  int16_t;
using u16 = uint16_t;
using s32 =  int32_t;
using u32 = uint32_t;
using s64 =  int64_t;
using u64 = uint64_t;

template<typename T>
using max_heap = priority_queue<T, vector<T>, less<T>>;
template<typename T>
using min_heap = priority_queue<T, vector<T>, greater<T>>;
// }}}

// 適宜調整
//#define int s64
constexpr bool IOS_SYNCSTDIO = false;
constexpr int  IOS_PREC      = 10;

constexpr int    INF = numeric_limits<int>::max();
constexpr double EPS = 1e-9;

// util {{{
template<typename T>
constexpr int sgn(T x)
{
    return (x > T(0)) - (x < T(0));
}

template<typename T>
constexpr typename enable_if<is_signed<T>::value,T>::type modulo(T a, T b)
{
    assert(b > 0);
    T r = a % b;
    return r >= 0 ? r : r+b;
}

template<typename T>
constexpr T clamp(T x, T lo, T hi)
{
    assert(lo <= hi);
    if(x < lo)
        return lo;
    else if(x > hi)
        return hi;
    else
        return x;
}

int sqrti(int x)
{
    assert(x >= 0);
    return static_cast<int>(sqrt(x));
}

s64 sqrtl(s64 x)
{
    assert(x >= 0);
    return static_cast<s64>(sqrtl(x));
}

template<typename T>
bool max_update(T& xmax, const T& x)
{
    if(x > xmax) {
        xmax = x;
        return true;
    }
    else {
        return false;
    }
}

template<typename T>
bool min_update(T& xmin, const T& x)
{
    if(x < xmin) {
        xmin = x;
        return true;
    }
    else {
        return false;
    }
}

template<typename T>
constexpr int SIZE(const T& c)
{
    return static_cast<int>(c.size());
}

template<typename T, size_t N>
constexpr int SIZE(const T (&)[N])
{
    return static_cast<int>(N);
}

ostream& FPRINT(ostream& out) { return out; }

template<typename T, typename... TS>
ostream& FPRINT(ostream& out, const T& x, const TS& ...args)
{
    out << x;
    if(sizeof...(args))
        out << ' ';
    return FPRINT(out, args...);
}

template<typename... TS>
ostream& FPRINTLN(ostream& out, const TS& ...args)
{
    FPRINT(out, args...);
    return out << '\n';
}

template<typename InputIt>
ostream& FPRINTSEQ(ostream& out, InputIt first, InputIt last)
{
    for(InputIt it = first; it != last; ++it) {
        if(it != first) out << ' ';
        out << *it;
    }
    return out;
}

template<typename T, size_t N>
ostream& FPRINTARRAY1(ostream& out, const T (&c)[N])
{
    return FPRINTSEQ(out, cbegin(c), cend(c));
}

template<typename T, size_t N1, size_t N2>
ostream& FPRINTARRAY2(ostream& out, const T (&c)[N1][N2])
{
    out << '\n';
    for(const auto& e : c) {
        FPRINTARRAY1(out, e) << '\n';
    }
    return out;
}

template<typename... TS>
ostream& PRINT(const TS& ...args)
{
    return FPRINT(cout, args...);
}

template<typename... TS>
ostream& PRINTLN(const TS& ...args)
{
    return FPRINTLN(cout, args...);
}

template<typename InputIt>
ostream& PRINTSEQ(InputIt first, InputIt last)
{
    return FPRINTSEQ(cout, first, last);
}

template<typename T, size_t N>
ostream& PRINTARRAY1(const T (&c)[N])
{
    return FPRINTARRAY1(cout, c);
}

template<typename T, size_t N1, size_t N2>
ostream& PRINTARRAY2(const T (&c)[N1][N2])
{
    return FPRINTARRAY2(cout, c);
}

template<typename... TS>
ostream& DPRINT(const TS& ...args)
{
    return FPRINT(cerr, args...);
}

template<typename... TS>
ostream& DPRINTLN(const TS& ...args)
{
    return FPRINTLN(cerr, args...);
}

template<typename InputIt>
ostream& DPRINTSEQ(InputIt first, InputIt last)
{
    return FPRINTSEQ(cerr, first, last);
}

template<typename T, size_t N>
ostream& DPRINTARRAY1(const T (&c)[N])
{
    return FPRINTARRAY1(cerr, c);
}

template<typename T, size_t N1, size_t N2>
ostream& DPRINTARRAY2(const T (&c)[N1][N2])
{
    return FPRINTARRAY2(cerr, c);
}

template<typename T1, typename T2>
ostream& operator<<(ostream& out, const pair<T1,T2>& p)
{
    return out << '(' << p.first << ',' << p.second << ')';
}

template<typename T>
ostream& operator<<(ostream& out, const vector<T>& c)
{
    return FPRINTSEQ(out, cbegin(c), cend(c));
}

template<typename T>
ostream& operator<<(ostream& out, const vector<vector<T>>& c)
{
    out << '\n';
    for(const auto& e : c) {
        out << e << '\n';
    }
    return out;
}

template<typename T>
ostream& operator<<(ostream& out, const deque<T>& c)
{
    return FPRINTSEQ(out, cbegin(c), cend(c));
}

template<typename T>
ostream& operator<<(ostream& out, const list<T>& c)
{
    return FPRINTSEQ(out, cbegin(c), cend(c));
}

template<typename T>
ostream& operator<<(ostream& out, const forward_list<T>& c)
{
    return FPRINTSEQ(out, cbegin(c), cend(c));
}

template<typename T>
ostream& operator<<(ostream& out, const set<T>& c)
{
    return FPRINTSEQ(out, cbegin(c), cend(c));
}

template<typename T>
ostream& operator<<(ostream& out, const unordered_set<T>& c)
{
    return out << set<T>(cbegin(c), cend(c));
}

template<typename T, size_t N>
ostream& operator<<(ostream& out, const array<T,N>& c)
{
    return FPRINTSEQ(out, cbegin(c), cend(c));
}

template<typename InputIt>
ostream& FPRINTMAP(ostream& out, InputIt first, InputIt last)
{
    out << "{\n";
    for(auto it = first; it != last; ++it) {
        out << "  " << it->first << " : " << it->second << '\n';
    }
    out << "}\n";
    return out;
}

template<typename InputIt>
ostream& PRINTMAP(InputIt first, InputIt last)
{
    return FPRINTMAP(cout, first, last);
}

template<typename InputIt>
ostream& DPRINTMAP(InputIt first, InputIt last)
{
    return FPRINTMAP(cerr, first, last);
}

template<typename K, typename V>
ostream& operator<<(ostream& out, const map<K,V>& c)
{
    return FPRINTMAP(out, cbegin(c), cend(c));
}

template<typename K, typename V>
ostream& operator<<(ostream& out, const unordered_map<K,V>& c)
{
    return out << map<K,V>(cbegin(c), cend(c));
}

template<typename T, typename C>
ostream& operator<<(ostream& out, stack<T,C> c)
{
    while(!c.empty()) {
        out << c.top();
        c.pop();
        if(!c.empty()) out << ' ';
    }
    return out;
}

template<typename T, typename C>
ostream& operator<<(ostream& out, queue<T,C> c)
{
    while(!c.empty()) {
        out << c.front();
        c.pop();
        if(!c.empty()) out << ' ';
    }
    return out;
}

template<typename T, typename Cont, typename Cmp>
ostream& operator<<(ostream& out, priority_queue<T,Cont,Cmp> c)
{
    while(!c.empty()) {
        out << c.top();
        c.pop();
        if(!c.empty()) out << ' ';
    }
    return out;
}

struct IosIni {
    IosIni()
    {
        cin.tie(nullptr);
        ios::sync_with_stdio(IOS_SYNCSTDIO);
        cout << fixed << setprecision(IOS_PREC);
    }
} IOSINI;

#define FOR(i, start, end) for(int i = (start); i < (end); ++i)
#define REP(i, n) FOR(i, 0, n)

#define ALL(f,cc,...) ([&](decltype((cc)) c) { return (f)(begin(c), end(c), ## __VA_ARGS__); })(cc)

#define DBG(x) DPRINTLN('L', __LINE__, ':', #x, ':', (x))
// }}}

struct Query {
    int v;
    int d;
    int c;
    Query(int vv, int dd, int cc) : v(vv), d(dd), c(cc) {}
};
ostream& operator<<(ostream& out, const Query& q)
{
    return out << '(' << q.v << ',' << q.d << ',' << q.c << ')';
}

int N, M;
vector<vector<int>> G;
deque<Query> Q; // 逆順

vector<int> C; // 頂点vは色C[v]だよ
vector<int> R; // 頂点vから距離R[v]の範囲は確定したよ(初期値-1)

void bfs(int start, int range, int c)
{
    static deque<bool> visited(N);
    queue<pair<int,int>> que;

    ALL(fill, visited, false);

    que.push(make_pair(start,range));
    while(!que.empty()) {
        auto p = que.front(); que.pop();
        int v = p.first;
        int d = p.second;

        if(R[v] >= d) continue;
        if(R[v] < 0) C[v] = c;
        R[v] = d;
        visited[v] = true;

        if(d == 0) continue;

        for(int u : G[v]) {
            if(visited[u]) continue;
            que.push(make_pair(u,d-1));
        }
    }
}

void solve()
{
    C.resize(N);
    R.assign(N, -1);

    int QN; cin >> QN;
    REP(_, QN) {
        int v, d, c; cin >> v >> d >> c;
        --v; // 0-based
        Q.emplace_front(v,d,c);
    }
#ifdef DEBUG
    DBG(Q);
#endif

    for(const auto& q : Q) {
        bfs(q.v, q.d, q.c);
#ifdef DEBUG
        DBG(C);
#endif
    }

    REP(v, N) {
        PRINTLN(C[v]);
    }
}

signed main(signed /*argc*/, char** /*argv*/)
{
    cin >> N >> M;
    G.resize(N);

    REP(_, M) {
        int a, b; cin >> a >> b;
        --a; --b; // 0-based
        G[a].push_back(b);
        G[b].push_back(a);
    }

    solve();

    return 0;
}

Submission Info

Submission Time
Task B - Splatter Painting
User yumsiim
Language C++14 (GCC 5.4.1)
Score 200
Code Size 9332 Byte
Status TLE
Exec Time 2104 ms
Memory 9600 KB

Judge Result

Set Name Sample Subtask1 All
Score / Max Score 0 / 0 200 / 200 0 / 500
Status
AC × 2
AC × 19
AC × 28
TLE × 7
Set Name Test Cases
Sample 00_example_01.txt, 00_example_02.txt
Subtask1 00_example_01.txt, 00_example_02.txt, 10_01.txt, 10_02.txt, 10_03.txt, 10_04.txt, 10_05.txt, 10_06.txt, 10_07.txt, 10_08.txt, 10_09.txt, 10_10.txt, 10_11.txt, 10_12.txt, 10_13.txt, 10_14.txt, 10_15.txt, 10_16.txt, 10_17.txt
All 00_example_01.txt, 00_example_02.txt, 10_01.txt, 10_02.txt, 10_03.txt, 10_04.txt, 10_05.txt, 10_06.txt, 10_07.txt, 10_08.txt, 10_09.txt, 10_10.txt, 10_11.txt, 10_12.txt, 10_13.txt, 10_14.txt, 10_15.txt, 10_16.txt, 10_17.txt, 20_01.txt, 20_02.txt, 20_03.txt, 20_04.txt, 20_05.txt, 20_06.txt, 20_07.txt, 20_08.txt, 20_09.txt, 20_10.txt, 20_11.txt, 20_12.txt, 20_13.txt, 20_14.txt, 20_15.txt, 20_16.txt
Case Name Status Exec Time Memory
00_example_01.txt AC 1 ms 256 KB
00_example_02.txt AC 1 ms 256 KB
10_01.txt AC 2 ms 256 KB
10_02.txt AC 1 ms 256 KB
10_03.txt AC 1 ms 256 KB
10_04.txt AC 1 ms 256 KB
10_05.txt AC 2 ms 256 KB
10_06.txt AC 1 ms 256 KB
10_07.txt AC 1 ms 384 KB
10_08.txt AC 4 ms 384 KB
10_09.txt AC 5 ms 384 KB
10_10.txt AC 4 ms 384 KB
10_11.txt AC 4 ms 384 KB
10_12.txt AC 4 ms 384 KB
10_13.txt AC 2 ms 384 KB
10_14.txt AC 2 ms 384 KB
10_15.txt AC 2 ms 384 KB
10_16.txt AC 5 ms 512 KB
10_17.txt AC 5 ms 384 KB
20_01.txt TLE 2104 ms 7552 KB
20_02.txt TLE 2104 ms 7552 KB
20_03.txt TLE 2103 ms 9600 KB
20_04.txt AC 17 ms 1428 KB
20_05.txt AC 5 ms 384 KB
20_06.txt AC 186 ms 3584 KB
20_07.txt AC 6 ms 384 KB
20_08.txt AC 54 ms 1280 KB
20_09.txt AC 5 ms 384 KB
20_10.txt AC 51 ms 1280 KB
20_11.txt AC 79 ms 1664 KB
20_12.txt AC 387 ms 6528 KB
20_13.txt TLE 2104 ms 7168 KB
20_14.txt TLE 2104 ms 7296 KB
20_15.txt TLE 2104 ms 9096 KB
20_16.txt TLE 2104 ms 9096 KB