제출 #709140

#제출 시각아이디문제언어결과실행 시간메모리
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++; } } }

컴파일 시 표준 에러 (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...