#include "koala.h"
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <cmath>
#include <iomanip>
#include <cassert>
#include <bitset>
using namespace std;
typedef pair<int, int> P;
#define rep(i, n) for (int i=0; i<(n); i++)
#define all(c) (c).begin(), (c).end()
#define uniq(c) c.erase(unique(all(c)), (c).end())
#define index(xs, x) (int)(lower_bound(all(xs), x) - xs.begin())
#define _1 first
#define _2 second
#define pb push_back
#define INF 1145141919
#define MOD 1000000007
int N, W;
tuple<int,int,int> dp[201];
int simulation(vector<int> cost, int l, int r) {
rep(i, W+1) dp[i] = make_tuple(0, 0, 0);
rep(i, N) {
assert(cost[i] > 0);
for (int j=W-cost[i]; j>=0; j--) {
dp[j+cost[i]] = max(dp[j+cost[i]], make_tuple(get<0>(dp[j])+(i+1), get<1>(dp[j])+1, get<2>(dp[j])-(l<=i+1&&i+1<=r)));
}
}
return -get<2>(dp[W]);
}
int perm[100];
void solve(int l, int r, vector<int> set) {
assert(r-l+1 == set.size());
assert(l<=r);
//cout<<"["<<l<<","<<r<<"] {";for(int x: set)cout<<x<<",";cout<<"}\n";
if (l == r) {
perm[set[0]] = l;
return;
}
pair<int, P> mp = make_pair(INF, P(-1, -1));
for (int outside=1; outside<=100; outside++) {
for (int k=2; k<=100; k++) {
if ((outside-1)*(N-(r-l+1)) + (k-1)*(r-l+1) > W) break;
vector<int> cost(N);
for (int i=1; i<=N; i++) {
if (l <= i && i <= r) cost[i-1] = k;
else cost[i-1] = outside;
}
int left = simulation(cost, l, r);
int right = (r-l+1)-left;
if (left==0||right==0)continue;
mp = min(mp, make_pair(abs(left-right), P(k, outside)));
if (mp._1 <= 1) break;
}
if (mp._1 <= 1) break;
}
int val = mp._2._1;
int outside = mp._2._2;
//cout<<"val="<<val<<", outside="<<outside<<": "<<mp._1<<"\n";
assert(val!=-1);
int B[100], R[100];
rep(i, N) B[i] = outside-1;
for (int i : set) B[i] = val-1;
playRound(B, R);
vector<int> left, right;
for (int i : set) {
if (R[i] >= val) right.pb(i);
else left.pb(i);
}
solve(l, l+left.size()-1, left);
solve(l+left.size(), r, right);
}
int solve2(int l, int r, vector<int> set) {
assert(r-l+1 == set.size());
assert(l<=r);
//cout<<"["<<l<<","<<r<<"] {";for(int x: set)cout<<x<<",";cout<<"}\n";
if (l == r) return set[0];
pair<int, P> mp = make_pair(INF, P(-1, -1));
for (int outside=1; outside<=100; outside++) {
for (int k=2; k<=100; k++) {
if ((outside-1)*(N-(r-l+1)) + (k-1)*(r-l+1) > W) break;
vector<int> cost(N);
for (int i=1; i<=N; i++) {
if (l <= i && i <= r) cost[i-1] = k;
else cost[i-1] = outside;
}
int right = simulation(cost, l, r);
int left = (r-l+1)-right;
if (right==0) continue;
mp = min(mp, make_pair(right, P(k, outside)));
if (mp._1 <= 1) break;
}
if (mp._1 <= 1) break;
}
int val = mp._2._1;
int outside = mp._2._2;
//cout<<"val="<<val<<", outside="<<outside<<": "<<mp._1<<"\n";
assert(val!=-1);
int B[100], R[100];
rep(i, N) B[i] = outside-1;
for (int i : set) B[i] = val-1;
playRound(B, R);
vector<int> left, right;
for (int i : set) {
if (R[i] >= val) right.pb(i);
else left.pb(i);
}
return solve2(l+left.size(), r, right);
}
bool solve3(int l, int r, vector<int> set, int a, int b) {
assert(r-l+1 == set.size());
assert(l<r);
//cout<<"["<<l<<","<<r<<"] {";for(int x: set)cout<<x<<",";cout<<"}\n";
pair<int, P> mp = make_pair(INF, P(-1, -1));
for (int outside=1; outside<=100; outside++) {
for (int k=2; k<=100; k++) {
if ((outside-1)*(N-(r-l+1)) + (k-1)*(r-l+1) > W) break;
vector<int> cost(N);
for (int i=1; i<=N; i++) {
if (l <= i && i <= r) cost[i-1] = k;
else cost[i-1] = outside;
}
int right = simulation(cost, l, r);
int left = (r-l+1)-right;
if (left==0||right==0) continue;
mp = min(mp, make_pair(abs(left-right), P(k, outside)));
if (mp._1 <= 1) break;
}
if (mp._1 <= 1) break;
}
int val = mp._2._1;
int outside = mp._2._2;
//cout<<"val="<<val<<", outside="<<outside<<": "<<mp._1<<"\n";
assert(val!=-1);
int B[100], R[100];
rep(i, N) B[i] = outside-1;
for (int i : set) B[i] = val-1;
playRound(B, R);
if (R[a] >= val && R[b] < val) return 0;
if (R[a] < val && R[b] >= val) return 1;
vector<int> left, right;
for (int i : set) {
if (R[i] >= val) right.pb(i);
else left.pb(i);
}
if (R[a] >= val) return solve3(l+left.size(), r, right, a, b);
else return solve3(l, l+left.size()-1, left, a, b);
}
int minValue(int N, int W) {
int B[N], R[N];
rep(i, N) B[i] = 0;
B[0] = 1;
playRound(B, R);
rep(i, N) if (R[i] <= B[i]) return i;
abort();
}
int maxValue(int NN, int WW) {
N = NN, W = WW;
vector<int> left, right;
vector<int> all;
rep(i, N) all.pb(i);
return solve2(1, N, all);
}
int greaterValue(int NN, int WW) {
N = NN, W = WW;
vector<int> left, right;
vector<int> all;
rep(i, N) all.pb(i);
return solve3(1, N, all, 0, 1);
}
void allValues(int NN, int WW, int *P) {
N = NN, W = WW;
vector<int> left, right;
rep(i, N) perm[i] = -1;
vector<int> all;
rep(i, N) all.pb(i);
solve(1, N, all);
rep(i, N) P[i] = perm[i];
}
Compilation message
In file included from /usr/include/c++/7/cassert:44:0,
from koala.cpp:13:
koala.cpp: In function 'void solve(int, int, std::vector<int>)':
koala.cpp:43:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
assert(r-l+1 == set.size());
~~~~~~^~~~~~~~~~~~~
koala.cpp: In function 'int solve2(int, int, std::vector<int>)':
koala.cpp:87:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
assert(r-l+1 == set.size());
~~~~~~^~~~~~~~~~~~~
koala.cpp:102:11: warning: unused variable 'left' [-Wunused-variable]
int left = (r-l+1)-right;
^~~~
In file included from /usr/include/c++/7/cassert:44:0,
from koala.cpp:13:
koala.cpp: In function 'bool solve3(int, int, std::vector<int>, int, int)':
koala.cpp:126:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
assert(r-l+1 == set.size());
~~~~~~^~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
7 ms |
376 KB |
Output is correct |
2 |
Correct |
9 ms |
516 KB |
Output is correct |
3 |
Correct |
11 ms |
516 KB |
Output is correct |
4 |
Correct |
12 ms |
620 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
553 ms |
720 KB |
Output is correct |
2 |
Correct |
563 ms |
956 KB |
Output is correct |
3 |
Correct |
511 ms |
956 KB |
Output is correct |
4 |
Correct |
463 ms |
984 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Partially correct |
229 ms |
984 KB |
Output is partially correct |
2 |
Partially correct |
664 ms |
1044 KB |
Output is partially correct |
3 |
Partially correct |
241 ms |
1632 KB |
Output is partially correct |
4 |
Partially correct |
248 ms |
1888 KB |
Output is partially correct |
5 |
Partially correct |
244 ms |
2216 KB |
Output is partially correct |
6 |
Partially correct |
273 ms |
2440 KB |
Output is partially correct |
7 |
Partially correct |
317 ms |
2764 KB |
Output is partially correct |
8 |
Partially correct |
270 ms |
2996 KB |
Output is partially correct |
9 |
Partially correct |
265 ms |
3520 KB |
Output is partially correct |
10 |
Partially correct |
292 ms |
3896 KB |
Output is partially correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
397 ms |
3896 KB |
Output is correct |
2 |
Correct |
328 ms |
3896 KB |
Output is correct |
3 |
Correct |
305 ms |
3896 KB |
Output is correct |
4 |
Correct |
354 ms |
3896 KB |
Output is correct |
5 |
Correct |
351 ms |
3896 KB |
Output is correct |
6 |
Correct |
309 ms |
3896 KB |
Output is correct |
7 |
Correct |
305 ms |
3896 KB |
Output is correct |
8 |
Correct |
352 ms |
3896 KB |
Output is correct |
9 |
Correct |
349 ms |
3896 KB |
Output is correct |
10 |
Correct |
347 ms |
3956 KB |
Output is correct |
11 |
Correct |
321 ms |
3956 KB |
Output is correct |
12 |
Correct |
338 ms |
3956 KB |
Output is correct |
13 |
Correct |
345 ms |
3956 KB |
Output is correct |
14 |
Correct |
403 ms |
3956 KB |
Output is correct |
15 |
Correct |
357 ms |
3956 KB |
Output is correct |
16 |
Correct |
327 ms |
3956 KB |
Output is correct |
17 |
Correct |
305 ms |
3956 KB |
Output is correct |
18 |
Correct |
325 ms |
3956 KB |
Output is correct |
19 |
Correct |
371 ms |
3956 KB |
Output is correct |
20 |
Correct |
361 ms |
3984 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
23 ms |
3984 KB |
Output is correct |
2 |
Correct |
35 ms |
3984 KB |
Output is correct |
3 |
Correct |
25 ms |
3984 KB |
Output is correct |
4 |
Correct |
28 ms |
3984 KB |
Output is correct |
5 |
Correct |
24 ms |
3984 KB |
Output is correct |
6 |
Correct |
32 ms |
3984 KB |
Output is correct |
7 |
Correct |
27 ms |
3984 KB |
Output is correct |
8 |
Correct |
26 ms |
3984 KB |
Output is correct |
9 |
Correct |
24 ms |
3984 KB |
Output is correct |
10 |
Correct |
25 ms |
3984 KB |
Output is correct |
11 |
Correct |
24 ms |
3984 KB |
Output is correct |
12 |
Correct |
30 ms |
3984 KB |
Output is correct |
13 |
Correct |
26 ms |
3984 KB |
Output is correct |
14 |
Correct |
21 ms |
3984 KB |
Output is correct |
15 |
Correct |
26 ms |
3984 KB |
Output is correct |
16 |
Correct |
24 ms |
3984 KB |
Output is correct |
17 |
Correct |
29 ms |
3984 KB |
Output is correct |
18 |
Correct |
25 ms |
3984 KB |
Output is correct |
19 |
Correct |
33 ms |
3984 KB |
Output is correct |
20 |
Correct |
22 ms |
3984 KB |
Output is correct |
21 |
Correct |
27 ms |
3984 KB |
Output is correct |
22 |
Correct |
25 ms |
3984 KB |
Output is correct |
23 |
Correct |
25 ms |
3984 KB |
Output is correct |
24 |
Correct |
38 ms |
3984 KB |
Output is correct |
25 |
Correct |
24 ms |
3984 KB |
Output is correct |
26 |
Correct |
37 ms |
3984 KB |
Output is correct |
27 |
Correct |
28 ms |
3984 KB |
Output is correct |
28 |
Correct |
27 ms |
3984 KB |
Output is correct |
29 |
Correct |
30 ms |
3984 KB |
Output is correct |
30 |
Correct |
32 ms |
3984 KB |
Output is correct |
31 |
Correct |
25 ms |
3984 KB |
Output is correct |
32 |
Correct |
24 ms |
3984 KB |
Output is correct |
33 |
Correct |
31 ms |
3984 KB |
Output is correct |
34 |
Correct |
31 ms |
3984 KB |
Output is correct |
35 |
Correct |
25 ms |
3984 KB |
Output is correct |
36 |
Correct |
28 ms |
3984 KB |
Output is correct |
37 |
Correct |
24 ms |
3984 KB |
Output is correct |
38 |
Correct |
23 ms |
3984 KB |
Output is correct |
39 |
Correct |
26 ms |
3984 KB |
Output is correct |
40 |
Correct |
27 ms |
3984 KB |
Output is correct |