สามารถเข้าถึงได้ที่ IOI 2019 Syllabus
ขอบเขตเนื้อหาวิชาที่ครอบคลุมในการแข่งขัน แบ่งได้เป็น 3 หมวด คือ (1) คณิตศาสตร์ (2) พื้นฐานวิทยาการคอมพิวเตอร์ และ (3) อัลกอริทึม
- คณิตศาสตร์
-
เลขคณิตและเรขาคณิต
- จำนวนเต็ม คุณสมบัติของเลขจำนวนเต็ม (ค่าบวก ค่าลบ เลขคู่ เลขคี่ การหารลงตัว จำนวนเฉพาะ)
- เลขเศษส่วน และร้อยละ
- จุด เวคเตอร์ พิกัดจุดแบบคาร์ทิเชียน (Cartesian coordinates) ในตารางสองมิติที่มีพิกัดเป็นจำนวนเต็ม
- ระยะทางแบบยูคลิด ทฤษฏีพิธากอรัส
- ส่วนของเส้นตรง จุดตัดของเส้นตรง และคุณสมบัติพื้นฐานที่เกี่ยวข้อง
- มุม สามเหลี่ยม สี่เหลี่ยมผืนผ้า สี่เหลี่ยมจัตุรัส วงกลม
-
โครงสร้างไม่ต่อเนื่อง (discrete structures)
- ฟังก์ชัน ความสัมพันธ์ และเซ็ต
- ตรรกศาสตร์พื้นฐาน
- วิธีการพิสูจน์
- วิธีการนับเบื้องต้น
- กราฟและต้นไม้
-
เนื้อหาที่ไม่รวมอยู่ในการแข่งขัน
- แคลคูลัส
- ความน่าจะเป็น
- สถิติ
- จำนวนจริงและจำนวนเชิงซ้อน
- ภาคตัดกรวยทั่วไป (parabolas, hyperbolas, ellipses) แต่เรื่องวงกลมอยู่ภายใต้ขอบเขตเนื้อหาในการแข่งขันระดับชาติ
- โพลิกอน (ในระดับนานาชาติจะครอบคลุมเนื้อหาเกี่ยวกับโพลิกอน)
- พื้นฐานวิทยาการคอมพิวเตอร์
- พื้นฐานด้านการเขียนโปรแกรม
- ทักษะการแก้ปัญหา (problem-solving skill)
- พื้นฐานโครงสร้างข้อมูล
- ชนิดข้อมูลดั้งเดิม (Primitive data type) ได้แก่ Boolean, signed/unsigned integer, character
- แถวลำดับ (อาเรย์ อาเรย์หลายมิติ)
- Record/Struct
- สตริงและการดำเนินการกับสตริง
- Static และ Stack allocation
- Lined structures (ทั้งที่เป็นแบบเส้นตรง และแบบที่แบ่งเป็นสาขาได้)
- การสร้าง โครงสร้างกองซ้อน (stack), คิว (queue), ต้นไม้ และกราฟ
- การเลือกโครงสร้างข้อมูลที่เหมาะสม
- คิวลำดับความสำคัญ (priority queue), ไดนามิกเซต (dynamic set), ไดนามิกแมพ (dynamic map)
- การเรียกตัวเองซ้ำ (Recursion)
- แนวคิด
- ฟังก์ชันทางคณิตศาสตร์ที่เรียกตัวเองซ้ำ
- วิธีแบ่งแยกและเอาชนะ (divide and conquer)
- อัลกอริทึมการย้อนรอยแบบเรียกตัวเองซ้ำ (recursive backtracking)
- อัลกอริทึม
- พื้นฐานการวิเคราะห์ความซับซ้อนของอัลกอริทึม (algorithmic complexity)
- กลวิธีทางอัลกอริทึม
- Brute-Force algorithm
- Greedy algorithm
- Divide And Conquer
- Backtracking (ทั้งที่เป็นแบบเรียกตัวเองซ้ำ และไม่เรียกตัวเองซ้ำ)
- Branch-and-Bound algorithm
- Pattern matching and string/text algorithm
- Dynamic programming
- อัลกอริทึมเชิงคำนวณพื้นฐาน
- อัลกอริทึมเชิงตัวเลขพื้นฐานที่เกี่ยวข้องกับจำนวนเต็ม เช่น Radix Conversion, Euclid's algorithm, Primality test in O(√N), Sieve of Eratosthenes, Factorization, Efficient exponentiation
- การจัดการอาร์เรย์ขั้นพื้นฐาน (รวมถึงการทำฮิสโทแกรม และ Bucket sort)
- Sequential และ Binary search
- Search by elimination
- การแบ่งข้อมูล (partitioning) การจัดลำดับด้วยการแบ่งข้อมูลซ้ำๆ Quick sort
- การเรียงข้อมูลที่มีเวลาที่แย่ที่สุดเป็น O(NlogN) เช่น Heap sort และ Merge sort
- Binary heap พื้นฐาน และ Binary search tree
- การบรรยายโครงสร้างกราฟ เช่น adjacency list และ adjacency matrix
- Depth-first and breadth-first traversals of graphs และการหาองค์ประกอบที่เชื่อมต่อกันของกราฟแบบไม่มีทิศทาง
- Shortest path algorithm เช่น Dijkstra, Bellman-Ford และ Floyd-Warshall
- Transitive closure (Floyd's algorithm)
- Minimum spanning tree
- Topological sort
- โปรแกรมที่ผู้เข้าแข่งขันจัดทำในระหว่างการแข่งขัน กำหนดให้เขียนตามมาตรฐานของภาษา C หรือภาษา C++ ไม่อนุญาตให้เขียนโปรแกรมที่ทำงานใน Graphic Mode
- ฟังก์ชันทั้งหมดในการเขียนโปรแกรม กำหนดให้ใช้ฟังก์ชันจากคลังมาตรฐานของภาษา C (The Standard C Library), conio.h (เฉพาะการทำงานบนระบบปฏิบัติการวินโดวส์) และ Standard Template Library (STL) เท่านั้น
- ไม่อนุญาตให้ใช้ฟังก์ชันจัดการกับแฟ้มและอุปกรณ์โดยตรงที่กำหนดรูปแบบใช้งานในแฟ้ม (fentl.h), (io.h) และ (iomanip.h)
- ไม่อนุญาตให้โปรแกรมสร้างแฟ้มข้อมูลสำรองเพิ่มเติมระหว่างการทำงาน ห้ามอ่านหรือเขียนแฟ้มข้อมูลอื่นนอกเหนือจากที่โจทย์ระบุ
- ไม่อนุญาตให้เรียกใช้โปรแกรมอื่นๆ (เช่น ผ่านทางฟังก์ชัน system) หรือเรียกใช้ system call นอกเหนือจากที่ใช้งานปกติ
- ไม่อนุญาตให้ทำการคำนวณแบบมัลติโปรเซสซิง (multi-processing) เช่น ไม่อนุญาตให้โปรแกรมเรียกใช้ฟังก์ชันใน thread library ต่างๆ
- โปรแกรมภาษา C ที่ผู้เข้าแข่งขันจัดทำในระหว่างการแข่งขัน กำหนดให้เขียนโปรแกรมที่ส่วนขยายเป็น .c สำหรับภาษา C++ ให้ใช้นามสกุล .cpp และต้องอยู่ในรูปแบบที่สามารถแปล (compile) ให้เป็นโปรแกรมที่สามารถทำงานได้โดยสมบูรณ์จากบรรทัดคำสั่ง (command line)
- ใช้ GCC (GNU compiler collection) ในการตรวจโปรแกรมเพื่อให้คะแนน โดยใช้วิธีการแปลและให้ทำงานจากบรรทัดคำสั่งเท่านั้น โปรแกรมจะถูกสั่งให้ทำงานบนระบบปฏิบัติการและคอมไพเลอร์เดียวกันกับที่ผู้เข้าแข่งขันเลือกใช้ ทั้งนี้เครื่องที่ใช้ในการตรวจสอบคำตอบของผู้เข้าแข่งขันจะเลือกระบบปฏิบัติการและคอมไพเลอร์โดยพิจารณาข้อมูลจากที่กำหนดไว้ที่ต้นไฟล์คำตอบของผู้เข้าแข่งขัน (รายละเอียดเพิ่มเติมอยู่ในหัวข้อ 'ข้อมูลและรายละเอียดเพิ่มเติมเกี่ยวกับการแข่งขัน')
- คอมไพเลอร์ออปชัน (compiler option) ที่ใช้ในการแข่งขันจะทำการออปทิไมซ์ (optimize) โปรแกรมโดยใช้ออปชัน -O2
- อนุญาตให้เขียนโปรแกรมภาษา C ตามมาตรฐาน C++11 และ C++17 โดยคอมไพเลอร์ออปชันที่กำหนดเพิ่มใช้ออปชัน
-std=c++11
หรือ-std=c++17
- จำนวน subtasks น้อยกว่า 3
- โจทย์ไม่ทำให้ผู้เข้าแข่งขันพัฒนา (เช่น โจทย์ที่พบเห็นได้โดยง่าย ผู้ที่มีประสบการณ์สามารถคิดออกได้ภายในไม่เกิน 1 นาที ขาดความคิดริเริ่มสร้างสรรค์ในโจทย์)
- ความยากของการเขียนโปรแกรมไม่สมเหตุสมผลต่อระยะเวลา (เช่น เขียนมากกว่า 150 บรรทัดต่อข้อ)
- โจทย์ใช้เนื้อหานอกขอบเขตที่กำหนดไว้
- testcase ไม่เหมาะสม เช่น ค่าไม่ตรงเงื่อนไขที่โจทย์บอก หรือวิธีการที่ไม่ควรผ่าน ตามเงื่อนไขของโจทย์ สามารถผ่านได้โดยไม่ได้ตั้งใจ
- time limit ไม่เหมาะสม เช่นโจทย์ต้องการแยกระหว่าง O(n) กับ O(n log n) แต่ตั้ง time limit ให้ solution บางตัวที่เป็น O(n log n) ผ่านได้ หรือบางตัวที่เป็น O(n) กลับไม่ผ่าน
- input/output format ไม่ชัดเจน