Submission #709140

#TimeUsernameProblemLanguageResultExecution timeMemory
709140restingReconstruction Project (JOI22_reconstruction)C++17
100 / 100
1871 ms71520 KiB
#include <bits/stdc++.h>

using namespace std;


#define int long long

const int mx = 500 + 5;

vector<int> adj[mx];
vector<int> w[mx];
vector<pair<int, pair<int, int>>> edges;

int delu, delv;
int dfs(int v, int p, int b) { //returns -1 if not found, else min edge
    //cout << "dfs " << v << ","<<b<<endl;
    for (int i = 0; i < adj[v].size(); i++) {
        auto& x = adj[v][i];
        if (x == p) continue;
        if (x == b) {
            delu = v; delv = x;
            return w[v][i];
        }
        int t = dfs(x, v, b);
        if (t != -1) {
            if (w[v][i] < t) {
                delu = v; delv = x;
            }
            return min(t, w[v][i]);
        }
    }
    return -1;
}

int32_t main() {
   // cout << "tesT" << endl;
    ios_base::sync_with_stdio(false); cin.tie(NULL);
    int N, M; cin >> N >> M;
    edges.resize(M);
    for (auto& x : edges) {
        cin >> x.second.first >> x.second.second >> x.first;
    }

    int Q; cin >> Q;
    vector<int> q(Q); for (auto& x : q) cin >> x;
    sort(edges.begin(), edges.end());
    vector<pair<int, pair<int, int>>> upd;
    for (auto& x : q)
        upd.push_back({ x, {5, -1} });
    auto ad = [&](int u, int v, int ww) {
        adj[u].push_back(v);
        adj[v].push_back(u);
        w[u].push_back(ww);
        w[v].push_back(ww);
    };
    auto del = [&](int u, int v) {
        auto a = find(adj[u].begin(), adj[u].end(), v) - adj[u].begin();
        auto b = find(adj[v].begin(), adj[v].end(), u) - adj[v].begin();
      //  cout << a << "," << adj[u].size() << "," << b << "," << adj[v].size() << endl;
        adj[u].erase(adj[u].begin() + a);
        w[u].erase(w[u].begin() + a);
        adj[v].erase(adj[v].begin() + b);
        w[v].erase(w[v].begin() + b);
    };
    for (int i = 0; i < edges.size(); i++) {
        int t = dfs(edges[i].second.first, -1, edges[i].second.second);
        int m = (t + edges[i].first + 1) / 2;
        if (t == -1) m = -1;
       // cout <<"a"<< edges[i].first<<","<<t << endl;
        if(t != -1)
        upd.push_back({ m, {1LL, m - t} }); //remove increasing
        upd.push_back({ m, {2LL, edges[i].first - m} }); //add decreasing
        upd.push_back({ edges[i].first, {3LL, 0} }); // remove decreasing
        upd.push_back({ edges[i].first, {4LL, 0} }); //add increasing


        if (t != -1) {
           // cout << i << "," << t << endl;
            del(delu, delv);
        }
        ad(edges[i].second.first, edges[i].second.second, edges[i].first);
    }
    for (int i = 0; i < N; i++) {
        adj[i].clear(); w[i].clear();
    }

    //do in reverse
    //reverse(edges.begin(), edges.end());
    //for (int i = 0; i < edges.size(); i++) {
    //    int t = dfs(edges[i].second.first, -1, edges[i].second.second);
    //    ub[edges.size() - i - 1] =1e9- t;
    //    if (t != -1) {
    //        del(delu, delv);
    //    }
    //    ad(edges[i].second.first, edges[i].second.second, 1e9-edges[i].first);
    //}

    //reverse(edges.begin(), edges.end());

    sort(upd.begin(), upd.end());
    int prev = upd.front().first;
    int m = 0, b = 0;
    for (auto& x : upd) {
       // cout << x.first << "," << x.second.first << "," << x.second.second << endl;
        m += b * (x.first - prev); prev = x.first;
        if (x.second.first == 5) {
            cout << m << endl;
        }
        else if (x.second.first == 1) {
            m -= x.second.second;
            b--;
        }
        else if (x.second.first == 2) {
            m += x.second.second;
            b--;
        }
        else if (x.second.first == 3) {
            b++;
        }
        else if (x.second.first == 4) {
            b++;
        }
    }


}

Compilation message (stderr)

reconstruction.cpp: In function 'long long int dfs(long long int, long long int, long long int)':
reconstruction.cpp:17:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   17 |     for (int i = 0; i < adj[v].size(); i++) {
      |                     ~~^~~~~~~~~~~~~~~
reconstruction.cpp: In function 'int32_t main()':
reconstruction.cpp:65:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, std::pair<long long int, long long int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   65 |     for (int i = 0; i < edges.size(); i++) {
      |                     ~~^~~~~~~~~~~~~~
#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...