Submission #1149649

#TimeUsernameProblemLanguageResultExecution timeMemory
1149649FIFI_cppRigged Roads (NOI19_riggedroads)C++20
30 / 100
789 ms327680 KiB
#include <bits/stdc++.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <stack>
#include <deque>
#include <fstream>
#include <iterator>
#include <set>
#include <map>
#include <unordered_map>
#include <iomanip>
#include <cctype>
#include <string>
#include <cassert>
#include <set>
#include <bitset>
#include <unordered_set>
#include <numeric>

#define all(a) a.begin(), a.end()
#define fast ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define pb push_back
#define ppi pair<int,pair<int,int>>
//#define int int64_t

using namespace std;
//    /\_/\
//   (= ._.)
//   / >  \>
// encouraging cat
const int INF = 10000000000000000;
//const int mod = 1000000007;
const int mod = 998244353;
const int MAXN = 200005;
//ifstream fin('xor.in');
//ofstream fout('xor.out');
int n, m;
vector<vector<int>> adj;
vector<vector<pair<int,int>>> mn;
vector<pair<int,int>> lst;
vector<set<int>> store;
vector<bool> inmain;
vector<int> val;
vector<int> valcnt;
void dfs(int v, int p, int edge)
{
    multiset<int> ms;
    for (pair<int,int> u : mn[v]) {
        if (u.first != p)
        {
            dfs(u.first, v, u.second);
            ms.insert(all(store[u.first]));
        }
    }
    ms.insert(all(store[v]));
    store[v].clear();
    vector<int> vc;
    for (auto it: ms)
    {
        vc.pb(it);
    }
    for (int i = 0;i < vc.size();i++)
    {
        if (i < vc.size() - 1 && vc[i] == vc[i + 1])
        {
            i++;
        }
        else
        {
            store[v].insert(vc[i]);
        }
    }
    if (v == 0)
    {
        return;
    }
    if (store[v].size() >= 1)
        val[edge] = *store[v].begin();
    else
        val[edge] = -1;
}
void preprocess(int root) {
    store.resize(n);
    inmain.resize(m);
    val.resize(m);
    lst.resize(m);
    adj.resize(n);
    valcnt.resize(n);
    mn.resize(m);
}
signed main()
{
    cin >> n >> m;
    preprocess(0);
    for (int i = 0;i < m;i++)
    {
        int u,v;
        cin >> u >> v;
        u--;
        v--;
        lst[i] = {u,v};
    }
    for (int i = 0;i < n - 1;i++)
    {
        int x;
        cin >> x;
        x--;
        mn[lst[x].first].pb({lst[x].second, x});
        mn[lst[x].second].pb({lst[x].first, x});
        inmain[x]=true;
    }
    for (int i = 0;i < m;i++)
    {
        if (!inmain[i])
        {
            store[lst[i].first].insert(i);
            store[lst[i].second].insert(i);
        }
    }
    dfs(0,0,-1);
    for (int i = 0;i < m;i++)
    {
        if (val[i] != -1 && inmain[i])
            valcnt[val[i]]++;
    }
    int x = 1;
    vector<int> res(m,-1);
    vector<int> taken(m + 1, -1);
    for (int i = 0;i < m;i++)
    {
        if (inmain[i])
        {
            if (val[i] == -1)
            {
                res[i] = x;
                x++;
                continue;
            }
            if (taken[val[i]] != -1)
            {
                res[i] = taken[val[i]];
                taken[val[i]]++;
            }
            else
            {
                valcnt[val[i]]--;
                res[i] = x;
                x++;
            }
        }
        else
        {
            res[i] = x + valcnt[i];
            taken[i] = x;
            x += valcnt[i];
            x++;
        }
    }
    for (int i = 0;i < m;i++)
    {
        cout << res[i] << " ";
    }
    cout << '\n';
    return 0;
}

Compilation message (stderr)

riggedroads.cpp:36:17: warning: overflow in conversion from 'long int' to 'int' changes value from '10000000000000000' to '1874919424' [-Woverflow]
   36 | const int INF = 10000000000000000;
      |                 ^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...