QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#878020#8591. ShopsNauclhlt24 223ms43128kbC++1724.2kb2025-02-01 13:06:522025-02-01 13:06:54

Judging History

你现在查看的是最新测评结果

  • [2025-02-01 13:06:54]
  • 评测
  • 测评结果:24
  • 用时:223ms
  • 内存:43128kb
  • [2025-02-01 13:06:52]
  • 提交

answer

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#include <random>

using namespace std;

using ll = long long;

template <typename T>
struct Edge
{
    int From;
    int To;
    T Weight;

public:
    Edge(int from, int to, T weight)
    {
        From = from;
        To = to;
        Weight = weight;
    }
};

struct Point 
{
public:
    int X;
    int Y;

    Point(int x, int y)
    {
        X = x;
        Y = y;
    }

    friend bool operator==(Point left, Point right)
    {
        return left.X == right.X && left.Y == right.Y;
    }

    friend bool operator<(Point left, Point right)
    {
        return tie(left.X, left.Y) < tie(right.X, right.Y);
    }
};

struct PointHash
{
    size_t operator()(Point point)
    {
        return hash<int>()(point.X) ^ hash<int>()(point.Y);
    }
};


class UnionFind
{
private:
    vector<int> _parents;
    vector<int> _size;
    int _vertexCount;

public:
    UnionFind(int n)
    {
        _vertexCount = n;
        _parents.resize(n);
        _size.resize(n);
        for (int i = 0; i < n; i++)
        {
            _size[i] = 1;
            _parents[i] = i;
        }
    }

    int Root(int x)
    {
        if (_parents[x] == x) return x;
        
        return _parents[x] = Root(_parents[x]);
    }

    int Size(int x)
    {
        return _size[Root(x)];
    }

    void Unite(int x, int y)
    {
        int rootX = Root(x);
        int rootY = Root(y);

        if (rootX == rootY) return;

        int from = rootX;
        int to = rootY;

        if (_size[from] > _size[to])
        {
            swap(from, to);
        }

        _size[to] += _size[from];
        _parents[from] = to;
    }

    vector<int> Find(int x)
    {
        int root = Root(x);
        vector<int> set;
        for (int i = 0; i < _vertexCount; i++)
        {
            if (Root(i) == root)
            {
                set.push_back(i);
            }
        }

        return set;
    }

    unordered_map<int, vector<int>> FindAll()
    {
        unordered_map<int, vector<int>> sets;
        for (int i = 0; i < _vertexCount; i++)
        {
            int root = Root(i);
            if (sets.find(root) != sets.end())
            {
                sets[root].push_back(i);
            }
            else
            {
                sets.emplace(root, vector<int>());
                sets[root].push_back(i);
            }
        }

        return sets;
    }

    bool Same(int x, int y)
    {
        int rootX = Root(x);
        int rootY = Root(y);
        return rootX == rootY;
    }

    void Clear()
    {
        for (int i = 0; i < _vertexCount; i++)
        {
            _parents[i] = i;
            _size[i] = 1;
        }
    }

    int VertexCount()
    {
        return _vertexCount;
    }
};

template <typename T>
class Imos
{
private:
    vector<T> _data;

public:
    Imos(int length)
    {
        _data.resize(length, 0);
    }

    Imos(vector<T>& array)
    {
        _data = array;
    }

    void AddQueryLen(int start, int length, T value)
    {
        AddQuery(start, start + length, value);
    }

    void AddQuery(int start, int end, T value)
    {
        _data[start] += value;
        if (end < (int)_data.size())
        {
            _data[end] -= value;
        }
    }

    void Accumulate()
    {
        for (int i = 1; i < (int)_data.size(); i++)
        {
            _data[i] += _data[i - 1];
        }
    }

    vector<T> GetData()
    {
        return _data;
    }
};

template <typename T>
class Imos2D
{
private:
    vector<vector<T>> _data;
    int _width;
    int _height;

public:
    Imos2D(vector<vector<T>> data)
    {
        _data = data;
        _height = data.size();
        _width = data[0].size();
    }

    Imos2D(int h, int w)
    {
        _data.resize(h, vector<T>(w, 0));
        _width = w;
        _height = h;
    }

    void AddQuery(int startX, int startY, int endX, int endY, T value)
    {
        _data[startY][startX] += value;
        if (endX < _width)
        {
            _data[startY][endX] -= value;
        }
        if (endY < _height)
        {
            _data[endY][startX] -= value;
        }
        if (endX < _width && endY < _height)
        {
            _data[endY][endX] += value;
        }
    }

    void AddQueryLen(int x, int y, int w, int h, T value)
    {
        AddQuery(x, y, x + w, y + h, value);
    }

    void Accumulate()
    {
        for (int x = 1; x < _width; x++)
        {
            for (int y = 0; y < _height; y++)
            {
                _data[y][x] += _data[y][x - 1];
            }
        }

        for (int y = 1; y < _height; y++)
        {
            for (int x = 0; x < _width; x++)
            {
                _data[y][x] += _data[y - 1][x];
            }
        }
    }

    vector<vector<T>> GetData()
    {
        return _data;
    }
};

template<typename T, T OP(T, T), T APPLY(T, T)>
class SegmentTree
{
private:
    int _treeSize;
    int _dataSize;
    int _originalDataSize;
    vector<T> _data;
    T _identity;

public:
    SegmentTree(int n, T identity)
    {
        _originalDataSize = n;
        _identity = identity;

        int size = 1;
        while (n > size)
        {
            size <<= 1;
        }

        _dataSize = size;
        _treeSize = 2 * size - 1;

        _data.resize(_treeSize, _identity);
    }

    int OriginalDataSize()
    {
        return _originalDataSize;
    }

    int TreeSize()
    {
        return _treeSize;
    }

    T Identity()
    {
        return _identity;
    }

    void Build(vector<T>& array)
    {
        if (_originalDataSize != (int)array.size())
        {
            throw exception();
        }

        for (int i = 0; i < (int)array.size(); i++)
        {
            _data[i + _dataSize - 1] = array[i];
        }

        for (int i = _dataSize - 2; i >= 0; i--)
        {
            _data[i] = OP(_data[(i << 1) + 1], _data[(i << 1) + 2]);
        }
    }

    void Apply(int index, T value)
    {
        index += _dataSize - 1;
        _data[index] = APPLY(_data[index], value);

        while (index > 0)
        {
            index = (index - 1) >> 1;
            _data[index] = OP(_data[(index << 1) + 1], _data[(index << 1) + 2]);
        }
    }

    T Query(int left, int right)
    {
        return QueryRec(left, right, 0, 0, _dataSize);
    }

    const T& operator[](size_t index) const
    {
        return _data[_dataSize - 1 + index];
    }

    T& operator[](size_t index)
    {
        return _data[_dataSize - 1 + index];
    }

private:
    T QueryRec(int left, int right, int index, int l, int r)
    {
        if (left >= r || right <= l)
        {
            return _identity;
        }

        if (left <= l && r <= right)
        {
            return _data[index];
        }

        return OP(QueryRec(left, right, (index << 1) + 1, l, (l + r) / 2), QueryRec(left, right, (index << 1) + 2, (l + r) / 2, r));
    }
};

template <typename T, typename M, T OP(T, T), T MAPPING(T, M, int), T COMPOSITION(T, T)>
class LazySegmentTree
{
private:
    int _treeSize;
    int _dataSize;
    int _originalDataSize;
    vector<T> _data;
    vector<optional<T>> _lazy;
    T _identity;

public:
    LazySegmentTree(int n, T identity)
    {
        _originalDataSize = n;
        _identity = identity;

        int size = 1;
        while (n > size)
        {
            size <<= 1;
        }

        _dataSize = size;
        _treeSize = 2 * size - 1;

        _data.resize(_treeSize, _identity);
        _lazy.resize(_treeSize, nullopt);
    }

    void Build(vector<T>& array)
    {
        if (_originalDataSize != (int)array.size())
        {
            throw exception();
        }

        for (int i = 0; i < (int)array.size(); i++)
        {
            _data[i + _dataSize - 1] = array[i];
        }

        for (int i = _dataSize - 2; i >= 0; i--)
        {
            _data[i] = OP(_data[(i << 1) + 1], _data[(i << 1) + 2]);
        }
    }

    int TreeSize()
    {
        return _treeSize;
    }

    int OriginalDataSize()
    {
        return _originalDataSize;
    }

    void Apply(int left, int right, M m)
    {
        ApplyRec(left, right, m, 0, 0, _dataSize);
    }

    T Query(int left, int right)
    {
        return QueryRec(left, right, 0, 0, _dataSize);
    }

    T GetByIndex(int index)
    {
        if (index < 0 || index >= _originalDataSize)
        {
            throw exception();
        }

        return AccessRec(index, 0, 0, _dataSize);
    }

private:
    void Evaluate(int index, int l, int r)
    {
        if (!_lazy[index].has_value())
        {
            return;
        }

        if (index < _dataSize - 1)
        {
            _lazy[(index << 1) + 1] = GuardComposition(_lazy[(index << 1) + 1], _lazy[index]);
            _lazy[(index << 1) + 2] = GuardComposition(_lazy[(index << 1) + 2], _lazy[index]);
        }

        _data[index] = MAPPING(_data[index], _lazy[index].value(), r - l);
        _lazy[index] = nullopt;
    }

    optional<M> GuardComposition(optional<M> a, optional<M> b)
    {
        if (!a.has_value())
        {
            return b;
        }
        else
        {
            return COMPOSITION(a.value(), b.value());
        }
    }

    void ApplyRec(int left, int right, M m, int index, int l, int r)
    {
        Evaluate(index, l, r);

        if (left <= l && r <= right)
        {
            _lazy[index] = GuardComposition(_lazy[index], m);
            Evaluate(index, l, r);
        }
        else if (left < r && l < right)
        {
            ApplyRec(left, right, m, (index << 1) + 1, l, (l + r) / 2);
            ApplyRec(left, right, m, (index << 1) + 2, (l + r) / 2, r);
            _data[index] = OP(_data[(index << 1) + 1], _data[(index << 1) + 2]);
        }
    }

    T QueryRec(int left, int right, int index, int l, int r)
    {
        Evaluate(index, l, r);

        if (left >= r || right <= l)
        {
            return _identity;
        }

        if (left <= l && r <= right)
        {
            return _data[index];
        }

        return OP(QueryRec(left, right, (index << 1) + 1, l, (l + r) / 2), QueryRec(left, right, (index << 1) + 2, (l + r) / 2, r));
    }

    T AccessRec(int target, int index, int l, int r)
    {
        Evaluate(index, l, r);

        if (index >= _dataSize - 1)
        {
            return _data[index];
        }

        int mid = (l + r) / 2;
        
        if (target < mid)
        {
            return AccessRec(target, (index << 1) + 1, l, mid);
        }
        else
        {
            return AccessRec(target, (index << 1) + 2, mid, r);
        }
    }
};

#define CONST_MOD 998244353LL
//#define CONST_MOD 1000000007LL
struct ModInt
{
    long long Value;

public:
    ModInt()
    {
        Value = 0L;
    }

    ModInt(long long value)
    {
        Value = value;
    }

    ModInt Power(long long exp) const
    {
        if (exp <= -1L)
        {
            return ModInt(1L) / Power(-exp);
        }
        if (exp == 0L)
            return 1L;
        if (exp == 1L)
            return *this;

        ModInt m = Power(exp / 2L);
        m = m * m;
        if (exp % 2L == 1L)
        {
            m = m * (*this);
        }

        return m;
    }

    ModInt Inv() const
    {
        return this->Power(CONST_MOD - 2L);
    }

    ModInt operator+() const
    {
        return *this;
    }

    ModInt operator-() const
    {
        return ModInt(-Value);
    }

    friend ModInt operator+(const ModInt& left, const ModInt& right)
    {
        return ModInt(SafeMod(left.Value + right.Value));
    }

    friend ModInt operator+(const ModInt& left, const long long& right)
    {
        return ModInt(SafeMod(left.Value + right));
    }

    friend ModInt operator+(const long long& left, const ModInt& right)
    {
        return ModInt(SafeMod(left + right.Value));
    }

    ModInt& operator+=(const ModInt& x)
    {
        Value += x.Value;
        Value = SafeMod(Value);

        return *this;
    }

    ModInt& operator+=(const long long& x)
    {
        Value += x;
        Value = SafeMod(Value);

        return *this;
    }

    friend ModInt operator-(const ModInt& left, const ModInt& right)
    {
        return ModInt(SafeMod(left.Value - right.Value));
    }

    friend ModInt operator-(const ModInt& left, const long long& right)
    {
        return ModInt(SafeMod(left.Value - right));
    }

    friend ModInt operator-(const long long& left, const ModInt& right)
    {
        return ModInt(SafeMod(left - right.Value));
    }

    ModInt& operator-=(const ModInt& x)
    {
        Value -= x.Value;
        Value = SafeMod(Value);

        return *this;
    }

    ModInt& operator-=(const long long& x)
    {
        Value -= x;
        Value = SafeMod(Value);

        return *this;
    }

    friend ModInt operator*(const ModInt& left, const ModInt& right)
    {
        return ModInt(SafeMod(left.Value * right.Value));
    }

    friend ModInt operator*(const ModInt& left, const long long& right)
    {
        return ModInt(SafeMod(left.Value * right));
    }

    friend ModInt operator*(const long long& left, const ModInt& right)
    {
        return ModInt(SafeMod(left * right.Value));
    }

    ModInt& operator*=(const ModInt& x)
    {
        Value *= x.Value;
        Value = SafeMod(Value);

        return *this;
    }

    ModInt& operator*=(const long long& x)
    {
        Value *= x;
        Value = SafeMod(Value);

        return *this;
    }

    friend ModInt operator /(const ModInt& left, const ModInt& right)
    {
        ModInt inv = right.Inv();
        return ModInt(SafeMod(left.Value * inv.Value));
    }

    friend ModInt operator/(const ModInt& left, const long long& right)
    {
        return ModInt(SafeMod(left.Value * ModInt(right).Inv().Value));
    }

    friend ModInt operator/(const long long& left, const ModInt& right)
    {
        return ModInt(SafeMod(left * right.Inv().Value));
    }

    ModInt& operator/=(const ModInt& x)
    {
        Value *= x.Inv().Value;
        Value = SafeMod(Value);

        return *this;
    }

    ModInt& operator/=(const long long& x)
    {
        Value *= ModInt(x).Inv().Value;
        Value = SafeMod(Value);

        return *this;
    }

    ModInt& operator++()
    {
        ++Value;
        Value = SafeMod(Value);
        return *this;
    }

    ModInt operator++(int)
    {
        ModInt temp = *this;
        Value++;
        Value = SafeMod(Value);
        return temp;
    }

    ModInt& operator--()
    {
        --Value;
        Value = SafeMod(Value);
        return *this;
    }

    ModInt operator--(int)
    {
        ModInt temp = *this;
        Value--;
        Value = SafeMod(Value);
        return temp;
    }

    inline static ModInt One()
    {
        return ModInt(1L);
    }

    static ModInt Combination(long long n, long long r)
    {
        ModInt c = 1L;
        for (ModInt i = 1; i.Value <= r; i++)
        {
            c = c * (ModInt(n) - i + ModInt::One()) / i;
        }
        return c;
    }

private:
    inline static long long SafeMod(long long a)
    {
        a %= CONST_MOD;
        if (a < 0)
        {
            a += CONST_MOD;
        }
        return a;
    }
};

//

template <typename T>
class Graph
{
private:
    vector<vector<Edge<T>>> _graph;
    vector<Edge<T>> _edges;
    vector<bool> _seen;
    unique_ptr<UnionFind> _uf;
    int _vertexCount;

public:
    Graph(int vertexCount)
    {
        _vertexCount = vertexCount;
        _graph.resize(_vertexCount);
        _edges.reserve(_vertexCount);
        _seen.resize(_vertexCount);
        _uf = NULL;
    }

    int VertexCount()
    {
        return _vertexCount;
    }

    vector<vector<Edge<T>>>& RawGraph()
    {
        return _graph;
    }

    vector<Edge<T>>& Edges()
    {
        return _edges;
    }

    UnionFind DSU()
    {
        return *_uf;
    }

    void AddEdge(int a, int b, T weight)
    {
        if (!Validate(a) || !Validate(b))
        {
            return;
        }

        if (a > b)
        {
            swap(a, b);
        }

        _graph[a].push_back(Edge<T>(a, b, weight));
        _graph[b].push_back(Edge<T>(b, a, weight));
        _edges.push_back(Edge<T>(a, b, weight));
    }

    void SetupDSU()
    {
        _uf.reset(new UnionFind(_vertexCount));
        for (int i = 0; i < (int)_edges.size(); i++)
        {
            _uf->Unite(_edges[i].From, _edges[i].To);
        }
    }

    bool Same(int a, int b)
    {
        if (_uf == nullptr)
        {
            throw exception();
        }
        return _uf->Same(a, b);
    }

    unordered_map<int, vector<int>> GetConnectedComponents()
    {
        if (_uf == nullptr)
        {
            throw exception();
        }
        return _uf->FindAll();
    }

    void DijkstraFrom(int n, vector<T>& map)
    {
        if (!Validate(n))
        {
            return;
        }

        fill(_seen.begin(), _seen.end(), false);

        fill(map.begin(), map.end(), numeric_limits<T>::max());
        map[n] = 0;

        priority_queue<pair<T, int>, vector<pair<T, int>>, greater<pair<T, int>>> pq;
        pq.emplace(0, n);

        while (!pq.empty())
        {
            T c = pq.top().first;
            int p = pq.top().second;
            pq.pop();

            if (_seen[p])
            {
                continue;
            }

            _seen[p] = true;

            vector<Edge<T>>& ch = _graph[p];
            for (int i = 0; i < (int)ch.size(); i++)
            {
                T w = map[p] + ch[i].Weight;
                if (w < map[ch[i].To])
                {
                    map[ch[i].To] = w;
                    pq.emplace(w, ch[i].To);
                }
            }
        }
    }

    vector<vector<T>> WarshallFloyd()
    {
        if (_vertexCount > 800)
        {
            throw exception();
        }

        T inf = numeric_limits<T>::max();

        vector<vector<T>> map(_vertexCount, vector<T>(_vertexCount, inf));

        for (int i = 0; i < _vertexCount; i++)
        {
            map[i][i] = 0;
        }

        for (int i = 0; i < (int)_edges.size(); i++)
        {
            map[_edges[i].From][_edges[i].To] = min(_edges[i].Weight, map[_edges[i].From][_edges[i].To]);
            map[_edges[i].To][_edges[i].From] = min(_edges[i].Weight, map[_edges[i].To][_edges[i].From]);
        }

        for (int k = 0; k < _vertexCount; k++)
        {
            for (int j = 0; j < _vertexCount; j++)
            {
                for (int i = 0; i < _vertexCount; i++)
                {
                    if (map[i][k] != inf && map[k][j] != inf)
                    {
                        if (map[i][k] + map[k][j] < map[i][j])
                        {
                            map[i][j] = map[i][k] + map[k][j];
                        }
                    }
                }
            }
        }

        return map;
    }

    void BfsFrom(int n, vector<T>& map)
    {
        if (!Validate(n))
        {
            return;
        }

        fill(_seen.begin(), _seen.end(), false);

        map[n] = 0;

        queue<pair<int, T>> queue;

        queue.emplace(n, 0);

        while (!queue.empty())
        {
            int p = queue.front().first;
            T w = queue.front().second;
            queue.pop();

            if (_seen[p])
                continue;

            _seen[p] = true;
            map[p] = w;

            vector<Edge<T>>& ch = _graph[p];
            for (int i = 0; i < (int)ch.size(); i++)
            {
                queue.emplace(ch[i].To, w + ch[i].Weight);
            }
        }
    }

    Graph<T> CreateComplement() 
    {
        struct pair_hash {
            inline std::size_t operator()(const std::pair<int,int> & v) const {
                return v.first ^ v.second;
            }
        };

        unordered_set<pair<int, int>, pair_hash> edgeSet;
        for (int i = 0; i < (int)_edges.size(); i++)
        {
            edgeSet.emplace(_edges[i].From, _edges[i].To);
        }

        Graph<T> g(_vertexCount);

        for (int i = 0; i < _vertexCount - 1; i++)
        {
            for (int j = i + 1; j < _vertexCount; j++)
            {
                if (edgeSet.find(make_pair(i, j)) == edgeSet.end())
                {
                    cout << i << ", " << j << endl;
                    g.AddEdge(i, j, 0);
                }
            }
        }

        return g;
    }
    
    bool IsBipartite()
    {
        fill(_seen.begin(), _seen.end(), false);

        stack<pair<int, bool>> stack;

        vector<bool> memo(_vertexCount);

        for (int i = 0; i < _vertexCount; i++)
        {
            if (_seen[i]) continue;

            stack.emplace(i, false);

            while (!stack.empty())
            {
                int n = stack.top().first;
                bool c = stack.top().second;
                stack.pop();

                if (_seen[n])
                {
                    if (memo[n] != c)
                    {
                        return false;
                    }

                    continue;
                }

                _seen[n] = true;
                memo[n] = c;

                vector<Edge<T>>& ch = _graph[n];
                for (int j = 0; j < (int)ch.size(); j++)
                {
                    stack.emplace(ch[j].To, !c);
                }
            }
        }

        return true;
    }

    T TreeDiameter()
    {
        if ((int)_edges.size() != _vertexCount - 1)
        {
            throw exception();
        }

        vector<T> dist(_vertexCount);

        BfsFrom(0, dist);

        T max = 0;
        int v = 0;
        for (int i = 0; i < _vertexCount; i++)
        {
            if (dist[i] > max)
            {
                max = dist[i];
                v = i;
            }
        }

        fill(dist.begin(), dist.end(), 0);

        BfsFrom(v, dist);

        max = 0;
        for (int i = 0; i < _vertexCount; i++)
        {
            if (dist[i] > max)
            {
                max = dist[i];
            }
        }

        return max;
    }

    T MaxSpanningTreeWeight()
    {
        UnionFind unionFind(_vertexCount);

        T ans = 0;

        auto cmp = [](const Edge<T> &a, const Edge<T> &b)
        {
            return a.Weight > b.Weight;
        };

        vector<Edge<T>>& edges = _edges;

        sort(edges.begin(), edges.end(), cmp);

        for (int i = 0; i < (int)edges.size(); i++)
        {
            if (!unionFind.Same(edges[i].From, edges[i].To))
            {
                unionFind.Unite(edges[i].From, edges[i].To);
                ans += edges[i].Weight;
            }
        }

        return ans;
    }

    T MinSpanningTreeWeight()
    {
        UnionFind unionFind(_vertexCount);

        T ans = 0;

        auto cmp = [](const Edge<T> &a, const Edge<T> &b)
        {
            return a.Weight < b.Weight;
        };

        vector<Edge<T>>& edges = _edges;

        sort(edges.begin(), edges.end(), cmp);

        for (int i = 0; i < (int)edges.size(); i++)
        {
            if (!unionFind.Same(edges[i].From, edges[i].To))
            {
                unionFind.Unite(edges[i].From, edges[i].To);
                ans += edges[i].Weight;
            }
        }

        return ans;
    }

private:
    inline bool Validate(int n)
    {
        return 0 <= n && n < _vertexCount;
    }
};

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;
    
    vector<vector<int>> mst(n, vector<int>());
    UnionFind uf(n);

    vector<pair<ll, pair<int, int>>> edges;
    for (int i = 0; i < m; i++)
    {
        int u, v;
        cin >> u >> v;
        u--;v--;
        ll w;
        cin >> w;

        edges.emplace_back(w, make_pair(u, v));
    }

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

    ll ans = 0;
    for (int i = 0; i < edges.size(); i++)
    {
        int a = edges[i].second.first;
        int b = edges[i].second.second;
        if (!uf.Same(a, b))
        {
            uf.Unite(a, b);
            mst[a].push_back(b);
            mst[b].push_back(a);
            ans = max(ans, edges[i].first);
        }
    }

    queue<pair<int, bool>> q;
    q.emplace(0, false);

    vector<bool> built(n);
    vector<bool> seen(n);

    while (!q.empty())
    {
        int p = q.front().first;
        bool b = q.front().second;
        q.pop();

        if (seen[p]) continue;

        seen[p] = true;
        built[p] = b;

        for (int j = 0; j < mst[p].size(); j++)
        {
            q.emplace(mst[p][j], !b);
        }
    }

    cout << ans << endl;
    for (int i = 0; i < n; i++)
    {
        if (built[i]) cout << "B";
        else cout << "D";
    }
    cout << endl;
}

詳細信息

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 7
Accepted
time: 1ms
memory: 3712kb

input:

3 3
1 2 3
2 3 1
1 3 2

output:

2
DDB

result:

ok inconveniences = 2

Test #2:

score: 7
Accepted
time: 1ms
memory: 3712kb

input:

5 6
3 2 3
4 2 1
5 3 9
1 3 5
1 4 2
2 3 1

output:

9
DDBBD

result:

ok inconveniences = 9

Test #3:

score: 0
Wrong Answer
time: 24ms
memory: 9576kb

input:

8 135737
1 4 763713071
3 7 45141437
4 8 618418466
6 8 91803956
7 5 972595945
5 2 751163228
2 8 9886315
4 3 106470622
8 6 949495949
1 2 885918825
4 6 322040168
7 6 754489330
4 8 618968328
5 3 996860159
3 6 210132897
3 4 591744987
8 7 447985622
2 4 4833956
5 7 610154418
2 5 410116873
2 5 912717336
8 7...

output:

47935
DDBBDBBB

result:

wrong answer your claimed answer is 47935, but the inconveniences of your plan is actually 19258

Subtask #2:

score: 0
Wrong Answer

Test #11:

score: 0
Wrong Answer
time: 214ms
memory: 42996kb

input:

500000 499999
1 2 776715136
2 3 406881694
3 4 265792290
4 5 507607272
5 6 182246639
6 7 997847597
7 8 164130256
8 9 278962226
9 10 411194641
10 11 363646402
11 12 672225656
12 13 494629089
13 14 717664153
14 15 121619271
15 16 476857704
16 17 301215244
17 18 810217743
18 19 850722975
19 20 10710274
...

output:

999999116
DBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB...

result:

wrong answer your claimed answer is 999999116, but the inconveniences of your plan is actually 998789691

Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 24
Accepted

Test #31:

score: 24
Accepted
time: 147ms
memory: 34668kb

input:

366489 397001
2 127909 1
7 171229 1
8 158597 1
11 282213 1
14 356007 1
15 286102 1
16 93205 1
17 260111 1
18 138962 1
20 359938 1
29 223905 1
31 357684 1
32 259968 1
34 65205 1
37 200276 1
41 83195 1
43 159858 1
48 332277 1
50 320322 1
51 338467 1
53 262785 1
55 83815 1
56 173198 1
58 169473 1
63 19...

output:

1
DDBBBBDBDBBBBDDDBBBBBDBBDDDDBBDDBBDBBBBBBDBBBBBDBBBBBDDDDBBDBBDDDDBBBBBBDDDBDDDBBBDDDDBDDDDBBBBDDBBBBDBDDDBBDBDBDBBBBDBDDBDDBDBBBDBBBDDBBDDDBBBDDBDBDDBDDDBDBDBBDBDBDBDBDBBDDBDBBDBBBBDBBBDDDBBDDDDDDDDDDDDBBBBDBDBDBBBBDDDBBBBDBDBDBDBDDDDBBBBBDDDBBBBDBBBDBBDBBDDDDBBDBDBDBDBDBBDBDDBBDDDBBDDBDDBBDDBDBB...

result:

ok inconveniences = 1

Test #32:

score: 24
Accepted
time: 209ms
memory: 41548kb

input:

475552 488952
2 161263 1
3 312211 1
5 41910 1
6 421865 1
7 340911 1
9 419906 1
10 468773 1
13 17837 1
18 465833 1
19 297766 1
21 234125 1
26 218984 1
28 296050 1
29 411520 1
30 38207 1
33 370786 1
34 21620 1
35 467168 1
40 136766 1
42 353240 1
44 194443 1
46 119022 1
48 23233 1
54 380603 1
60 99339 ...

output:

1
DDBBDBDBBBDDBDDDDBBDBBBBBDBDDDDDBDBBBDBBDBBBDDBBBDDDDDDBDDBDBDBDDDBBDDDBBBBBBBDBDDBBBBBDDDDDBDBDDDBBDDBDDBBDBDBBBBBBDDDDBBBBDBBBBBDDDDBBDDBBDBBDBDBBBBBDBDBBDDBDDDBBBDBDBDDBDDDBDBDDDBDDDDBDDDDBDBDBBDDDBBDBDBDDBBBDBDBBDDDDDDBBDBDBBDDBDDDBBBBDDBDBBDBBBBDBDBDBDDBDDDDDBDBBDBDBBBBDBDDBDDBBDDDBDDDBDBDBBD...

result:

ok inconveniences = 1

Test #33:

score: 24
Accepted
time: 42ms
memory: 15584kb

input:

128817 140020
2 53427 1
5 86824 1
6 33490 1
11 63864 1
14 109608 1
15 12909 1
16 45790 1
19 27271 1
22 54044 1
24 11063 1
32 53692 1
35 70034 1
38 84224 1
39 64068 1
43 72895 1
44 51948 1
45 40428 1
49 127824 1
50 52852 1
60 25795 1
61 105666 1
65 41013 1
67 97450 1
69 49349 1
71 47569 1
72 70751 1
...

output:

1
DDBDDBBBBDDDDBDDDBBDDDDDBBBBDDDDDDBDBDBDDDBBDDDDDDDBBBDDDBBBDBBDBBDBDDDDBBBBBBBBDBBDBDDBBDDDBDDDBDBDBDDDDDBBBBDBBDDDBDDBDBBDBBDDBBBDDBBBBDDBDBDDDDDDDDBBBBBBDBBDDBBDDDBDDDDBBBDBDDDBDDBBBBDBDDDDBBBDDBBDDDDBBBBDDBDBBBBBBBBBBDBDDBDBBBDDBDBBDDDBBBDDBBDDBBDDDDDDDBBDDDDDBBDDBBDDDBBDBDBDBDBDBBBDDBBBBBDBBB...

result:

ok inconveniences = 1

Test #34:

score: 24
Accepted
time: 120ms
memory: 28412kb

input:

299635 331829
5 197808 1
11 67054 1
12 84275 1
15 287112 1
16 274955 1
24 40825 1
30 266299 1
34 81379 1
35 99815 1
38 219853 1
42 189961 1
47 107895 1
48 137516 1
50 80614 1
54 264232 1
55 93625 1
62 143056 1
63 70844 1
64 72811 1
65 164091 1
68 248158 1
70 9821 1
72 156352 1
77 215022 1
81 270025 ...

output:

1
DDBDDDBDBDDBBDDDDDBDBBBBDDDBBDBBDBBBBBBBBBDDBDDDBDBBDDDBDDDDDDDDBDBDBDBBDBBBBDBDBBDBBBDBDBDBDDBDDDDDDBDDDDBDDDBBBBDBBDBBDBBDDBDBBDDBDBDDBBDBDDBBBBBDDBDBBBDBBBBBDDDBDBDDBDBBDDDDBBDDDBDBDBDBDBDDDBBDDBDBDBBBDBBBDDBDDDDDBBDDBDDBBBBDBDDDBBDBDBBDDBBDDDDBDBDDDBBDDDDDBDBBBBBDBBDDDBDDBBBBBBBBBDBDDDBDBDDDBB...

result:

ok inconveniences = 1

Test #35:

score: 24
Accepted
time: 166ms
memory: 34968kb

input:

369927 447544
1 150509 1
5 250257 1
6 149327 1
7 201307 1
15 330381 1
16 158914 1
18 99391 1
24 90164 1
25 199087 1
28 306199 1
32 83429 1
35 212184 1
36 29977 1
37 261629 1
44 99341 1
45 48378 1
51 130523 1
53 148929 1
58 77382 1
71 211093 1
72 305907 1
73 227420 1
75 188876 1
76 71437 1
79 354402 ...

output:

1
DBDBBBDBDDDBDDDBDBBDDBDBDBBDDDBDBDDDDDDBBDDBBDDBDBDDBBDDDDBBBBBBBBBDDDBDDBDBBBDBBDBBBBDBBDDBDDDDDBDBBDBDDDDDBDDDBDBDDDBDBDBBBBBDBBBBDBDBDDDBDBDDDDBBBBDDDBDDDBBDDBBBDBBDDDDDDBDBBBBDBBBBDBDDBBDDBBBDDBBDDBBBDBDDBBBBBBBDBDBBBDBBDDBDBBDDBBDBBDBDBBBBDDBBBBBBDBBBDBDBBDDDDDBDDBBBBDBBBBBDBDDBDBDBDBBDBDBBBD...

result:

ok inconveniences = 1

Test #36:

score: 24
Accepted
time: 212ms
memory: 43124kb

input:

500000 500000
4 319400 1
12 186157 1
13 443669 1
15 227339 1
19 101284 1
20 183604 1
23 273179 1
26 236933 1
27 79090 1
28 826 1
29 7574 1
31 370188 1
32 48463 1
34 113530 1
35 209157 1
46 13739 1
47 188127 1
48 97203 1
51 251724 1
52 469749 1
53 451782 1
56 249224 1
58 262324 1
60 380990 1
61 82320...

output:

1
DDDDDDDBDDBDDDDBDBBBDDBBDDDBDBDDBBBBDDDDBDDDBBBDBDDBBDBBDBDBDDDBBBDBDBBDDBDBDBBDBBDBBDBBBDBDDDDDDDBDBBDDBDDBDDBDBBDDDDDBDBDBBBDDDBBDBDBBBDBBDDDDDBBDBDBBDBBDBDDDBBBBDDDDDDDBBDBBBBBDBDDDBDDDBBBDDDBBDBDDDDBBDDBBDBDDBDBDDDBDBBDBBBDDBDBBBDBBBBDBBDDBBDDDDDBDDDBDBDBDBBBDDDBBDDDDBBDBBDBBBBBDBDBBDDBDDBDBDB...

result:

ok inconveniences = 1

Test #37:

score: 24
Accepted
time: 202ms
memory: 43124kb

input:

500000 500000
2 182927 1
5 313016 1
9 438269 1
10 97892 1
11 373266 1
13 314494 1
14 318813 1
20 102513 1
23 304478 1
24 162451 1
27 207273 1
30 182950 1
34 133161 1
35 62401 1
37 102023 1
38 19183 1
41 96619 1
42 264471 1
45 339682 1
46 60188 1
51 134306 1
53 85702 1
54 170539 1
55 74017 1
73 14900...

output:

1
DDBBBDDDDDBDDDBDBDDBBDDDDDDDBDBBDBBDDBBBDBDBDBBBBDBBDDDDBDDDBBBDDDBDBDBDDBDDBBDBBBDBDBDDBBDDBDDDBBBBDBBBBBDBBBBBBBDBDDDBDDDBDDBDBBDDBDBBBBDBDDBBBDBBDDDBDDDBBDDDBBBBBDBBBDBDDDBDDBBBDDDDBDBDDBDBDBBDBDBDBBDBDDBBDBDDBBBBDBDBDBBDDBBDBDDDDBDDBBBBDDDBBBDBBBDDDBDBDBBBBBDDDDDBDBDDBDBDBDDDBBDDBBBBBDDBDBDBBB...

result:

ok inconveniences = 1

Test #38:

score: 24
Accepted
time: 200ms
memory: 43120kb

input:

500000 500000
4 490349 1
5 377743 1
7 261998 1
14 410844 1
17 106150 1
20 477772 1
22 48037 1
24 388329 1
26 328805 1
28 248860 1
30 216330 1
34 479575 1
37 303722 1
38 392533 1
40 191119 1
42 177919 1
44 322555 1
45 306160 1
50 129452 1
51 215260 1
53 146880 1
56 441549 1
64 249852 1
69 422318 1
70...

output:

1
DBBBDBDBBDDBBBDBBBDBBDDDBDBBDDBDDBDDBDDBBDDDBBDDBBDDDDBBDDBDBBDBBDBDBBBBDDDBBBDBDDBBDBDDBBDBBDDBDBBDBBBDDDBDDBBBDBDDDBBDDDBDBDBBDDBBBBDDBDDDDDBBBBDDDBDBBDDBDDDBBBDBDDDBBBBBBBDBDDDDBDBDDDDDDBDBBDBDDDDBDBBBDBDDBBDBBDDDDBBBBBBDBDDDBBDDBDDBDBBBDDBDDDBDDBBDBDDDBBDBBDDDDBBBBBDBBDBDDBDBBBDBBBBBBBBBDBDBBD...

result:

ok inconveniences = 1

Test #39:

score: 24
Accepted
time: 203ms
memory: 43128kb

input:

500000 500000
9 213713 1
13 307012 1
14 327287 1
16 103990 1
23 409412 1
24 80587 1
25 91210 1
26 413674 1
28 167751 1
29 223056 1
31 395367 1
34 70127 1
38 344870 1
39 499865 1
40 91257 1
41 443805 1
43 109678 1
47 387825 1
49 328529 1
53 186674 1
59 197682 1
60 27560 1
61 402852 1
64 380750 1
66 1...

output:

1
DBBBBDDBBBDDBDDBBDDBBBBDBDDDDBDBDDDDBDBDDDBDBDDBBDBBDBDDBDBDDBBDBBBBBDBDBDBDDDDBDBBBDDBBDDDBBDBDDBBBBBDBBDDBBDDBBBBDBBDBDDBDBBDBBDDBBDDDDDBDBDDBDDBDDDBBDBDDDDBBBDBBBBDBBBDDBDBBDDBBBBBDBDBBBBBDDBDBBDDBBBBDDBBBBBBBBBDDDDDDBDBBBDBDDBDBBDDDDDDDDBDDBDDDBBBDBBBDBBBDDDDDDDBDBDDDBBBDDBDBBBBDBDBBBBDBBBDBDB...

result:

ok inconveniences = 1

Test #40:

score: 24
Accepted
time: 223ms
memory: 43128kb

input:

500000 500000
1 420147 1
2 70976 1
5 354943 1
6 261427 1
9 317379 1
11 31032 1
15 419781 1
16 155356 1
19 459807 1
25 72438 1
28 385731 1
30 19123 1
34 18208 1
35 332853 1
39 338723 1
41 356728 1
42 114047 1
44 389270 1
47 112208 1
48 23788 1
52 312381 1
57 317756 1
60 311741 1
61 218196 1
62 182171...

output:

1
DBDDBBBBBBDBDBDDDBBBDBBDDBBBDBBDBBDBDDDDBBDBBDBDBDBBDDDDBBDDBBBBBDBBBBDBBBDBDDDDBBBDBDBBBBDDDDDDDDDBDDBDDBDDDDBDBDBDBBDDDDBDDDBDBDBBBBBDBBBDDBBBBBDDDDDBBBBBBDDBDBDDDBDBDBBBBDBBBBDDDDDDDDDDDDDDDDDDDDBBBBBBBBBDDDBDDDBDDDBDDBBBDBDDDDBDBBDDDBDDDBDBBDDDBDDBDDBDDBBDDDBBDDBBBDDBDDBBBDDDDBDBDDDBBDDDBBBBDD...

result:

ok inconveniences = 1

Subtask #5:

score: 0
Skipped

Dependency #1:

0%