提出 #14260465
ソースコード 拡げる
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#define all(x) (x).begin(),(x).end()
//#pragma GCC optimize ("-O3")
using namespace std; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); }
typedef long long ll; const int inf = INT_MAX / 2; const ll infl = 1LL << 60;
template<class T>bool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; }
template<class T>bool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; }
//---------------------------------------------------------------------------------------------------
/*---------------------------------------------------------------------------------------------------
∧_∧
∧_∧ (´<_` ) Welcome to My Coding Space!
( ´_ゝ`) / ⌒i @hamayanhamayan0
/ \ | |
/ / ̄ ̄ ̄ ̄/ |
__(__ニつ/ _/ .| .|____
\/____/ (u ⊃
---------------------------------------------------------------------------------------------------*/
int LIM = 10;
int N, V[1 << 19], W[1 << 19], Q;
//---------------------------------------------------------------------------------------------------
vector<pair<int, int>> memo[1 << 18];
void naive(int cu, vector<int>& arr) {
if (memo[cu].size() != 0) return;
int n = arr.size();
map<int, int> dp;
rep(msk, 0, 1 << n) {
int val = 0, wei = 0;
rep(i, 0, n) if (msk & (1 << i)) {
val += V[arr[i]];
wei += W[arr[i]];
}
chmax(dp[wei], val);
}
fore(p, dp) memo[cu].push_back(p);
int ma = -inf;
fore(p, memo[cu]) {
chmax(ma, p.second);
p.second = ma;
}
}
//---------------------------------------------------------------------------------------------------
void _main() {
cin >> N;
rep(i, 1, N + 1) cin >> V[i] >> W[i];
cin >> Q;
rep(_, 0, Q) {
int v, L; cin >> v >> L;
int v2 = v;
vector<int> arr;
while (1 <= v2) {
arr.push_back(v2);
v2 /= 2;
}
int n = arr.size();
if (n <= LIM) {
naive(v, arr);
int ans = 0;
auto idx = upper_bound(all(memo[v]), make_pair(L, inf)) - memo[v].begin();
if (0 < idx) {
ans = memo[v][idx - 1].second;
}
printf("%d\n", ans);
}
else {
vector<int> arr2;
rep(i, n - LIM, n) arr2.push_back(arr[i]);
int p = arr[n - LIM];
naive(p, arr2);
int m = n - LIM;
int ans = 0;
rep(msk, 0, 1 << m) {
int val = 0, wei = 0;
rep(i, 0, m) if (msk & (1 << i)) {
val += V[arr[i]];
wei += W[arr[i]];
}
auto idx = upper_bound(all(memo[p]), make_pair(L - wei, inf)) - memo[p].begin();
if (0 < idx) chmax(ans, memo[p][idx - 1].second + val);
}
printf("%d\n", ans);
}
}
}
提出情報
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
700 / 700 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
sample01.txt, sample02.txt |
| All |
sample01.txt, sample02.txt, in01.txt, in02.txt, in03.txt, in04.txt, in05.txt, in06.txt, in07.txt, in08.txt, in09.txt, in10.txt, in11.txt, in12.txt, in13.txt, in14.txt, in15.txt, in16.txt, sample01.txt, sample02.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| in01.txt |
AC |
7 ms |
9740 KiB |
| in02.txt |
AC |
8 ms |
9708 KiB |
| in03.txt |
AC |
8 ms |
9868 KiB |
| in04.txt |
AC |
13 ms |
9688 KiB |
| in05.txt |
AC |
795 ms |
16160 KiB |
| in06.txt |
AC |
968 ms |
15632 KiB |
| in07.txt |
AC |
916 ms |
14824 KiB |
| in08.txt |
AC |
1999 ms |
15784 KiB |
| in09.txt |
AC |
1593 ms |
14740 KiB |
| in10.txt |
AC |
1902 ms |
15580 KiB |
| in11.txt |
AC |
1115 ms |
16356 KiB |
| in12.txt |
AC |
1247 ms |
15836 KiB |
| in13.txt |
AC |
1222 ms |
15708 KiB |
| in14.txt |
AC |
1273 ms |
15664 KiB |
| in15.txt |
AC |
1553 ms |
15636 KiB |
| in16.txt |
AC |
565 ms |
11892 KiB |
| sample01.txt |
AC |
10 ms |
9864 KiB |
| sample02.txt |
AC |
7 ms |
9824 KiB |