InternBootcamp/internbootcamp/bootcamp/echoosingballs/echoosingballs.py
2025-05-23 15:27:15 +08:00

243 lines
7 KiB
Python
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""#
### 谜题描述
There are n balls. They are arranged in a row. Each ball has a color (for convenience an integer) and an integer value. The color of the i-th ball is ci and the value of the i-th ball is vi.
Squirrel Liss chooses some balls and makes a new sequence without changing the relative order of the balls. She wants to maximize the value of this sequence.
The value of the sequence is defined as the sum of following values for each ball (where a and b are given constants):
* If the ball is not in the beginning of the sequence and the color of the ball is same as previous ball's color, add (the value of the ball) × a.
* Otherwise, add (the value of the ball) × b.
You are given q queries. Each query contains two integers ai and bi. For each query find the maximal value of the sequence she can make when a = ai and b = bi.
Note that the new sequence can be empty, and the value of an empty sequence is defined as zero.
Input
The first line contains two integers n and q (1 ≤ n ≤ 105; 1 ≤ q ≤ 500). The second line contains n integers: v1, v2, ..., vn (|vi| ≤ 105). The third line contains n integers: c1, c2, ..., cn (1 ≤ ci ≤ n).
The following q lines contain the values of the constants a and b for queries. The i-th of these lines contains two integers ai and bi (|ai|, |bi| ≤ 105).
In each line integers are separated by single spaces.
Output
For each query, output a line containing an integer — the answer to the query. The i-th line contains the answer to the i-th query in the input order.
Please, do not write the %lld specifier to read or write 64-bit integers in С++. It is preferred to use the cin, cout streams or the %I64d specifier.
Examples
Input
6 3
1 -2 3 4 0 -1
1 2 1 2 1 1
5 1
-2 1
1 0
Output
20
9
4
Input
4 1
-3 6 -1 2
1 2 3 1
1 -1
Output
5
Note
In the first example, to achieve the maximal value:
* In the first query, you should select 1st, 3rd, and 4th ball.
* In the second query, you should select 3rd, 4th, 5th and 6th ball.
* In the third query, you should select 2nd and 4th ball.
Note that there may be other ways to achieve the maximal value.
Here is a reference code to solve this task. You can use this to help you genereate cases or validate the solution.
```python
#include <bits/stdc++.h>
using namespace std;
int n, v[100000], c[100000];
int q, a, b;
long long f[100000 + 1];
bool m[100000 + 1];
int x, y;
long long query(long long a, long long b) {
memset(f, 0, sizeof(f));
memset(m, 0, sizeof(m));
f[0] = x = y = 0;
long long res = 0;
for (int i = 0; i < n; ++i) {
long long other = c[i] == x ? f[y] : f[x];
if (m[c[i]]) {
long long old = f[c[i]];
f[c[i]] = max(old, max(old + v[i] * a, other + v[i] * b));
} else {
f[c[i]] = other + v[i] * b;
m[c[i]] = 1;
}
res = max(res, f[c[i]]);
if (c[i] == x || c[i] == y) {
if (f[x] < f[y]) {
int tmp = x;
x = y;
y = tmp;
}
} else {
if (f[c[i]] > f[x]) {
y = x;
x = c[i];
} else if (f[c[i]] > f[y]) {
y = c[i];
}
}
}
return res;
}
int main(int argc, char *argv[]) {
cin >> n >> q;
for (int i = 0; i < n; ++i) {
cin >> v[i];
}
for (int i = 0; i < n; ++i) {
cin >> c[i];
}
for (int i = 0; i < q; ++i) {
cin >> a >> b;
cout << query(a, b) << endl;
}
return 0;
}
```
请完成上述谜题的训练场环境类实现,包括所有必要的方法。
"""
from bootcamp import Basebootcamp
import random
from bootcamp import Basebootcamp
class Echoosingballsbootcamp(Basebootcamp):
def __init__(self, n_min=3, n_max=6, v_min=-5, v_max=5, c_max=3, q_min=1, q_max=3):
self.n_min = n_min
self.n_max = n_max
self.v_min = v_min
self.v_max = v_max
self.c_max = c_max
self.q_min = q_min
self.q_max = q_max
def case_generator(self):
n = random.randint(self.n_min, self.n_max)
v = [random.randint(self.v_min, self.v_max) for _ in range(n)]
c = [random.randint(1, self.c_max) for _ in range(n)]
q = random.randint(self.q_min, self.q_max)
queries = [(random.randint(-5, 5), random.randint(-5, 5)) for _ in range(q)]
expected_outputs = [self._compute_query(v, c, a, b) for a, b in queries]
return {
'n': n,
'q': q,
'v': v,
'c': c,
'queries': queries,
'expected_outputs': expected_outputs
}
@staticmethod
def _compute_query(v_list, c_list, a, b):
f = {}
x = None # Largest color
y = None # Second largest color
res = 0
for vi, ci in zip(v_list, c_list):
other = 0
if x is not None:
if ci == x:
other = f.get(y, 0) if y is not None else 0
else:
other = f.get(x, 0)
current = f.get(ci, -float('inf'))
new_val = other + vi * b
if current != -float('inf'):
new_val = max(new_val, current + vi * a)
f[ci] = max(current, new_val) if current != -float('inf') else new_val
res = max(res, f[ci])
# Update color rankings
colors = sorted(f.items(), key=lambda x: -x[1])
x = colors[0][0] if colors else None
y = colors[1][0] if len(colors) > 1 else None
return max(res, 0)
@staticmethod
def prompt_func(question_case) -> str:
n = question_case['n']
q = question_case['q']
v_str = ' '.join(map(str, question_case['v']))
c_str = ' '.join(map(str, question_case['c']))
queries = '\n'.join([f"{a} {b}" for a, b in question_case['queries']])
return f"""你是一个算法竞赛选手,需要解决以下问题:
给定{n}个球按序排列每个球有颜色c和值v。现在有{q}个查询每个查询给出系数a和b。要求对每个查询找出最大子序列值。规则如下
1. 子序列保持原顺序
2. 第一个球的贡献为v_i × b
3. 后续球如果颜色与前一个相同贡献为v_i × a否则为v_i × b
输入数据:
n = {n}, q = {q}
v数组: {v_str}
c数组: {c_str}
查询列表:
{queries}
请计算每个查询的最大价值,并按顺序将结果用换行分隔放在[answer]标签内,例如:
[answer]
结果1
结果2
[/answer]"""
@staticmethod
def extract_output(output):
import re
matches = re.findall(r'\[answer\](.*?)\[/answer\]', output, re.DOTALL)
if not matches:
return None
answers = []
for line in matches[-1].strip().split('\n'):
line = line.strip()
if line:
try:
answers.append(int(line))
except:
continue
return answers if answers else None
@classmethod
def _verify_correction(cls, solution, identity):
expected = identity['expected_outputs']
return isinstance(solution, list) and len(solution) == len(expected) and all(s == e for s, e in zip(solution, expected))