제출 #841334

#제출 시각아이디문제언어결과실행 시간메모리
841334danikoynov봉쇄 시간 (IOI23_closing)C++17
51 / 100
1091 ms175632 KiB
#include "closing.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 3e3 + 10; vector < pair < int, ll > > adj[maxn]; ll dist[2][maxn]; int n; void bfs(int s, ll arr[]) { queue < int > q; for (int i = 0; i < n; i ++) arr[i] = -1; arr[s] = 0; q.push(s); while(!q.empty()) { int v = q.front(); q.pop(); for (pair < int, ll > nb : adj[v]) { if (arr[nb.first] == -1) { arr[nb.first] = arr[v] + nb.second; q.push(nb.first); } } } } const ll inf = 1e18; ll value[maxn]; ll dp[maxn][maxn * 2][2][2], sub[maxn], temp[maxn * 2][2][2]; int used[maxn]; /** */ vector < int > st[maxn]; void dfs(int v, int t) { ///cout << "dfs " << v << endl; sub[v] = 1; used[v] = 1; if (t != v) st[t].push_back(v); for (int j = 0; j <= 2; j ++) for (int d = 0; d < 2; d ++) for (int z = 0; z < 2; z ++) dp[v][j][d][z] = inf; dp[v][0][0][0] = 0; dp[v][1][1][0] = dist[0][v]; dp[v][1][0][1] = dist[1][v]; dp[v][2][1][1] = max(dist[0][v], dist[1][v]); for (pair < int, ll > nb : adj[v]) { if (used[nb.first]) continue; dfs(nb.first, t); int u = nb.first; for (int i = 0; i <= (sub[u] + sub[v]) * 2; i ++) for (int x = 0; x < 2; x ++) for (int y = 0; y < 2; y ++) temp[i][x][y]= inf; for (int i = 0; i <= sub[v] * 2; i ++) for (int j = 0; j <= sub[u] * 2; j ++) for (int d = 0; d < 2; d ++) for (int z = 0; z < 2; z ++) for (int x = 0; x <= d; x ++) for (int y = 0; y <= z; y ++) { temp[i + j][d][z] = min(temp[i + j][d][z], dp[v][i][d][z] + dp[u][j][x][y]); } for (int i = 0; i <= (sub[v] + sub[u]) * 2; i ++) for (int x = 0; x < 2; x ++) for (int y = 0; y < 2; y ++) dp[v][i][x][y] = temp[i][x][y]; sub[v] += sub[u]; } } vector < int > path; bool get_path(int v, int p, int target) { if (v == target) { path.push_back(v); return true; } for (pair < int, ll > nb : adj[v]) { if (nb.first == p) continue; if (get_path(nb.first, v, target)) { path.push_back(v); return true; } } return false; } ll sum_dp[maxn * 2], tp[maxn * 2]; ll cur_sz = 0; void unite(int v, int d, int z) { /**cout << "unite " << endl; for (int i = 0; i <= sub[v] * 2; i ++) cout << dp[v][i][d][z]<< " "; cout << endl;*/ for (int i = 0; i <= (cur_sz + sub[v]) * 2; i ++) { tp[i] = inf; } for (int j = 0; j <= 2 * cur_sz; j ++) for (int i = 0; i <= 2 * sub[v]; i ++) { tp[i + j] = min(tp[i + j], sum_dp[j] + dp[v][i][d][z]); } for (int i = 0; i <= (cur_sz + sub[v]) * 2; i ++) sum_dp[i] = tp[i]; cur_sz += sub[v]; } int bigK, ans; int get_value(int i, int j) { cur_sz = 0; for (int i = 0; i <= n * 2; i ++) sum_dp[i] = inf; sum_dp[0] = 0; for (int id = 0; id < path.size(); id ++) { unite(path[id], (id <= i), (id >= j)); } int tek = 0; for (int i = 0; i <= n * 2; i ++) { if (sum_dp[i] <= bigK) tek = max(tek, i); } return tek; } int max_score(int N, int X, int Y, long long K, vector<int> U, vector<int> V, vector<int> W) { bigK = K; for (int i = 0; i < N; i ++) { dist[0][i] = dist[1][i] = 0; adj[i].clear(); used[i] = 0; value[i] = 0; } n = N; for (int i = 0; i < N - 1; i ++) { adj[U[i]].push_back({V[i], W[i]}); adj[V[i]].push_back({U[i], W[i]}); } bfs(X, dist[0]); bfs(Y, dist[1]); path.clear(); get_path(Y, -1, X); for (int cur : path) used[cur] = 1; for (int cur : path) { st[cur].clear(); dfs(cur, cur); } /**for (int cur : path) { cout << "step " << cur << endl; for (int j = 0; j <= sub[cur] * 2; j ++) cout << dp[cur][j][1][0] << " "; cout << endl; } cout << "sub " << sub[2] << endl; cout << "-----------------" << endl;*/ int sz = path.size(); ans = 0; for (int i = 0; i < sz; i ++) { cur_sz = 0; for (int i = 0; i <= N * 2 + 1; i ++) sum_dp[i] = inf; sum_dp[0] = 0; for (int j = i; j < sz; j ++) { //int i = 1; // int j = 1; unite(path[j], 1, 1); ///cout << "here " << i << " " << j << endl; ll sf = 0; for (int id = 0; id < i; id ++) sf += dist[0][path[id]]; for (int id = j + 1; id < sz; id ++) sf += dist[1][path[id]]; int len = j - i + 1; int cnt = sz + len; vector < ll > vec; for (int id = 0; id < i; id ++) for (int v : st[path[id]]) vec.push_back(dist[0][v]); for (int id = j + 1; id < sz; id ++) for (int v : st[path[id]]) vec.push_back(dist[1][v]); sort(vec.begin(), vec.end()); for (int d = 1; d < vec.size(); d ++) vec[d] = vec[d - 1] + vec[d]; for (int tk = 0; tk <= 2 * cur_sz; tk ++) { ll left_k = K - sf - sum_dp[tk]; ///cout << " :: " << tk << " " << sum_dp[tk] << " " << left_k << endl; if (left_k < 0) continue; int lf = 0, rf = (int)(vec.size()) - 1; while(lf <= rf) { int mf = (lf + rf) / 2; if (vec[mf] <= left_k) lf = mf + 1; else rf = mf - 1; } int all = sz - len + tk + rf + 1; if (all > ans) ans = all; } if (sf <= K) ans = max(ans, sz - len); for (int i = 0; i < vec.size(); i ++) { if (vec[i] + sf <= K) ans = max(ans, sz - len + i + 1); } } /**for (int j = 0; j < sz; j ++) { cur_sz = 0; sum_dp[0] = 0; for (int id = 0; id < sz; id ++) { unite(path[id], (id <= i), (id >= j)); } for (int i = 0; i <= N * 2; i ++) { if (sum_dp[i] <= K) ans = max(ans, i); } ///cout << j << " : " << ans << endl; }*/ ///cout << i << " " << opt << endl; } return ans; }

컴파일 시 표준 에러 (stderr) 메시지

closing.cpp: In function 'int get_value(int, int)':
closing.cpp:147:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  147 |     for (int id = 0; id < path.size(); id ++)
      |                      ~~~^~~~~~~~~~~~~
closing.cpp: In function 'int max_score(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:234:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  234 |             for (int d = 1; d < vec.size(); d ++)
      |                             ~~^~~~~~~~~~~~
closing.cpp:261:31: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  261 |             for (int i = 0; i < vec.size(); i ++)
      |                             ~~^~~~~~~~~~~~
closing.cpp:225:17: warning: unused variable 'cnt' [-Wunused-variable]
  225 |             int cnt = sz + len;
      |                 ^~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...