| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | LQDOJ CUP 2022 - Round 6 - SOLDIER | 100 (p) | 1.0s | 512M |
| 2 | LQDOJ CUP 2022 - Round 6 - DYSLEXIA | 100 (p) | 1.0s | 1G |
| 3 | LQDOJ CUP 2022 - Round 6 - SUSSET | 100 (p) | 2.0s | 512M |
Vào một ngày nọ, bạn của Long giới thiệu cho cậu một tựa game chiến thuật khá nổi tiếng dạo gần đây. Trò chơi cung cấp cho Long \(n\) quân lính, quân lính thứ \(i\) (\(1 \leq i \leq n\)) có chỉ số sức mạnh là \(p_i\). Ở mỗi màn chơi sẽ có một con quái vật, giả sử con quái vật có chỉ số sức mạnh là \(k\), để tiêu diệt được nó Long phải chọn ra một đội hình gồm các quân lính sao cho tổng sức mạnh các quân lính đó không nhỏ hơn \(k\).
Biết rằng trò chơi có nhiều màn và các quân lính cậu đã chọn vào đội hình sẽ biến mất và không thể sử dụng lại, Long phải tính toán làm sao để sử dụng tối ưu các quân lính của mình. Cậu nhận thấy rằng trong đội hình có thể có một vài quân lính không quan trọng.
Vì vậy nên Long muốn xác định xem trong \(n\) quân lính, quân lính thứ \(i\) có quan trọng hay không. Quân lính thứ \(i\) (\(1 \leq i \leq n\)) được xem là quan trọng hay không dựa theo quy tắc sau:
Lưu ý: Đội hình có thể không có quân lính nào cả.
Vì số lượng quân lính là rất lớn nên Long nhờ bạn xác định giúp cậu.
Test 1
4 10
4 1 6 2
1010
Câu chuyện của chúng ta xảy ra vào hai thời điểm khác nhau, vào hai cuộc thi khác nhau.
Nhưng dù thời gian khác nhau, thì không gian cũng đều giống nhau và không có thật: mọi thứ đều được đếm từ \(0\) thay vì đếm từ \(1\).
Đề thi của bảng thi C1 là về nhận diện chữ số.
Hesll đã chuyển được các bức ảnh về dưới dạng nhiều dãy có \(n\) bit. Tuy nhiên, nếu chỉ đơn thuần nhét các xâu nhị phân, thì code không thể lưu được nhiều hình ảnh để đối chiếu. Vì vậy, Hesll nhờ vào phép nén Base64.
Một xâu nhị phân \(X\) gồm \(n\) bit \(X_0X_1X_2\dots X_{n-2}X_{n-1}\) có thể được nén về dạng Base64 thành xâu \(X'\) theo các bước như sau:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/Để chuyển ngược lại từ dãy \(X'\) dạng Base64 về thành dãy nhị phân \(X\), ta làm ngược lại quy trình trên.
Phần Input của chúng ta sẽ được nhập vào dưới dạng này. Tuy nhiên, hôm nay trọng tâm của chúng ta không phải là về Base64, vì vậy Hesll sẽ không bắt các bạn phải code nguyên đoạn chuyển đổi từ đầu vào Base64 thành dãy nhị phân. Do đó, các bạn có thể tham khảo code nhập đầu vào ở phần Note.
Ở một kỳ thi Codeforces gần đây, bạn Hesll một lần nữa lại đọc nhầm đề mà quên mất rằng, nó chỉ là bài B mà thôi. Hesll đọc nhầm đề bài thành như sau:
Với một xâu nhị phân \(X\) bất kỳ, gọi \(x\) và \(y\) lần lượt là số lượng chữ số \(1\) và \(0\) trong xâu nhị phân đó. Khi đó, trọng số \(w\) của xâu \(X\) là:
Cho xâu \(S\) có \(n = |S|\) là độ dài xâu. Một xâu được gọi là xâu con liên tiếp (gọi tắt là xâu con) của xâu \(S\) nếu nó có thể được tạo bằng cách xóa đi một số ký tự đầu tiên và cuối cùng của xâu. Khi đó, xâu con bắt đầu từ vị trí \(l\), kết thúc tại vị trí \(r\) được gọi là xâu \(S_{l, r}\) \((0 \le l \le r < n)\).
Ví dụ, abc là xâu con liên tiếp của dabce nhưng không phải là xâu con liên tiếp của adbce.
Cho xâu nhị phân \(S\) có độ dài \(n\). Tính \(\sum\limits_{l=0}^{n-1} \sum\limits_{r=l}^{n-1} w(S_{l,r})\), hay nói cách khác là tổng trọng số của mọi xâu con liên tiếp của \(S\).
Tất nhiên, vì đã kể câu chuyện 1, nên xâu đầu vào của chúng ta sẽ có dạng Base64, và chúng ta phải chuyển đổi sang xâu nhị phân có độ dài \(n\) trước khi bắt đầu xử lý thuật toán.
Base64 của xâu \(S\). Mỗi ký tự chỉ thuộc vào một trong số \(64\) ký tự sau: `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`
Test 1
4
G
18
Xâu được chuyển đổi là 0110.
| Xâu con | Trọng số | Xâu con | Trọng số | Xâu con | Trọng số | Xâu con | Trọng số |
|---|---|---|---|---|---|---|---|
0 |
\(1\) | 01 |
\(1\) | 011 |
\(2\) | 0110 |
\(4\) |
1 |
\(1\) | 11 |
\(4\) | 110 |
\(2\) | ||
1 |
\(1\) | 10 |
\(1\) | ||||
0 |
\(1\) |
Đoạn code sau giúp chuyển đổi một xâu Base64 kiểu string ra một mảng hằng \(S\).
Đầu tiên, người dùng gọi hàm initBase64() để khởi tạo chức năng xử lý, và sau khi nhập xâu \(S64\) thì gọi hàm b64Conversion(S64) để chuyển đổi và lưu xâu nhị phân thành phẩm gồm các ký tự 0 và 1 vào mảng \(S\).
#include <bits/stdc++.h>
using namespace std;
const char B64[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int position[256];
void initBase64(){
for (int i = 0; i < 64; i++) {
position[B64[i]] = i;
}
}
#define MAX 10000001
int n;
string S64;
char S[MAX];
void b64Conversion(const string &s){
int ptr = 0;
for (char c: s){
int x = position[c];
for (int i = 0; i < 6; i++){
S[ptr++] = (x & 1) + '0';
x >>= 1;
}
}
}
int main(){
ios_base::sync_with_stdio(false); cin.tie(nullptr);
cin >> n >> S64;
initBase64(); b64Conversion(S64);
// main logic goes here
}
Một cặp số nguyên dương \((x, y)\) được gọi là bí ẩn nếu với \(a, b\) lần lượt là số ước dương lẻ và số ước dương chẵn của \(x \cdot y\) ta có tổng \(GCD(a, b) + LCM(a, b)\) là một số lẻ. Trong đó \(GCD(a, b)\) là ước chung lớn nhất của \(a\) và \(b\), \(LCM(a,b)\) là bội chung nhỏ nhất của \(a\) và \(b\).
Gọi \(S\) là tập hợp gồm \(k\) số nguyên phân biệt \(\{S_1, S_2, \ldots, S_k\}\). Xét đồ thị gồm \(k\) đỉnh đánh số từ \(1\) tới \(k\). Với mọi cặp \(1 \leq u,v \leq k\), nếu \(S_u\) và \(S_v\) là một cặp bí ẩn thì ta nối một cạnh có hướng nối từ \(u\) tới \(v\). Gọi \(d(u,v)\) là độ dài đường đi ngắn nhất từ \(u\) với \(v\), nếu \(u\) không có đường đi tới \(v\) thì \(d(u,v)=10^{18}\). Độ bí ẩn của tập hợp \(S\) sẽ là \(\max\limits_{1 \leq u,v \leq k}\{d(u,v)\}\). Cho hai số nguyên dương \(n\) và \(k\), với mọi tập hợp \(S\) gồm \(k\) số nguyên phân biệt thỏa \(1 \leq S_i \leq n\), tìm độ bí ẩn nhỏ nhất và số lượng tập hợp có độ bí ẩn nhỏ nhất.
Lưu ý: Hai tập hợp là khác nhau khi tồn tại ít nhất một phần tử xuất hiện trong tập này mà không xuất hiện ở tập kia.
Test 1
1
4 2
1 1