Submission #602224

#TimeUsernameProblemLanguageResultExecution timeMemory
602224SamAndRobot (JOI21_ho_t4)C++17
100 / 100
1378 ms83376 KiB
#include <bits/stdc++.h>
using namespace std;
#define m_p make_pair
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define fi first
#define se second
typedef long long ll;
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
mt19937 rnf(2106);
const int N = 200005;

struct ban
{
    int x, c;
    ll p;
    ban(){}
    ban(int x, int c, ll p)
    {
        this->x = x;
        this->c = c;
        this->p = p;
    }
};
bool operator<(const ban& a, const ban& b)
{
    return a.p > b.p;
}

bool so(const ban& a, const ban& b)
{
    return a.c < b.c;
}

int n, m;
vector<ban> g[N];

void solv()
{
    cin >> n >> m;
    for (int i = 0; i < m; ++i)
    {
        int x, y, c, p;
        cin >> x >> y >> c >> p;
        g[x].push_back(ban(y, c, p));
        g[y].push_back(ban(x, c, p));
    }

    map<pair<int, int>, int> mp;
    for (int x = 1; x <= n; ++x)
    {
        sort(all(g[x]), so);
        for (int i = 0; i < g[x].size(); ++i)
        {
            if (i == 0 || g[x][i].c != g[x][i - 1].c)
                mp[m_p(x, g[x][i].c)] = i;
        }
    }

    set<pair<int, int> > c;
    priority_queue<ban> q;
    q.push(ban(1, 0, 0));
    while (1)
    {
        ban t;
        do
        {
            if (q.empty())
            {
                cout << "-1\n";
                return;
            }
            t = q.top();
            q.pop();
        } while (c.find(m_p(t.x, t.c)) != c.end());
        c.insert(m_p(t.x, t.c));
        if (t.x == n && t.c == 0)
        {
            cout << t.p << "\n";
            return;
        }

        if (t.c == 0)
        {
            map<int, ll> s;
            for (int i = 0; i < g[t.x].size(); ++i)
            {
                ban h = g[t.x][i];
                s[g[t.x][i].c] += g[t.x][i].p;
            }

            for (int i = 0; i < g[t.x].size(); ++i)
            {
                ban h = g[t.x][i];
                h.p = t.p;
                q.push(h);
            }
            for (int i = 0; i < g[t.x].size(); ++i)
            {
                ban h = g[t.x][i];
                h.p += t.p;
                h.c = 0;
                q.push(h);
            }
            for (int i = 0; i < g[t.x].size(); ++i)
            {
                ban h = g[t.x][i];
                h.p = t.p;
                h.p += s[g[t.x][i].c] - g[t.x][i].p;
                h.c = 0;
                q.push(h);
            }
        }
        else
        {
            assert(mp.find(m_p(t.x, t.c)) != mp.end());
            ll s = 0;
            for (int i = mp[m_p(t.x, t.c)]; i < g[t.x].size(); ++i)
            {
                ban h = g[t.x][i];
                if (h.c != t.c)
                    break;
                s += h.p;
            }
            for (int i = mp[m_p(t.x, t.c)]; i < g[t.x].size(); ++i)
            {
                ban h = g[t.x][i];
                if (h.c != t.c)
                    break;
                h.p = t.p;
                h.p += s - g[t.x][i].p;
                h.c = 0;
                q.push(h);
            }
        }
    }
}

int main()
{
    #ifdef SOMETHING
    freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    #endif // SOMETHING
    ios_base::sync_with_stdio(false), cin.tie(0);

    int tt = 1;
    //cin >> tt;
    while (tt--)
    {
        solv();
    }
    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'void solv()':
Main.cpp:53:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<ban>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |         for (int i = 0; i < g[x].size(); ++i)
      |                         ~~^~~~~~~~~~~~~
Main.cpp:86:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<ban>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |             for (int i = 0; i < g[t.x].size(); ++i)
      |                             ~~^~~~~~~~~~~~~~~
Main.cpp:88:21: warning: variable 'h' set but not used [-Wunused-but-set-variable]
   88 |                 ban h = g[t.x][i];
      |                     ^
Main.cpp:92:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<ban>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |             for (int i = 0; i < g[t.x].size(); ++i)
      |                             ~~^~~~~~~~~~~~~~~
Main.cpp:98:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<ban>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |             for (int i = 0; i < g[t.x].size(); ++i)
      |                             ~~^~~~~~~~~~~~~~~
Main.cpp:105:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<ban>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |             for (int i = 0; i < g[t.x].size(); ++i)
      |                             ~~^~~~~~~~~~~~~~~
Main.cpp:118:47: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<ban>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  118 |             for (int i = mp[m_p(t.x, t.c)]; i < g[t.x].size(); ++i)
      |                                             ~~^~~~~~~~~~~~~~~
Main.cpp:125:47: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<ban>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  125 |             for (int i = mp[m_p(t.x, t.c)]; i < g[t.x].size(); ++i)
      |                                             ~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...