• VNOJ
  • Trang chủ
  • Danh sách bài
  • Các bài nộp
  • Thành viên
    >
    • Tổ chức
  • Các kỳ thi
  • Wiki
  • Thông tin
    >
    • FAQ
    • Trình chấm ngoài
    • Tag
    • Máy chấm
    • Devlog
    • Github
    • Tickets
    • Thư viện đề thi
    • Đề xuất contest
  • Tạp chí
VI EN Đăng nhập  hoặc  Đăng ký

Chào mừng bạn đến với VNOI Online Judge!

VNOJ - VNOI Online Judge là hệ thống online judge open source chính thức của VNOI, dựa trên nền tảng của hệ thống DMOJ.

VNOJ được tạo ra với mục đích xây dựng một môi trường luyện tập và cạnh tranh dành cho cộng đồng Tin Học Việt Nam. VNOJ là một hệ thống chấm bài tự động hoàn toàn độc lập của VNOI và là bước tiến tiếp theo trong quá trình di dời và nâng cấp VOJ.

Hiện nay, hệ thống VNOJ đã đưa trở lại kho bài tập rộng lớn từ hệ thống cũ VOJ (bao gồm các đề thi Học Sinh Giỏi Quốc Gia, ACM-ICPC, ... qua các năm). Kho bài tập này sẽ được cập nhật thường xuyên với những bài tập mới từ các kì thi, trong đó có những kì thi luyện tập trên VNOJ và những đề thi chính thức của VNOI.

Nếu đây là lần đầu tiên tham gia VNOJ, hãy đăng ký tài khoản. Sau đó, thử bài tập A cộng B.

  • Blog
  • Sự kiện
  • Tin tức
  • Blog

-3

giải K-dominant Subarray

HaDat_Python đã đăng vào 3, Tháng 1, 2026, 11:06

include <bits></bits>

using namespace std;

int main(){ ios::syncwithstdio(false); cin.tie(nullptr);

int N, K;
cin >> N >> K;
vector<long long> a(N);
for(int i = 0; i < N; i++) cin >> a[i];

unordered_map<long long, vector<int>> pos;
pos.reserve(N * 2);

for(int i = 0; i < N; i++)
    pos[a[i]].push_back(i + 1);

long long ans = 0;

for(auto &p : pos){
    auto &v = p.second;
    int t = v.size();
    if(t < K) continue;

    for(int i = 0; i + K - 1 < t; i++){
        for(int j = i + K - 1; j < t; j++){
            int c = j - i + 1;
            int maxLen = 2 * c - 1;

            int Lmin = v[j] - maxLen + 1;
            int Lmax = v[i];

            int Rmin = v[j];
            int Rmax = v[i] + maxLen - 1;

            Lmin = max(Lmin, 1);
            Lmax = min(Lmax, v[i]);

            Rmin = max(Rmin, v[j]);
            Rmax = min(Rmax, N);

            if(Lmin > Lmax || Rmin > Rmax) continue;

            long long total = 1LL * (Lmax - Lmin + 1) * (Rmax - Rmin + 1);
            ans += total;
        }
    }
}

cout << ans;

}

HaDat_Python
o3, Tháng 1, 2026, 11:06 0

0

K-Dominant Subarray

HaDat_Python đã đăng vào 3, Tháng 1, 2026, 11:02

Cho mảng gồm 𝑁 N số nguyên dương 𝐴 1 , 𝐴 2 , … , 𝐴 𝑁 A 1 ​

,A 2 ​

,…,A N ​

và một số nguyên 𝐾 K.

Một đoạn con liên tiếp [ 𝐿 , 𝑅 ] [L,R] được gọi là K-dominant nếu tồn tại một giá trị 𝑋 X sao cho:

số lần xuất hiện của 𝑋 X trong đoạn lớn hơn tổng số lần xuất hiện của tất cả các giá trị khác trong đoạn (tức là 𝑓 𝑟 𝑒 𝑞 ( 𝑋 ) > ( 𝑅 − 𝐿 + 1 ) − 𝑓 𝑟 𝑒 𝑞 ( 𝑋 ) freq(X)>(R−L+1)−freq(X))

và đồng thời 𝑓 𝑟 𝑒 𝑞 ( 𝑋 ) ≥ 𝐾 freq(X)≥K.

Hãy đếm số lượng đoạn con K-dominant.

Ràng buộc:

1 ≤ 𝑁 ≤ 2 × 10 5 1≤N≤2×10 5

1 ≤ 𝐴 𝑖 ≤ 10 9 1≤A i ​

≤10 9

1 ≤ 𝐾 ≤ 𝑁 1≤K≤N

Input:

N K A1 A2 ... AN

Output: In ra một số nguyên là số đoạn con K-dominant.

Ví dụ:

Input 6 2 1 2 2 2 3 2

Output 7

HaDat_Python
o3, Tháng 1, 2026, 11:02 0

0

hello

SoMotThanhXuan đã đăng vào 22, Tháng 12, 2025, 2:40

downvote toi di

SoMotThanhXuan
o22, Tháng 12, 2025, 2:40 0

23

VNOI Wiki: Kỹ thuật sinh test

dvtd đã đăng vào 21, Tháng 12, 2025, 4:56

🖐️ Xin chào các bạn, trong bài viết lần này, VNOI Wiki xin giới thiệu đến các bạn nội dung về Kỹ thuật sinh test. Đây là kỹ năng thực chiến quan trọng trong mọi kỳ thi, giúp bạn chủ động phát hiện những lỗi sai mà test ví dụ thường bỏ sót, đồng thời kiểm soát chặt chẽ thời gian chạy của thuật toán trong trường hợp xấu nhất.

💻 Bài viết hệ thống hóa toàn bộ kiến thức về Kỹ thuật sinh test, trải dài từ tư duy lý thuyết đến ứng dụng thực tiễn, bao gồm:

  • Vai trò của sinh test trong việc phát hiện lỗi và kiểm soát thời gian chạy trong các kỳ thi Offline/Online, đặc biệt là tại kỳ thi Học sinh giỏi Quốc gia môn Tin học sắp tới.

  • Phương pháp xây dựng Code "trâu", Code chuẩn và Generator hiệu quả.

  • Kỹ thuật sinh test random hiệu quả, đo thời gian chạy và template trình chấm tự động.

🔗 Link bài viết: Kỹ thuật sinh test, tự kiểm tra code | VNOI Wiki

✍️ Biên soạn: Nguyễn Quang Minh minhcool - Michigan State University.

✅ Reviewers:

  • Lê Minh Hoàng Monarchuwu - Trường Đại học Khoa học Tự nhiên, ĐHQG-HCM.
  • Võ Đức Đoàn KAKOII - THPT Chuyên Nguyễn Tất Thành, Quảng Ngãi.

  • Nguyễn Tiến Mạnh ngtmanh - Đại học Bách khoa Hà Nội.

  • Nguyễn Tấn Minh unknownnaciul - Trường Đại học Khoa học Tự nhiên, ĐHQG-HCM.

💖 VNOI xin cảm ơn đội ngũ TNV và Admin đã dành tâm huyết hoàn thiện nội dung này. Mong rằng các bạn sẽ nắm vững và vận dụng thành thạo kỹ thuật sinh test trong quá trình luyện tập. Đừng quên theo dõi VNOI để đón đọc những bài viết tiếp theo nhé!

✨ Chúc các bạn ôn luyện hiệu quả và đạt kết quả cao nhất trong kỳ thi HSGQG sắp tới!

dvtd
o21, Tháng 12, 2025, 4:56 0

1

Chủ đề sinh test

MnhatBeo đã đăng vào 20, Tháng 12, 2025, 15:14

Mẹo sinh test cực nhanh

Bình thường các bạn làm bài như nào thì cứ làm như thế(tạo project xog add INP và OUT rồi làm)
Khi muốn sinh test và so sánh code trâu và code full thì tạo 1 folder mới
- Tạo file main_trau.cpp và dán code trâu vào
- Tạo file main.cpp và dán code full vào
- Tạo file test.cpp và code sinh test(có thể đọc ở dưới blog của tôi)
Sử dụng lệnh cmd để build file cpp ra exe:
** ĐỂ CHẠY NHANH THÌ CÁC BẠN COPY HẾT CẢ 3 DÒNG VÀ CLICK CHUỘT PHẢI VÀO CMD, KHÔNG PHẢI COPY TỪNG DÒNG 1 VÀ CHẠY TỪNG LỆNH 1

g++ test.cpp -o test
g++ main.cpp -o main
g++ main_trau.cpp -o main_trau

Cuối cùng là chạy test.exe
MnhatBeo
o20, Tháng 12, 2025, 15:14 2

2

Quy Hoạch Động Là Gì ?

ducthiennct đã đăng vào 14, Tháng 12, 2025, 15:33

Quy hoạch động (DP) là một kỹ thuật thuật toán thường dựa trên một công thức truy hồi và một (hoặc một vài) trạng thái khởi đầu. Một lời giải con của bài toán được xây dựng từ các lời giải trước đó. Các thuật toán DP có độ phức tạp đa thức, giúp đảm bảo thời gian chạy nhanh hơn nhiều so với các kỹ thuật khác như quay lui (backtracking) hay brute-force.

I. BÀI TOÁN ĐỔI TIỀN

Cho một danh sách gồm N đồng xu với giá trị V1, V2, ..., VN và một tổng tiền cần đạt được là S. Hãy tìm số lượng đồng xu ít nhất sao cho tổng của chúng bằng S (có thể sử dụng một đồng xu nhiều lần), hoặc kết luận rằng không thể chọn được tập hợp đồng xu thỏa mãn điều kiện.

  1. Xác định trạng thái

Ta gọi Min[i] là số lượng đồng xu ít nhất để tạo ra tổng i (với i ≤ S). Trạng thái nhỏ hơn của i là mọi Min[j] với j < i.

  1. Khởi tạo
  • Min[0] = 0 (tổng 0 không cần đồng xu nào)
  • Với mọi i > 0: Min[i] = ∞
  1. Công thức truy hồi

Với mỗi i từ 1 đến S:

  • Với mỗi đồng xu Vj sao cho Vj ≤ i: Min[i] = min(Min[i], Min[i - Vj] + 1)
  1. Ví dụ minh họa

Các đồng xu: 1, 3, 5 Tổng cần đạt: S = 11

Sau khi tính toán theo quy hoạch động, ta có: Min[11] = 3

Tập đồng xu tối ưu là: 5, 5, 1.

II. BÀI TOÁN DÃY CON KHÔNG GIẢM DÀI NHẤT

Cho dãy số A[1], A[2], ..., A[N]. Hãy tìm độ dài lớn nhất của dãy con không giảm.

  1. Xác định trạng thái

Gọi S[i] là độ dài của dãy con không giảm dài nhất kết thúc tại phần tử A[i].

  1. Khởi tạo

Với mọi i: S[i] = 1

  1. Công thức truy hồi

Với mỗi i từ 1 đến N:

  • Với mỗi j < i: Nếu A[j] ≤ A[i] thì: S[i] = max(S[i], S[j] + 1)
  1. Ví dụ minh họa

Dãy số: 5, 3, 4, 8, 6, 7

Bảng kết quả:

i A[i] S[i] 1 5 1 2 3 1 3 4 2 4 8 3 5 6 3 6 7 4

Kết luận: Độ dài dãy con không giảm dài nhất là 4. Cảm ơn các bạn đã đọc :>

ducthiennct
o14, Tháng 12, 2025, 15:33 0

-1

thuật toán fibonacci lifting

Gphonf đã đăng vào 8, Tháng 12, 2025, 2:04

ý tưởng giống binary lifting nhưng thay vì nhảy 2^k bước , ta nhảy số fibonacci thứ k bước (k<=100 hoặc bé hơn )

Gphonf
o8, Tháng 12, 2025, 2:04 0

5

Debug bằng cách cout cho những người lười như tôi :v

MnhatBeo đã đăng vào 6, Tháng 12, 2025, 1:45

code:

#define cel                 cout<<'\n'
#define dbg(...)            [](auto&&...x) {int i=0; ((ct<<(i++?" " : "")<<x),...),cel;} (__VA_ARGS__)

khi gọi dbg() và thêm các tham số vào dấu ngoặc đồng thời ngăn cách bởi dấu ',' thì hàm sẽ in hết các giá trị ra màn hình cách nhau bởi dấu cách sau đó xuống dòng

MnhatBeo
o6, Tháng 12, 2025, 1:45 0

-2

Rating Vnoi

TrQuocAnn đã đăng vào 2, Tháng 12, 2025, 6:22

Làm những gì để tăng rating v mn ??

TrQuocAnn
o2, Tháng 12, 2025, 6:22 0

-7

thuật toán mới

Thien2009 đã đăng vào 1, Tháng 12, 2025, 12:22

hôm nay học quy hoạch động chia để trị

Thien2009
o1, Tháng 12, 2025, 12:22 0
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • ...
  • 35
  • 36
  • »

Top thành viên

# Tên truy cập Điểm
1
31tranhoangson
200,24
2
username001
199,75
3
phannguyenquocbao
198,93
4
YougiTuber
194,99
5
nguyen31hoang08minh2003
182,22
Tổ chức Xem đầy đủ >>>

Top đóng góp

# Tên truy cập Đóng góp
1
dquynh_2811
1448
2
I_love_Hoang_Yen
640
3
Mike4235
582
4
ntkwan
551
5
darkkcyan
518
Xem đầy đủ >>>

Dòng bình luận Discord

  • phamducminh2k10 → Beginner Free Contest 22 - INV2X
  • haiduong151109 → Bedao Regular Contest 05 - CARRAY
  • vominhmanh10 → Lát gạch 4
  • HaDat_Python → Du Lịch
  • Dangcoder → Free Contest 117 - BISHOPS
  • Dangcoder → Free Contest 135 - REVSTR
  • luunamhai1408 → Bedao Testing Contest 01 - KTHSUM
  • hanguyen140210 → Atcoder Educational DP Contest H - Grid 1
  • hanguyen140210 → Xếp hàng mua vé
  • hanguyen140210 → Dãy con tăng dài nhất (bản dễ)
RSS / Atom

Bài mới

  • Nhân Cạnh
  • Đi Bầu Cử
  • Du Lịch
  • Lis Path
  • Color On Path
  • Truy Vấn Đường Đi
  • Truy Vấn Cây Con
RSS / Atom

dựa trên nền tảng DMOJ | theo dõi VNOI trên Github và Facebook