Nguồn: https://codeforces.com/problemset/problem/755/C
Tóm tắt: đếm số thành phần liên thông.
Code:
Nguồn: https://codeforces.com/problemset/problem/520/B/
Tóm tắt: Có một thiết bị có 2 nút đỏ và xanh, nút đỏ sẽ nhân số lên 2 lần, nút xanh sẽ trừ số đi 1. Thao tác đến khi nào số âm thì dừng. Bắt đầu với số .
Nhận xét:
Với thì với nút xanh ta luôn có cách để cho về .
Với thì với nút đỏ ta có thể nhân đôi số lên, nếu số khi đó lớn hơn thì ta vẫn có thể dùng nút xanh để giảm xuống.
Giả sử ta có số , thì số này có hai trạng thái là (nút đỏ) và (nút xanh). Từ đó, ta có thể tạo đồ thị để nối với đỉnh và nối với đỉnh .
Để biến thành ta phải thực hiện số lần ấn nút ít nhất hay tìm đường đi ngắn nhất từ đến bằng cách sử dụng duyệt BFS.
Gọi là đường đi ngắn nhất từ đến .
Trường hợp cơ sở:
Mỗi lần thăm một đỉnh kề ta sẽ cập nhật trạng thái nghĩa là gán đường đi ngắn nhất mới bằng đường đi ngắn nhất cũ cộng thêm 1.
Kết quả là .
Code:
Nguồn: https://codeforces.com/problemset/problem/506/D
Tóm tắt: Cho một đồ thị có đỉnh và cạnh, mỗi đỉnh của đồ thị được đánh số từ đến , cạnh thứ có màu là () liên thông với đỉnh và (). Có () truy vấn, mỗi truy vấn cho hai số nguyên và .
Sample input
Sample output
Giải thích:
Nhận xét:
Ta có thể tách đồ thị ra theo màu, nghĩa là có bao nhiêu màu thì tách ra bấy nhiêu đồ thị. Giả sử ta có màu và đỉnh , thì ta sẽ lưu ở mảng (màu , đỉnh , đỉnh ). Ta sẽ DFS trên đồ thị màu đó và đánh dấu , với mỗi truy vấn chúng ta sẽ duyệt màu nếu thì ta vào kết quả.
Code:
Giải thích:
Nguồn: https://codeforces.com/problemset/problem/1517/C
Tóm tắt: Cho một bàn cờ có kích thước . Các hàng được đánh số từ đến từ trên xuống dưới, các cột được đánh số từ đến từ trái sang phải. Một ô là giao của hàng thứ và cột thứ được ký hiệu là , đường chéo chính của bàn cờ là các ô với . Với mỗi số trên đường chéo chính, chẳng hạn với số thì hãy tìm cách xếp vào phía dưới đường chéo chính sao cho các dãy số cùng thuộc một thành phần liên thông và xuất hiện đúng p lần (tính cả số ở đường chéo chính).
Ví dụ:
Với các số trên đường chéo chính đã nhập, ta có thể ra được đáp án như hình (số 2 xuất hiện 2 lần, số 3 xuất hiện 3 lần, số 1 xuất hiện 1 lần và với mỗi số đều thuộc một thành phần liên thông).
Ví dụ này tương tự.
Sample input 1:
Sample output 1:
Sample input 2:
Sample output 2:
Nhận xét:
Code:
Nguồn: https://codeforces.com/problemset/problem/1106/D
Tóm tắt: Công viên được biểu diễn dưới dạng đồ thị liên thông có nút và cạnh hai chiều. Ban đầu Bob đang ở nút và anh ấy ghi lại trên sổ ghi chép của anh ấy, anh ta có thể đi từ nút này sang nút khác và bất cứ khi nào anh ấy thăm một nút mà anh ấy chưa ghi chép lại thì anh ấy sẽ ghi chép lại nó. Hãy giúp Bob tìm chuỗi nút nhỏ nhất theo thứ tự từ điển mà anh ấy có thể ghi lại.
Sample input 1:
Sample output 1:
Sample input 2:
Sample output 2:
Sample input 3:
Sample output 3:
Nhận xét:
Code:
Giải thích:
Nguồn: https://codeforces.com/problemset/problem/1552/B
Đề bài:
Đại hội thể thao Olympic vừa bắt đầu và Federico rất háo hức để xem cuộc đua marathon. Sẽ có vận động viên, được đánh số từ đến , cạnh tranh trong cuộc đua marathon và mỗi vận động viên trong quá khứ đều đã tham gia vào cuộc thi marathon quan trọng, được đánh số từ đến . Đối với mỗi và , Federico nhớ rằng vận động viên thứ đạt hạng trong cuộc thi marathon thứ (ví dụ: nghĩa là vận động viên thứ 2 đạt hạng 3 trong cuộc thi marathon thứ 4). Federico coi vận động viên đạt hạng tốt hơn vận động viên trong ít nhất cuộc marathon trước đây, tức là cho ít nhất giá trị khác nhau của . Federico tin rằng một vận động viên có khả năng giành được huy chương vàng tại Olympic nếu anh ta vượt trội hơn các vận động viên còn lại.
Sample input 1:
Sample output 1:
Nhận xét:
Vận động viên cuối cùng đạt hạng ít nhất ba lần là vận động viên thứ . Để tính được , ta sẽ kiểm tra từng vận động viên xem vận động viên có hơn vận động viên ít nhất ba giải hay không, nếu có cập nhật là vị trí của VĐV đó luôn.
Sau khi đã có thì ta tiếp tục duyệt lại. Nếu không có VĐV nào có từ ba giải trở lên thì thôi. Nếu có từ ba giải trở lên nghĩa là cùng bằng với VĐV mà ta tính được thì suy ra không dự đoán được VĐV nào.
Code:
Nguồn: https://codeforces.com/contest/1327/problem/B
Đề bài:
Vua Polycarp LXXXIV có n con gái, được đánh số từ 1 đến n, và cũng có n vương quốc khác nhau. Mỗi công chúa đã lập danh sách các vương quốc mà cô muốn kết hôn. Quá trình kết hôn diễn ra theo cách tham lam, lần lượt cho từng công chúa. Đối với công chúa đầu tiên, Vua Polycarp chọn vương quốc có số thứ tự nhỏ nhất trong danh sách của cô và cho cô kết hôn với hoàng tử của vương quốc đó. Đối với công chúa thứ hai, ông chọn vương quốc có số thứ tự nhỏ nhất trong danh sách của cô, nhưng hoàng tử của vương quốc đó chưa được chọn trước đó. Nếu không có hoàng tử nào còn trống trong danh sách, công chúa không kết hôn và Vua Polycarp tiếp tục với công chúa tiếp theo. Quá trình này diễn ra cho đến công chúa thứ n.
Tuy nhiên, trước khi bắt đầu quá trình kết hôn, Vua Polycarp LXXXIV có thời gian thuyết phục một trong các công chúa của mình rằng có một hoàng tử khác cũng đáng kết hôn. Ông có thể thêm chính xác một vương quốc vào danh sách của một trong các công chúa. Lưu ý rằng vương quốc này không được có trong danh sách của công chúa đó.
Vua Polycarp LXXXIV muốn tăng số cặp kết hôn. Nếu không có cách nào để tăng số lượng cặp kết hôn, yêu cầu in ra "OPTIMAL". Nếu có nhiều cách để thêm một mục vào danh sách để tăng số lượng cặp kết hôn, in ra bất kỳ cách nào.
Đầu vào của bài toán bao gồm số lượng bộ test cases t, sau đó là t test cases. Mỗi test case bao gồm số nguyên n (1 ≤ n ≤ 10^5), số lượng công chúa và số lượng vương quốc. Tiếp theo là n dòng mô tả danh sách của mỗi công chúa. Dòng đầu tiên chứa số nguyên k (0 ≤ k ≤ n), là số lượng mục trong danh sách của công chúa thứ i. Sau đó là k số nguyên không trùng lặp g1, g2, …, gk (1 ≤ gi ≤ n), đại diện cho các vương quốc trong danh sách của công chúa thứ i.
Đầu ra của bài toán là kết quả cho từng test case. Nếu có thể thêm một vương quốc vào danh sách một công chúa để tăng số lượng cặp kết hôn, in ra "IMPROVE", sau đó in ra hai số nguyên là chỉ số của công chúa và chỉ số của vương quốc mà Vua Polycarp LXXXIV nên thêm vào danh sách của công chúa đó. Nếu có nhiều cách để thêm một mục vào danh sách để tăng số lượng cặp kết hôn, in ra bất kỳ cách nào. Nếu không có cách nào để thay đổi số lượng cặp kết hôn bằng cách thêm mục vào danh sách, in ra "OPTIMAL".
Sample input 1:
Sample output 1:
Nhận xét:
Ta duyệt qua từng con gái và từng hoàng tử trong danh sách. Nếu con gái và hoàng tử đang xét chưa được kết hôn với ai (biểu thức !a[i] && !b[j]), chương trình đánh dấu con gái và hoàng tử đó đã kết hôn bằng cách gán a[i] = b[j] = 1.
Tiếp theo, chương trình tìm vị trí đầu tiên của phần tử 0 trong mảng a (dòng int u = (find(all(a), 0ll) - a.begin())) và vị trí đầu tiên của phần tử 0 trong mảng b (dòng int v = (find(all(b), 0ll) - b.begin())). Nếu không tìm thấy phần tử 0 trong cả hai mảng, tức là không có cách nào để tăng số cặp kết hôn, chương trình in ra "OPTIMAL". Ngược lại, chương trình in ra "IMPROVE" cùng với vị trí của con gái và hoàng tử mà khi ghép cặp sẽ tạo ra một cặp kết hôn mới.
Code:
Nguồn: https://codeforces.com/problemset/problem/292/B
Đề bài:
Có ba loại mạng chính: mạng bus, mạng ring và mạng star.
Mạng bus là một mạng trong đó các máy tính được kết nối thông qua một đường cáp chung. Trong mạng bus, tất cả các nút đều kết nối với hai nút khác, trừ hai nút đầu và cuối của đường cáp.
Mạng ring là một mạng trong đó mỗi máy tính chỉ kết nối với hai máy tính khác. Các máy tính được kết nối thành một vòng.
Mạng star là một mạng trong đó có một nút trung tâm được kết nối với tất cả các nút khác trong mạng.
Đề bài yêu cầu người chơi xác định loại mạng của mạng đã cho. Nếu không thể xác định được, người chơi cần in ra "unknown topology" (loại mạng không xác định).
Đề bài cho biết đầu vào gồm hai số nguyên n và m, thể hiện số lượng nút và số lượng cạnh trong đồ thị mạng. Tiếp theo là m dòng mô tả các cạnh của đồ thị. Mỗi dòng chứa hai số nguyên xi và yi, thể hiện các nút được kết nối bởi một cạnh. Đồ thị được đảm bảo là liên thông. Có tối đa một cạnh nối hai nút bất kỳ với nhau.
Đầu ra của bài toán là in ra tên loại mạng của đồ thị đã cho. Nếu đồ thị tương ứng với mạng bus, in ra "bus topology". Nếu đồ thị tương ứng với mạng ring, in ra "ring topology". Nếu đồ thị tương ứng với mạng star, in ra "star topology". Nếu không có loại mạng nào phù hợp, in ra "unknown topology".
Sample input 1:
Sample output 1:
Sample input 2:
Sample output 2:
Sample input 3:
Sample output 3:
Sample input 3:
Sample output 3:
Nhận xét:
Khởi tạo mảng đếm số cạnh của đỉnh đồ thị.
Dựa vào hình trên, ta có thể thấy nếu ta đếm được đỉnh đầu và đỉnh cuối chỉ được nối với một và số lượng những đỉnh được nối bởi hai cạnh bằng với .
Dựa vào hình trên, ta có thể thấy mỗi đỉnh của đồ thị được nối bởi hai cạnh.
Dựa vào hình trên, ta có thể thấy sẽ có đỉnh được nối nhiều hơn ba cạnh và tất cả các đỉnh còn lại thì chỉ nối với một cạnh.
Code: