제출 #850566

#제출 시각아이디문제언어결과실행 시간메모리
850566b6e1봉쇄 시간 (IOI23_closing)C++17
75 / 100
200 ms57532 KiB
#include <bits/stdc++.h> #define ll long long using namespace std; ll z[400005]; struct node { ll a, b; bool operator < (const node &z) const { return b < z.b; } } c[400005]; namespace Cardboard_Box { int cnt, p[400005], q[400005]; ll d[400005], nu[400005], su[400005]; void add (int x, int v1, ll v2) { while (x <= cnt) { nu[x] += v1, su[x] += v2; x += x & -x; } } int solve (int n, ll K, node *c, int m, ll *z) { cnt = 0; for (int i = 1; i <= m; i++) d[++cnt] = z[i]; for (int i = 1; i <= n; i++) { d[++cnt] = c[i].a; d[++cnt] = c[i].b - c[i].a; } sort (c + 1, c + n + 1); sort (d + 1, d + cnt + 1); cnt = unique (d + 1, d + cnt + 1) - d - 1; ll sum = 0; memset (nu, 0, cnt + 2 << 3); memset (su, 0, cnt + 2 << 3); for (int i = 1; i <= m; i++) { int pos = lower_bound (d + 1, d + cnt + 1, z[i]) - d; add (pos, 1, z[i]); } for (int i = 1; i <= n; i++) { p[i] = lower_bound (d + 1, d + cnt + 1, c[i].a) - d; q[i] = lower_bound (d + 1, d + cnt + 1, c[i].b - c[i].a) - d; add (p[i], 1, c[i].a); } ll ans = 0; for (int i = 0; i <= n; i++) { if (i) { add (p[i], -1, -c[i].a); add (q[i], 1, c[i].b - c[i].a); K -= c[i].a; } if (K < 0) break; ll p = 0, num = 0, sum = 0; for (int j = __lg (cnt); j >= 0; j--) { int np = p + (1 << j); if (np > cnt || sum + su[np] > K) continue; p = np, num += nu[p], sum += su[p]; } if (p < cnt) num += (K - sum) / d[p + 1]; ans = max (ans, num + i); } return ans; } } ll dx[400005], dy[400005]; vector<pair <int, int>> e[400005]; void dfs (int x, int fl, ll *d) { if (fl == -1) d[x] = 0; for (pair <int, int> t : e[x]) { int it = t.first; if (it == fl) continue; d[it] = d[x] + t.second; dfs (it, x, d); } } int max_score (int N, int X, int Y, ll K, vector<int> U, vector<int> V, vector<int> W) { for (int i = 0; i < N; i++) e[i].clear(); for (int i = 0; i + 1 < N; i++) { e[U[i]].push_back ({V[i], W[i]}); e[V[i]].push_back ({U[i], W[i]}); } dfs (X, -1, dx), dfs (Y, -1, dy); vector<ll> arr; for (int i = 0; i < N; i++) { arr.push_back (dx[i]); arr.push_back (dy[i]); } sort (arr.begin(), arr.end()); int ans = 0; ll sum = 0; for (int i = 0; i < arr.size(); i++) { if ((sum += arr[i]) > K) break; ans++; } int n = 0, m = 0, cnt = 0; for (int i = 0; i < N; i++) { int mn = min (dx[i], dy[i]); int mx = max (dx[i], dy[i]); if (dx[i] + dy[i] == dx[Y]) { cnt++, K -= mn; z[++ m] = mx - mn; } else c[++ n] = {mn, mx}; } if (K >= 0) ans = max (ans, cnt + Cardboard_Box::solve (n, K, c, m, z)); return ans; }

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

closing.cpp: In function 'int Cardboard_Box::solve(int, long long int, node*, int, long long int*)':
closing.cpp:31:22: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   31 |   memset (nu, 0, cnt + 2 << 3);
      |                  ~~~~^~~
closing.cpp:32:22: warning: suggest parentheses around '+' inside '<<' [-Wparentheses]
   32 |   memset (su, 0, cnt + 2 << 3);
      |                  ~~~~^~~
closing.cpp:30:6: warning: unused variable 'sum' [-Wunused-variable]
   30 |   ll sum = 0;
      |      ^~~
closing.cpp: In function 'int max_score(int, int, int, long long int, std::vector<int>, std::vector<int>, std::vector<int>)':
closing.cpp:88:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |  for (int i = 0; i < arr.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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...