| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | USACO 2023 US Open Contest, Platinum, Pareidolia | 100 (p) | 4.0s | 512M |
| 2 | USACO 2023 US Open Contest, Platinum, Good Bitstrings | 100 (p) | 2.0s | 256M |
| 3 | USACO 2023 US Open Contest, Platinum, Triples of Cows | 100 (p) | 2.0s | 256M |
Note: Giới hạn thời gian của bài này là 4s, gấp đôi so với thông thường. Bộ nhớ là 512MB, gấp đôi so với thông thường
Pareidolia là một hội chứng mà mắt bạn có xu hướng nhìn thấy những thứ quen thuộc trong ảnh mà thậm chí không tồn tại (ví dụ như thấy một gương mặt trên đám mây). Nông dân John, một người với niềm yêu thương những chú bò của mình, thường xuyên thấy những thứ liên quan đến bò trong mọi vật dụng. Ví dụ, nếu như bác John thấy xâu "bqessiyexbesszieb", đôi mắt của bác sẽ tự động bỏ đi một số kí tự và nhầm lẫn thành "bessiexbessieb" - một xâu gồm \(2\) xâu con liên tiếp "bessie" (tên một cô bò mà bác rất yêu quý).
Với một xâu \(s\), ta gọi \(B(s)\) là số lượng xâu con liên tiếp "bessie" nhiều nhất có thể đạt được từ xâu \(s\) nếu xoá đi \(0\) hoặc nhiều kí tự trong xâu \(s\). Trong ví dụ trên, \(B(\)"bqessiyexbesszieb"\() = 2\). Và với mỗi xâu \(t\), gọi \(A(t)\) là tổng các \(B(s)\) với \(s\) là xâu con liên tiếp của xâu \(t\).
Bác John đưa cho bạn một xâu \(t\) có độ dài không quá \(2 \times 10^5\) chỉ bao gồm các chữ cái in thường. Hãy tính toán \(A(t)\) và sự thay đổi của \(A(t)\) sau \(U\) \((1 \le 2 \times 10^5)\) lần cập nhật, mỗi lần sẽ thay đổi một kí tự trong xâu \(t\). Mỗi lần cập nhật đều áp dụng trực tiếp lên xâu \(t\).
Test 1
bessiebessie
3
3 l
7 s
3 s
14
7
1
7
Ban đầu, có \(12\) xâu con liên tiếp chứa \(1\) xâu "bessie" và \(1\) xâu con liên tiếp chứa \(2\) xâu "bessie", như vậy \(A(t) = 12 \times 1 + 1 \times 2 = 14\).
Sau lần cập nhật đầu tiên, xâu \(t\) trở thành "belsiebessie". Có đúng \(7\) xây con liên tiếp chứa \(1\) xâu "bessie".
Sau lần cập nhật thứ hai, xâu \(t\) trở thành "belsiesessie". Cả xâu \(t\) mới tạo được \(1\) xâu "bessie".
Với \(2\) số nguyên dương \(a\) và \(b\) bất kì. Ta định nghĩa hàm gen_string(a, b) bởi đoạn code Python sau:
def gen_string(a: int, b: int):
res = ""
ia, ib = 0, 0
while ia + ib < a + b:
if ia * b <= ib * a:
res += '0'
ia += 1
else:
res += '1'
ib += 1
return res
Tương đương với đoạn code C++ sau:
string gen_string(int64_t a, int64_t b) {
string res;
int ia = 0, ib = 0;
while (ia + ib < a + b) {
if ((__int128)ia * b <= (__int128)ib * a) {
res += '0';
ia++;
} else {
res += '1';
ib++;
}
}
return res;
}
gen_string(a, b) trên sẽ sinh ra một xâu nhị phân độ dài \(a + b\) chứa đúng \(a\) bit \(0\) và \(b\) bit \(1\). Ví dụ, gen_string(4,10)=01110110111011.
Một xâu nhị phân \(s\) được gọi là "tốt" nếu như tồn tại \(2\) số nguyên dương \(x\) và \(y\) sao cho \(s =\) gen_string(x, y). Bạn được cho \(2\) số \(A\) và \(B\) \((1 \le A, B \le 10^{18})\), bạn cần tính toán số xâu tiền tố "tốt" của xâu gen_string(A, B). Ví dụ, có \(6\) xâu tiền tố "tốt" của xâu gen_string(4, 10):
| X | Y | gen_string(X, Y) |
|---|---|---|
| x = 1 | y = 1 | gen_string(x, y) = 01 |
| x = 1 | y = 2 | gen_string(x, y) = 011 |
| x = 1 | y = 3 | gen_string(x, y) = 0111 |
| x = 2 | y = 5 | gen_string(x, y) = 0111011 |
| x = 3 | y = 7 | gen_string(x, y) = 0111011011 |
| x = 4 | y = 10 | gen_string(x, y) = 01110110111011 |
Test 1
6
1 1
3 5
4 7
8 20
4 10
27 21
1
5
7
10
6
13
Có \(N - 1\) cặp bạn bè trong \(N\) chú bò của nông dân John \((2 \le N \le 2 \times 10^5)\) được đánh số từ \(1\) đến \(N\), tạo thành một đồ thị cây. Những chú bò đang rời trang trại lần lượt để đi chơi trong kì nghỉ. Ngày thứ \(i\), chú bò \(i\) sẽ rời trang trại, sau đó tất cả bạn bè của chú ta mà hiện tại vẫn trong trang trại sẽ trở thành bạn của nhau.
Với mỗi \(i \in [1, N]\), ngay trước khi chú bò \(i\) rời khỏi trang trại, bao nhiêu bộ ba có thứ tự \((a, b, c)\) thoả mãn không có chú bò nào trong ba chú bò \(a, b, c\) đang trong kì nghỉ và \(a\) là bạn của \(b\), \(b\) là bạn của \(c\).
Test 1
3
1 2
2 3
2
0
0
\((1, 2, 3)\) và \((3, 2, 1)\) là các bộ ba thoả mãn trước khi chú bò \(1\) rời đi
Sau khi chú bò \(1\) rời đi, chỉ còn \(2\) chú bò ở lại, không còn bộ ba nào cả.
Test 2
4
1 2
1 3
1 4
6
6
0
0
Ban đầu, chú bò \(1\) là bạn của tất cả chú bò còn lại, vì vậy các bộ ba sẽ có dạng \((a, 1, c)\) và có tất cả \(6\) bộ ba như vậy
Sau khi chú bò \(1\) rời đi, tất cả \(3\) chú bò còn lại đã trở thành bạn của nhau, vì vậy số bộ ba là \(6\).
Sau khi chú bò \(2\) rời đi, có ít hơn \(3\) chú bò nên không thể tạo thành bộ ba nào cả.
Test 3
5
3 5
5 1
1 4
1 2
8
10
2
0
0