{
  "folders": [
    {
      "folderId": "heuristic-notes",
      "title": "휴리스틱 기본 및 심화 노트",
      "description": "현재 h-contest 문제 풀이에 바로 쓰는 기본 구현, 모델링, 최적화, 검증 개념을 모은 직접 학습 트랙입니다.",
      "order": 10
    },
    {
      "folderId": "heuristic-reference",
      "title": "휴리스틱 참고 노트",
      "description": "현재 문제 풀이의 직접 범위를 넘는 전통 알고리즘, 희소 고급 도구, 장기 확장용 레퍼런스 노트입니다.",
      "order": 20
    }
  ],
  "lessons": [
    {
      "lessonId": "complexity-input-size",
      "title": "복잡도와 입력 크기 감각",
      "description": "입력 제한을 보고 가능한 시간 복잡도와 메모리 사용량을 빠르게 가늠하는 기본 감각을 익힙니다.",
      "summary": "n의 크기, 시간 제한, 메모리 제한을 보고 완전탐색, 정렬, 선형 풀이, 로그 풀이 중 가능한 후보를 좁히는 입문 레슨",
      "order": 1,
      "folderId": "heuristic-notes",
      "tags": [
        "complexity",
        "input-size",
        "time-limit",
        "memory-limit",
        "practice"
      ],
      "level": "beginner",
      "estimatedMinutes": 20,
      "prerequisites": [],
      "nextLessons": [
        "cpp-contest-basics",
        "sorting",
        "prefix-sum-difference",
        "binary-search"
      ],
      "relatedLessons": [
        "dynamic-programming"
      ],
      "pages": [],
      "lessonType": "core",
      "practiceStatus": "linked",
      "implementationStatus": "concept-only",
      "audience": "contest-core",
      "difficultyAxes": [
        "selection"
      ]
    },
    {
      "lessonId": "cpp-contest-basics",
      "title": "실전 C++ 제출과 검증",
      "description": "함수 구현형 제출 계약과 TC 초기화를 확인하고, STL 없는 ORDERING 기준선을 실제 채점기로 검증합니다.",
      "summary": "공개 API와 배열 상한, TC 초기화, 유효한 기준선 실행에서 경로 개선과 검증으로 이어지는 입문",
      "order": 3,
      "folderId": "heuristic-notes",
      "tags": [
        "cpp",
        "no-stl",
        "fixed-array",
        "overflow",
        "practice"
      ],
      "level": "beginner",
      "estimatedMinutes": 30,
      "prerequisites": [
        "complexity-input-size"
      ],
      "nextLessons": [
        "heuristic",
        "sorting",
        "bfs-dfs-grid"
      ],
      "relatedLessons": [
        "priority-queue-heap",
        "testing-and-stress",
        "cpp-common-library"
      ],
      "pages": [
        {
          "pageId": "submission-and-state",
          "title": "제출 계약과 상태 초기화",
          "description": "공개 API와 함수 시그니처, 메모리·정수 범위, TC 초기화를 확인합니다.",
          "order": 1,
          "file": "pages/submission-and-state.md"
        },
        {
          "pageId": "practice",
          "title": "ORDERING 기준선 실행과 검증",
          "description": "함수 구현형 제출 계약과 TC 초기화를 확인하고, STL 없는 ORDERING 기준선을 실제 채점기로 검증합니다.",
          "order": 2,
          "file": "pages/practice.md"
        }
      ],
      "lessonType": "core",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ],
      "status": "published"
    },
    {
      "lessonId": "cpp-common-library",
      "title": "STL 없는 공통 라이브러리",
      "description": "배열·난수·안정 정렬·큐·최소 힙을 독립된 블록으로 관리하고, 필요한 코드만 제출 풀이에 조합합니다.",
      "summary": "헤더·STL·동적 할당 없는 공통 연산, 용량과 초기화 계약, 선택 추출과 실제 레슨 조합 검증",
      "order": 4,
      "folderId": "heuristic-notes",
      "tags": [
        "cpp",
        "no-stl",
        "snippets",
        "fixed-array",
        "sorting",
        "heap",
        "practice"
      ],
      "level": "beginner",
      "estimatedMinutes": 35,
      "prerequisites": [
        "cpp-contest-basics"
      ],
      "nextLessons": [
        "sorting",
        "greedy",
        "priority-queue-heap"
      ],
      "relatedLessons": [
        "heuristic",
        "testing-and-stress",
        "bfs-dfs-grid"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ],
      "status": "published"
    },
    {
      "lessonId": "sorting",
      "title": "정렬 알고리즘",
      "description": "정렬 기준, 안정성, 시간 복잡도, 정수 전용 정렬까지 문제 풀이에 필요한 정렬 감각을 익힙니다.",
      "summary": "정렬 기준 세우기, 안정 정렬, counting sort, radix sort로 이어지는 정렬 입문",
      "order": 5,
      "folderId": "heuristic-notes",
      "tags": [
        "sorting",
        "stable-sort",
        "counting-sort",
        "radix-sort",
        "practice"
      ],
      "level": "beginner",
      "estimatedMinutes": 35,
      "prerequisites": [
        "complexity-input-size",
        "cpp-contest-basics"
      ],
      "nextLessons": [
        "prefix-sum-difference",
        "binary-search",
        "coordinate-compression"
      ],
      "relatedLessons": [
        "two-pointers-sliding-window",
        "cpp-common-library"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "greedy",
      "title": "그리디 알고리즘",
      "description": "쉬운 반례부터 대표 증명 패턴까지, 그리디 선택이 왜 최적해로 이어지는지 익힙니다.",
      "summary": "거스름돈, 회의실 배정, 강의실 배정, 마감 문제로 보는 그리디 입문",
      "order": 7,
      "folderId": "heuristic-notes",
      "tags": [
        "greedy",
        "greedy-stays-ahead",
        "certificate",
        "exchange-argument",
        "practice"
      ],
      "level": "beginner",
      "estimatedMinutes": 30,
      "prerequisites": [
        "sorting"
      ],
      "nextLessons": [
        "priority-queue-heap",
        "dynamic-programming",
        "proof-and-invariants"
      ],
      "relatedLessons": [
        "heuristic",
        "cpp-common-library"
      ],
      "pages": [],
      "lessonType": "core",
      "practiceStatus": "linked",
      "implementationStatus": "concept-only",
      "audience": "contest-core",
      "difficultyAxes": [
        "proof",
        "selection"
      ]
    },
    {
      "lessonId": "heuristic",
      "title": "휴리스틱 알고리즘",
      "description": "최적해를 증명하기 어려운 문제에서 제한 시간 안에 좋은 해를 만드는 휴리스틱 설계 방법을 세 가지 실전 사례와 함께 익힙니다.",
      "summary": "ORDERING의 열린 경로 개선에서 시작해 지역 탐색과 SA, BILLCITY의 배치·복구, AIRCONTECH의 빔 탐색을 연결",
      "order": 10,
      "folderId": "heuristic-notes",
      "tags": [
        "heuristic",
        "optimization",
        "local-search",
        "simulated-annealing",
        "placement",
        "case-study",
        "destroy-repair",
        "bitmask",
        "route",
        "two-opt",
        "beam-search",
        "schedule",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 140,
      "prerequisites": [
        "cpp-contest-basics"
      ],
      "nextLessons": [
        "testing-and-stress",
        "tsp-hamiltonian"
      ],
      "relatedLessons": [
        "tsp-hamiltonian",
        "greedy",
        "dynamic-programming",
        "cpp-common-library"
      ],
      "pages": [
        {
          "pageId": "ordering-route-improvement",
          "title": "실전 예시: 배송 순서 개선",
          "description": "ORDERING을 따라가며 열린 경로 점수, nearest neighbor 초기해, 2-opt 차분 계산, insertion과 작은 입력 exact 탐색을 연결합니다.",
          "order": 10,
          "file": "pages/ordering-route-improvement.md"
        },
        {
          "pageId": "search-strategies",
          "title": "초기해와 지역 탐색",
          "description": "ORDERING의 개선 연산에서 지역 최적, SA의 수락 확률, 재시도와 예산 비교로 이어집니다.",
          "order": 20,
          "file": "pages/search-strategies.md"
        },
        {
          "pageId": "placement-and-repair",
          "title": "실전 예시: 광고판 도시 배치",
          "description": "BILLCITY를 따라가며 bitmask 상태 표현, 위치 평가식, 큰 destroy/repair, 부분 exact repair가 한 풀이 안에서 연결되는 흐름을 봅니다.",
          "order": 30,
          "file": "pages/placement-and-repair.md"
        },
        {
          "pageId": "aircontech-beam-search",
          "title": "실전 예시: 31일 설치 일정 Beam Search",
          "description": "AIRCONTECH를 따라가며 다음 행동 상위 8개와 경로 상태 상위 32개를 남기는 두 단계 가지치기, 실제 점수와 탐색 평가값의 분리를 연결합니다.",
          "order": 40,
          "file": "pages/aircontech-beam-search.md"
        }
      ],
      "lessonType": "overview",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "testing-and-stress",
      "title": "Testing과 Stress Test",
      "description": "TSP의 최적 비용, ORDERING의 2-opt 차분과 복구를 검증하고 실패 입력을 저장·축소합니다.",
      "summary": "TSP의 독립 기준 답과 ORDERING의 전체 비용 재계산으로 검증하고, 반례를 저장·축소해 재현합니다.",
      "order": 11,
      "folderId": "heuristic-notes",
      "tags": [
        "testing",
        "stress-test",
        "brute-force",
        "debugging",
        "counterexample",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 20,
      "prerequisites": [
        "cpp-contest-basics",
        "complexity-input-size"
      ],
      "nextLessons": [
        "heuristic",
        "proof-and-invariants"
      ],
      "relatedLessons": [
        "greedy",
        "dynamic-programming",
        "cpp-common-library"
      ],
      "pages": [],
      "lessonType": "core",
      "practiceStatus": "linked",
      "implementationStatus": "concept-only",
      "audience": "contest-core",
      "difficultyAxes": [
        "proof",
        "selection"
      ]
    },
    {
      "lessonId": "prefix-sum-difference",
      "title": "누적합과 차분 배열",
      "description": "구간 합을 빠르게 구하는 누적합, 여러 구간 업데이트를 한 번에 반영하는 차분 배열, 2차원 누적합까지 익힙니다.",
      "summary": "누적합의 구간 경계와 차분 배열의 업데이트를 1차원에서 2차원으로 확장합니다.",
      "order": 12,
      "folderId": "heuristic-notes",
      "tags": [
        "prefix-sum",
        "difference-array",
        "2d-prefix-sum",
        "range-query",
        "practice"
      ],
      "level": "beginner",
      "estimatedMinutes": 30,
      "prerequisites": [
        "complexity-input-size"
      ],
      "nextLessons": [
        "two-pointers-sliding-window",
        "fenwick-tree",
        "segment-tree"
      ],
      "relatedLessons": [
        "sqrt-decomposition"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "two-pointers-sliding-window",
      "title": "투 포인터와 슬라이딩 윈도우",
      "description": "정렬된 배열의 양끝 포인터, 조건을 만족하는 연속 구간, 빈도 관리가 필요한 슬라이딩 윈도우를 익힙니다.",
      "summary": "양끝 포인터, 같은 방향 투 포인터, 최소/최대 구간, 빈도 배열과 map으로 이어지는 구간 탐색 입문",
      "order": 13,
      "folderId": "heuristic-notes",
      "tags": [
        "two-pointers",
        "sliding-window",
        "monotonic",
        "range",
        "practice"
      ],
      "level": "beginner",
      "estimatedMinutes": 25,
      "prerequisites": [
        "sorting",
        "prefix-sum-difference"
      ],
      "nextLessons": [
        "binary-search",
        "coordinate-compression"
      ],
      "relatedLessons": [
        "prefix-sum-difference"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "binary-search",
      "title": "이분 탐색과 파라메트릭 서치",
      "description": "정렬된 배열에서 위치를 찾는 이분 탐색부터, 답의 범위를 줄여 가는 파라메트릭 서치까지 익힙니다.",
      "summary": "lower_bound, upper_bound, 반열린 구간, 단조 판정 함수, 정답 이분 탐색으로 이어지는 이분 탐색 입문",
      "order": 14,
      "folderId": "heuristic-notes",
      "tags": [
        "binary-search",
        "parametric-search",
        "lower-bound",
        "monotonic",
        "practice"
      ],
      "level": "beginner",
      "estimatedMinutes": 30,
      "prerequisites": [
        "sorting"
      ],
      "nextLessons": [
        "coordinate-compression",
        "dynamic-programming"
      ],
      "relatedLessons": [
        "two-pointers-sliding-window"
      ],
      "pages": [],
      "lessonType": "core",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "proof",
        "selection"
      ]
    },
    {
      "lessonId": "coordinate-compression",
      "title": "좌표 압축",
      "description": "값의 범위는 크지만 서로 다른 값의 개수가 작을 때 정렬과 lower_bound로 안전한 압축 인덱스를 만드는 방법을 익힙니다.",
      "summary": "정렬과 이분 탐색으로 압축하고, 역전쌍의 빈도 질의와 실제 좌표 간격을 구분합니다.",
      "order": 15,
      "folderId": "heuristic-notes",
      "tags": [
        "coordinate-compression",
        "sorting",
        "lower-bound",
        "range-query",
        "practice"
      ],
      "level": "beginner",
      "estimatedMinutes": 20,
      "prerequisites": [
        "sorting",
        "binary-search"
      ],
      "nextLessons": [
        "fenwick-tree",
        "segment-tree",
        "sqrt-decomposition"
      ],
      "relatedLessons": [
        "sorting",
        "fenwick-tree"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "priority-queue-heap",
      "title": "우선순위 큐와 힙",
      "description": "가장 크거나 작은 후보를 빠르게 꺼내는 우선순위 큐와, 이를 구현하는 힙의 원리와 실전 패턴을 익힙니다.",
      "summary": "힙의 배열 구조, 상위 K개 유지, 오래된 후보 제거를 익히고 배열 구현은 공통 코드로 연결합니다.",
      "order": 16,
      "folderId": "heuristic-notes",
      "tags": [
        "priority-queue",
        "heap",
        "scheduler",
        "greedy",
        "data-structure",
        "practice"
      ],
      "level": "beginner",
      "estimatedMinutes": 20,
      "prerequisites": [
        "sorting"
      ],
      "nextLessons": [
        "dijkstra",
        "meldable-heap"
      ],
      "relatedLessons": [
        "greedy",
        "cpp-common-library"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "modular-arithmetic",
      "title": "모듈러 연산과 빠른 거듭제곱",
      "description": "큰 경우의 수와 곱셈을 안전하게 다루기 위한 나머지 연산, 빠른 거듭제곱, 모듈러 역원을 익힙니다.",
      "summary": "mod 덧셈/뺄셈/곱셈, 음수 처리, binary exponentiation, Fermat 역원으로 이어지는 수학 기본기",
      "order": 17,
      "folderId": "heuristic-reference",
      "tags": [
        "modular-arithmetic",
        "fast-power",
        "number-theory",
        "combinatorics",
        "practice"
      ],
      "level": "beginner",
      "estimatedMinutes": 45,
      "prerequisites": [],
      "nextLessons": [
        "dynamic-programming",
        "combinatorics-ncr",
        "gcd-extended-euclid-crt",
        "string-matching-kmp-z"
      ],
      "relatedLessons": [
        "topological-sort-dag"
      ],
      "pages": [],
      "lessonType": "core",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "union-find",
      "title": "Union-Find 알고리즘",
      "description": "서로소 집합을 빠르게 합치고 조회하는 Union-Find의 구조와 최적화를 익힙니다.",
      "summary": "대표 찾기, 경로 압축, 크기 기준 병합을 구현하고 중복 병합과 TEAMSIZE의 모임 입력을 처리합니다.",
      "order": 18,
      "folderId": "heuristic-notes",
      "tags": [
        "union-find",
        "disjoint-set",
        "connected-components",
        "practice"
      ],
      "level": "beginner",
      "estimatedMinutes": 25,
      "prerequisites": [],
      "nextLessons": [
        "graph-tree-basics"
      ],
      "relatedLessons": [
        "meldable-heap"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "meldable-heap",
      "title": "Meldable Heap",
      "description": "같은 노드 pool을 공유하는 Skew Heap과 Union-Find로 컴포넌트별 후보를 병합합니다.",
      "summary": "컴포넌트별 Skew Heap 구현, 병합 전제, 전체 삽입 수에 따른 메모리와 상각 비용을 다룹니다.",
      "order": 19,
      "folderId": "heuristic-notes",
      "tags": [
        "meldable-heap",
        "leftist-heap",
        "skew-heap",
        "priority-queue",
        "data-structure",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 35,
      "prerequisites": [
        "priority-queue-heap",
        "union-find"
      ],
      "nextLessons": [
        "treap"
      ],
      "relatedLessons": [
        "priority-queue-heap"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "bfs-dfs-grid",
      "title": "BFS/DFS와 격자 탐색",
      "description": "방문 표시 시점, 연결 요소와 격자 최단거리, 여러 출발점의 초기화를 BFS와 DFS로 익힙니다.",
      "summary": "큐 BFS, 재귀/반복 DFS, 방문 배열, 격자 방향 배열, 연결 요소, 최단거리, 다중 시작점 BFS까지 이어지는 탐색 입문",
      "order": 20,
      "folderId": "heuristic-notes",
      "tags": [
        "bfs",
        "dfs",
        "grid",
        "shortest-path",
        "connected-components",
        "practice"
      ],
      "level": "beginner",
      "estimatedMinutes": 35,
      "prerequisites": [],
      "nextLessons": [
        "zero-one-bfs",
        "dijkstra",
        "graph-tree-basics"
      ],
      "relatedLessons": [
        "topological-sort-dag"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "graph-tree-basics",
      "title": "그래프와 트리 기본 성질",
      "description": "그래프 표현, DFS/BFS, 트리 지름, 센트로이드, 최소 신장 트리까지 문제 풀이에 자주 나오는 기본 성질을 정리합니다.",
      "summary": "인접 리스트, 트리의 n-1 간선 성질, 지름, 센트로이드, MST를 한 번에 정리",
      "order": 21,
      "folderId": "heuristic-notes",
      "tags": [
        "graph",
        "tree",
        "diameter",
        "centroid",
        "mst",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 40,
      "prerequisites": [
        "bfs-dfs-grid",
        "union-find"
      ],
      "nextLessons": [
        "tree-advanced",
        "topological-sort-dag",
        "dijkstra"
      ],
      "relatedLessons": [
        "tsp-hamiltonian"
      ],
      "pages": [
        {
          "pageId": "mst-kruskal-prim",
          "title": "최소 신장 트리",
          "description": "절단 성질로 간선 선택을 설명하고 Union-Find를 이용한 Kruskal을 구현합니다.",
          "order": 20,
          "file": "pages/mst-kruskal-prim.md"
        }
      ],
      "lessonType": "core",
      "practiceStatus": "linked",
      "implementationStatus": "concept-only",
      "audience": "contest-core",
      "difficultyAxes": [
        "modeling"
      ]
    },
    {
      "lessonId": "dynamic-programming",
      "title": "동적 계획법",
      "description": "큰 문제를 겹치는 부분문제로 나누어 저장하며 푸는 동적 계획법의 상태 설계, 전이, 순회 순서와 대표 기법을 익힙니다.",
      "summary": "격자 경로, 동전, 트리에서 상태와 전이를 정하고 배낭과 LIS에서 중복 계산과 메모리를 줄입니다.",
      "order": 22,
      "folderId": "heuristic-notes",
      "tags": [
        "dynamic-programming",
        "dp",
        "memoization",
        "knapsack",
        "lis",
        "tree-dp",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 50,
      "prerequisites": [
        "prefix-sum-difference",
        "binary-search"
      ],
      "nextLessons": [
        "tsp-hamiltonian",
        "topological-sort-dag"
      ],
      "relatedLessons": [
        "greedy",
        "modular-arithmetic"
      ],
      "pages": [],
      "lessonType": "core",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "tsp-hamiltonian",
      "title": "TSP와 해밀턴 경로",
      "description": "모든 정점을 한 번씩 방문하는 해밀턴 경로와 TSP를 완전탐색, 비트마스크 DP, 휴리스틱 개선으로 연결해 익힙니다.",
      "summary": "해밀턴 경로/사이클, TSP 완전탐색, Held-Karp DP, 경로 복원, nearest neighbor와 2-opt 휴리스틱까지 한 번에 정리",
      "order": 23,
      "folderId": "heuristic-notes",
      "tags": [
        "tsp",
        "hamiltonian-path",
        "hamiltonian-cycle",
        "bitmask-dp",
        "held-karp",
        "heuristic",
        "two-opt",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 60,
      "prerequisites": [
        "dynamic-programming",
        "graph-tree-basics"
      ],
      "nextLessons": [
        "heuristic"
      ],
      "relatedLessons": [
        "tree-advanced"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "zero-one-bfs",
      "title": "0-1 BFS",
      "description": "간선 비용이 0 또는 1인 그래프에서 deque로 Dijkstra보다 가볍게 최단거리를 구하는 방법을 익힙니다.",
      "summary": "비용 0은 deque 앞, 비용 1은 뒤에 넣는 BFS와 Dijkstra 사이의 최단거리 기법",
      "order": 24,
      "folderId": "heuristic-notes",
      "tags": [
        "zero-one-bfs",
        "bfs",
        "shortest-path",
        "deque",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 35,
      "prerequisites": [
        "bfs-dfs-grid"
      ],
      "nextLessons": [
        "dijkstra"
      ],
      "relatedLessons": [
        "bfs-dfs-grid"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "topological-sort-dag",
      "title": "위상 정렬과 DAG DP",
      "description": "방향 비순환 그래프에서 의존 관계를 만족하는 순서를 만들고, 그 순서 위에서 DP를 계산하는 방법을 익힙니다.",
      "summary": "Kahn 알고리즘으로 의존 관계와 사이클을 처리하고, 선행 작업의 완료 시간을 DP로 모읍니다.",
      "order": 25,
      "folderId": "heuristic-notes",
      "tags": [
        "topological-sort",
        "dag",
        "graph",
        "dp",
        "dependency",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 25,
      "prerequisites": [
        "bfs-dfs-grid",
        "dynamic-programming",
        "priority-queue-heap"
      ],
      "nextLessons": [
        "dijkstra",
        "scc-2sat"
      ],
      "relatedLessons": [
        "graph-tree-basics"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "dijkstra",
      "title": "Dijkstra 최단거리",
      "description": "음수 간선이 없는 그래프에서 한 시작점으로부터 각 정점까지의 최단거리를 구하는 Dijkstra 알고리즘을 익힙니다.",
      "summary": "거리 확정, relax, 우선순위 큐, 음수 간선 금지 조건까지 이어지는 Dijkstra 입문",
      "order": 26,
      "folderId": "heuristic-notes",
      "tags": [
        "dijkstra",
        "shortest-path",
        "graph",
        "priority-queue",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 35,
      "prerequisites": [
        "bfs-dfs-grid",
        "priority-queue-heap"
      ],
      "nextLessons": [
        "bellman-ford-negative-cycle"
      ],
      "relatedLessons": [
        "graph-tree-basics",
        "zero-one-bfs"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "scc-2sat",
      "title": "SCC와 2-SAT",
      "description": "방향 그래프의 강한 연결 요소를 구하고, implication graph로 2-SAT 만족 가능성을 판정하는 방법을 익힙니다.",
      "summary": "Kosaraju SCC, condensation graph, implication graph, 2-SAT 모순 판정과 값 복원 주의점까지 이어지는 방향 그래프 심화",
      "order": 27,
      "folderId": "heuristic-reference",
      "tags": [
        "scc",
        "strongly-connected-components",
        "2-sat",
        "implication-graph",
        "directed-graph",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 70,
      "prerequisites": [
        "topological-sort-dag"
      ],
      "nextLessons": [
        "max-flow-min-cut"
      ],
      "relatedLessons": [
        "bellman-ford-negative-cycle",
        "graph-tree-basics"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "max-flow-min-cut",
      "title": "Max Flow, Min Cut, Bipartite Matching",
      "description": "용량이 있는 방향 그래프에서 최대 유량을 구하고, residual graph로 min cut과 bipartite matching 모델링을 연결해 익힙니다.",
      "summary": "Dinic 알고리즘, residual graph, max-flow min-cut theorem, source-left-right-sink 이분 매칭 모델링까지 이어지는 Flow 입문",
      "order": 28,
      "folderId": "heuristic-reference",
      "tags": [
        "max-flow",
        "min-cut",
        "dinic",
        "bipartite-matching",
        "graph",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 80,
      "prerequisites": [
        "scc-2sat"
      ],
      "nextLessons": [
        "matching-cover-duality",
        "min-cost-flow"
      ],
      "relatedLessons": [
        "graph-tree-basics",
        "priority-queue-heap"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "matching-cover-duality",
      "title": "Matching과 Cover Duality",
      "description": "이분 매칭에서 minimum vertex cover와 maximum independent set, DAG path cover로 이어지는 duality 모델링을 익힙니다.",
      "summary": "이분 매칭, Konig theorem, alternating path 기반 vertex cover 복원, maximum independent set, DAG minimum path cover까지 이어지는 matching 심화",
      "order": 29,
      "folderId": "heuristic-reference",
      "tags": [
        "bipartite-matching",
        "vertex-cover",
        "konig-theorem",
        "independent-set",
        "path-cover",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 65,
      "prerequisites": [
        "max-flow-min-cut"
      ],
      "nextLessons": [
        "min-cost-flow",
        "general-matching"
      ],
      "relatedLessons": [
        "scc-2sat",
        "topological-sort-dag"
      ],
      "pages": [],
      "lessonType": "overview",
      "practiceStatus": "todo",
      "implementationStatus": "concept-only",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "proof",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "min-cost-flow",
      "title": "Min-Cost Flow",
      "description": "용량과 비용이 함께 있는 flow에서 정해진 유량을 최소 비용으로 보내는 shortest augmenting path 모델링을 익힙니다.",
      "summary": "Residual cost, SPFA 기반 shortest augmenting path, assignment 모델링, potential 최적화 판단까지 이어지는 비용 flow 심화",
      "order": 30,
      "folderId": "heuristic-reference",
      "tags": [
        "min-cost-flow",
        "flow",
        "shortest-path",
        "assignment",
        "graph",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 75,
      "prerequisites": [
        "max-flow-min-cut",
        "bellman-ford-negative-cycle"
      ],
      "nextLessons": [
        "floyd-warshall"
      ],
      "relatedLessons": [
        "dijkstra",
        "matching-cover-duality",
        "priority-queue-heap"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "flow-with-lower-bound",
      "title": "Flow with Lower Bound",
      "description": "간선마다 최소/최대 유량 제약이 있는 flow를 feasible circulation으로 변환해 가능 여부와 확장 흐름을 판정합니다.",
      "summary": "lower bound 제거, demand balance, super source/sink 변환, s-t bounded flow와 flow 복원 주의점까지 이어지는 flow 심화",
      "order": 31,
      "folderId": "heuristic-reference",
      "tags": [
        "flow",
        "lower-bound",
        "circulation",
        "feasibility",
        "dinic",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 70,
      "prerequisites": [
        "max-flow-min-cut",
        "min-cost-flow"
      ],
      "nextLessons": [],
      "relatedLessons": [
        "matching-cover-duality",
        "floyd-warshall"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "general-matching",
      "title": "General Matching",
      "description": "이분 그래프가 아닌 일반 무향 그래프에서 Edmonds blossom으로 최대 matching을 찾는 방법을 익힙니다.",
      "summary": "augmenting path, odd cycle blossom 수축, base/parent 관리, 최대 cardinality matching 구현과 weighted matching과의 경계까지 이어지는 일반 matching 레슨",
      "order": 32,
      "folderId": "heuristic-reference",
      "tags": [
        "matching",
        "blossom",
        "general-graph",
        "augmenting-path",
        "graph",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 80,
      "prerequisites": [
        "matching-cover-duality",
        "max-flow-min-cut"
      ],
      "nextLessons": [
        "weighted-matching",
        "dominator-tree"
      ],
      "relatedLessons": [
        "flow-with-lower-bound",
        "scc-2sat"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "bellman-ford-negative-cycle",
      "title": "Bellman-Ford와 음수 사이클",
      "description": "음수 간선이 있는 그래프에서 최단거리를 계산하고, 시작점에서 도달 가능한 음수 사이클을 판정하는 Bellman-Ford 알고리즘을 익힙니다.",
      "summary": "모든 간선을 V-1번 relax하는 최단거리 계산, 추가 relax를 통한 음수 사이클 판정, 영향 범위 전파까지 정리",
      "order": 33,
      "folderId": "heuristic-notes",
      "tags": [
        "bellman-ford",
        "negative-cycle",
        "shortest-path",
        "graph",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 55,
      "prerequisites": [
        "dijkstra"
      ],
      "nextLessons": [],
      "relatedLessons": [
        "graph-tree-basics",
        "topological-sort-dag",
        "zero-one-bfs"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "proof"
      ]
    },
    {
      "lessonId": "floyd-warshall",
      "title": "Floyd-Warshall",
      "description": "모든 정점 쌍 최단거리와 도달 가능성을 중간 정점 DP로 처리하는 Floyd-Warshall 알고리즘을 익힙니다.",
      "summary": "APSP, transitive closure, 경로 복원, 음수 사이클 영향 점검까지 이어지는 작은 그래프 최단거리 레슨",
      "order": 34,
      "folderId": "heuristic-notes",
      "tags": [
        "floyd-warshall",
        "apsp",
        "shortest-path",
        "transitive-closure",
        "dynamic-programming",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 35,
      "prerequisites": [
        "dijkstra",
        "dynamic-programming"
      ],
      "nextLessons": [],
      "relatedLessons": [
        "bellman-ford-negative-cycle",
        "min-cost-flow"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "sparse-table-rmq",
      "title": "Sparse Table과 RMQ",
      "description": "업데이트가 없는 배열에서 구간 최솟값, gcd, LCP RMQ를 빠르게 처리하는 Sparse Table을 익힙니다.",
      "summary": "2^k 길이 구간 전처리, idempotent 연산의 O(1) RMQ, LCP 배열과 LCA 연결까지 이어지는 정적 구간 질의 레슨",
      "order": 35,
      "folderId": "heuristic-reference",
      "tags": [
        "sparse-table",
        "rmq",
        "range-query",
        "lcp",
        "static-query",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 45,
      "prerequisites": [
        "sqrt-decomposition"
      ],
      "nextLessons": [
        "offline-time-axis-techniques"
      ],
      "relatedLessons": [
        "suffix-periodicity-structures",
        "segment-tree",
        "tree-advanced"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "sqrt-decomposition",
      "title": "Sqrt Decomposition",
      "description": "배열을 작은 블록으로 나누어 구간 질의와 업데이트를 균형 있게 처리하는 제곱근 분할을 익힙니다.",
      "summary": "구간 합, 점 업데이트, 블록 크기 선택, lazy 블록 갱신까지 이어지는 sqrt decomposition 입문",
      "order": 36,
      "folderId": "heuristic-notes",
      "tags": [
        "sqrt-decomposition",
        "range-query",
        "block",
        "data-structure",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 30,
      "prerequisites": [
        "prefix-sum-difference"
      ],
      "nextLessons": [
        "sparse-table-rmq",
        "fenwick-tree",
        "segment-tree"
      ],
      "relatedLessons": [
        "coordinate-compression"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "selection"
      ]
    },
    {
      "lessonId": "dominator-tree",
      "title": "Dominator Tree",
      "description": "시작점에서 각 정점으로 가는 모든 경로가 반드시 지나는 immediate dominator와 dominator tree를 계산합니다.",
      "summary": "dominance 정의, immediate dominator, Lengauer-Tarjan의 semi-dominator/eval/link 흐름, tree ancestor 질의까지 이어지는 방향 그래프 심화",
      "order": 37,
      "folderId": "heuristic-reference",
      "tags": [
        "dominator-tree",
        "directed-graph",
        "flow-graph",
        "lengauer-tarjan",
        "dfs-order",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 75,
      "prerequisites": [
        "scc-2sat",
        "graph-tree-basics"
      ],
      "nextLessons": [
        "directed-mst"
      ],
      "relatedLessons": [
        "topological-sort-dag",
        "general-matching"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "weighted-matching",
      "title": "Weighted Matching",
      "description": "Matching에 가중치가 붙을 때 이분 assignment, small-N DP, 일반 그래프 weighted blossom의 경계를 구분합니다.",
      "summary": "maximum cardinality와 maximum weight 목적식 차이, small general graph bitmask DP, 이분 weighted matching, weighted blossom 개요까지 이어지는 matching 심화",
      "order": 38,
      "folderId": "heuristic-reference",
      "tags": [
        "weighted-matching",
        "matching",
        "assignment",
        "blossom",
        "dynamic-programming",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 70,
      "prerequisites": [
        "general-matching",
        "min-cost-flow"
      ],
      "nextLessons": [
        "hungarian-algorithm",
        "directed-mst",
        "matroid-algorithms"
      ],
      "relatedLessons": [
        "matching-cover-duality",
        "flow-with-lower-bound",
        "min-cost-flow"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "directed-mst",
      "title": "Directed MST",
      "description": "루트에서 모든 정점으로 향하는 최소 비용 arborescence를 Chu-Liu/Edmonds cycle contraction으로 계산합니다.",
      "summary": "루트 arborescence 모델링, incoming edge 선택, cycle contraction, 비용 보정과 불가능 판정까지 이어지는 방향 그래프 최적화 레슨",
      "order": 39,
      "folderId": "heuristic-reference",
      "tags": [
        "directed-mst",
        "arborescence",
        "edmonds",
        "chu-liu",
        "directed-graph",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 70,
      "prerequisites": [
        "scc-2sat",
        "greedy"
      ],
      "nextLessons": [
        "offline-time-axis-techniques"
      ],
      "relatedLessons": [
        "min-cost-flow",
        "weighted-matching",
        "dominator-tree",
        "flow-with-lower-bound"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "fenwick-tree",
      "title": "Fenwick Tree",
      "description": "배열의 prefix 합을 빠르게 관리하는 Fenwick Tree의 원리와 구간 합, 점 업데이트 구현을 익힙니다.",
      "summary": "prefix 합, lowbit, 점 업데이트, 구간 합, lower_bound까지 이어지는 Fenwick Tree 입문",
      "order": 40,
      "folderId": "heuristic-notes",
      "tags": [
        "fenwick-tree",
        "binary-indexed-tree",
        "prefix-sum",
        "range-query",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 30,
      "prerequisites": [
        "prefix-sum-difference",
        "coordinate-compression"
      ],
      "nextLessons": [
        "segment-tree"
      ],
      "relatedLessons": [
        "sqrt-decomposition"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "versioned-data-structures",
      "title": "Versioned Data Structures",
      "description": "persistent segment tree, persistent DSU, versioned stack/queue, sequence query를 persistence/rollback/retroactivity 경계와 함께 정리합니다.",
      "summary": "version root, path copying, partial persistence, persistent lazy propagation, persistent queue/stack, sequence query를 묶는 자료구조 허브",
      "order": 41,
      "folderId": "heuristic-reference",
      "tags": [
        "data-structures",
        "persistence",
        "versioning",
        "persistent-segment-tree",
        "union-find",
        "sequence",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 160,
      "prerequisites": [
        "segment-tree",
        "union-find",
        "coordinate-compression"
      ],
      "nextLessons": [
        "offline-time-axis-techniques",
        "wavelet-tree"
      ],
      "relatedLessons": [
        "offline-time-axis-techniques",
        "wavelet-matrix"
      ],
      "pages": [
        {
          "pageId": "persistent-segment-tree",
          "title": "Persistent Segment Tree",
          "description": "point update version root와 prefix root 차이 기반 kth query를 다룹니다.",
          "order": 20,
          "file": "pages/persistent-segment-tree.md"
        },
        {
          "pageId": "persistent-lazy-segment-tree",
          "title": "Persistent Lazy Segment Tree",
          "description": "range update와 range query를 version별로 처리할 때의 lazy clone 원칙입니다.",
          "order": 30,
          "file": "pages/persistent-lazy-segment-tree.md"
        },
        {
          "pageId": "persistent-union-find",
          "title": "Persistent Union-Find",
          "description": "union-only history에서 과거 연결성과 component size를 조회합니다.",
          "order": 40,
          "file": "pages/persistent-union-find.md"
        },
        {
          "pageId": "persistent-queue-stack",
          "title": "Persistent Queue and Stack",
          "description": "version별 stack, queue, deque 모델과 binary lifting 활용을 정리합니다.",
          "order": 50,
          "file": "pages/persistent-queue-stack.md"
        }
      ],
      "status": "published",
      "lessonType": "overview",
      "seriesId": "versioned-data-structures",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "segment-tree",
      "title": "Segment Tree",
      "description": "배열 구간 정보를 트리로 나누어 점 업데이트, 구간 질의, lazy 구간 업데이트를 처리하는 방법을 익힙니다.",
      "summary": "점 갱신과 구간 질의를 재귀 구현 하나로 익히고, 구간 덧셈과 합 질의를 lazy propagation으로 확장합니다.",
      "order": 42,
      "folderId": "heuristic-notes",
      "tags": [
        "segment-tree",
        "range-query",
        "lazy-propagation",
        "data-structure",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 45,
      "prerequisites": [
        "prefix-sum-difference"
      ],
      "nextLessons": [
        "versioned-data-structures",
        "dynamic-segment-tree",
        "tree-advanced",
        "offline-time-axis-techniques"
      ],
      "relatedLessons": [
        "fenwick-tree",
        "sqrt-decomposition",
        "sparse-table-rmq"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "wavelet-tree",
      "title": "Wavelet Tree",
      "description": "정적 배열에서 구간 kth, rank, frequency 질의를 값 범위와 index 범위를 함께 나누어 처리하는 Wavelet Tree를 익힙니다.",
      "summary": "값 기준 분할, prefixLeft index 변환, 구간 kth, `<= x` count, frequency 질의와 Persistent Segment Tree 비교까지 이어지는 정적 order statistic 레슨",
      "order": 44,
      "folderId": "heuristic-reference",
      "tags": [
        "wavelet-tree",
        "order-statistics",
        "range-query",
        "kth-query",
        "frequency",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 70,
      "prerequisites": [
        "versioned-data-structures",
        "coordinate-compression"
      ],
      "nextLessons": [
        "wavelet-matrix",
        "offline-time-axis-techniques"
      ],
      "relatedLessons": [
        "segment-tree",
        "sqrt-decomposition"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "wavelet-matrix",
      "title": "Wavelet Matrix",
      "description": "level별 bitvector와 rank 변환으로 정적 배열의 kth, rank, frequency 질의를 처리하는 Wavelet Matrix를 익힙니다.",
      "summary": "bitvector rank, level별 안정 분할, 구간 kth와 countLess, 좌표 압축과 Wavelet Tree와의 차이까지 이어지는 정적 range query 심화",
      "order": 45,
      "folderId": "heuristic-reference",
      "tags": [
        "wavelet-matrix",
        "rank",
        "range-query",
        "order-statistics",
        "succinct",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 70,
      "prerequisites": [
        "wavelet-tree",
        "coordinate-compression"
      ],
      "nextLessons": [
        "succinct-bitvector",
        "offline-time-axis-techniques"
      ],
      "relatedLessons": [
        "versioned-data-structures",
        "sparse-table-rmq"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "succinct-bitvector",
      "title": "Succinct Bitvector",
      "description": "압축된 bit열 위에서 rank/select를 빠르게 처리하고 Wavelet Matrix의 내부 bitvector를 메모리 효율적으로 구성합니다.",
      "summary": "64-bit word packing, superblock/block rank, rank/select convention, Wavelet Matrix와 compressed index 연결까지 이어지는 succinct 자료구조 레슨",
      "order": 46,
      "folderId": "heuristic-reference",
      "tags": [
        "succinct",
        "bitvector",
        "rank",
        "select",
        "wavelet-matrix",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 60,
      "prerequisites": [
        "wavelet-matrix",
        "cpp-contest-basics"
      ],
      "nextLessons": [
        "offline-time-axis-techniques"
      ],
      "relatedLessons": [
        "sparse-table-rmq",
        "coordinate-compression"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "tree-advanced",
      "title": "트리 심화: 분할 기법",
      "description": "트리 기본 성질 위에서 센트로이드 분할, Heavy-Light Decomposition, Euler Tour, LCA 같은 심화 도구를 연결해 익힙니다.",
      "summary": "Euler Tour, LCA, 센트로이드 분할, Heavy-Light Decomposition, small-to-large까지 이어지는 트리 심화",
      "order": 47,
      "folderId": "heuristic-reference",
      "tags": [
        "tree",
        "centroid-decomposition",
        "heavy-light-decomposition",
        "lca",
        "euler-tour",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 75,
      "prerequisites": [
        "graph-tree-basics",
        "segment-tree"
      ],
      "nextLessons": [
        "treap",
        "avl-splay-tree",
        "link-cut-tree"
      ],
      "relatedLessons": [
        "tsp-hamiltonian"
      ],
      "pages": [],
      "lessonType": "overview",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "avl-splay-tree",
      "title": "AVL과 Splay Tree 참고",
      "description": "Treap 이후에 참고할 균형 BST로 AVL Tree의 높이 균형과 Splay Tree의 상각 회전 패턴을 정리합니다.",
      "summary": "AVL balance factor와 LL/RR/LR/RL 회전, Splay의 zig/zig-zig/zig-zag와 Link-Cut Tree로 이어지는 참고 BST 노트",
      "order": 48,
      "folderId": "heuristic-reference",
      "tags": [
        "avl-tree",
        "splay-tree",
        "balanced-bst",
        "binary-search-tree",
        "rotation",
        "reference",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 40,
      "prerequisites": [
        "treap"
      ],
      "nextLessons": [
        "link-cut-tree"
      ],
      "relatedLessons": [
        "tree-advanced",
        "segment-tree"
      ],
      "pages": [],
      "lessonType": "reference",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "link-cut-tree",
      "title": "Link-Cut Tree",
      "description": "동적으로 변하는 forest에서 link, cut, path query를 splay 기반 preferred path로 처리합니다.",
      "summary": "access, makeroot, findRoot, link/cut, path aggregate, edge node 모델링까지 이어지는 dynamic tree 자료구조 심화",
      "order": 49,
      "folderId": "heuristic-reference",
      "tags": [
        "link-cut-tree",
        "dynamic-tree",
        "splay-tree",
        "path-query",
        "forest",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 85,
      "prerequisites": [
        "tree-advanced",
        "avl-splay-tree"
      ],
      "nextLessons": [
        "dynamic-segment-tree",
        "offline-time-axis-techniques"
      ],
      "relatedLessons": [
        "segment-tree",
        "versioned-data-structures",
        "offline-time-axis-techniques",
        "treap"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "hungarian-algorithm",
      "title": "Hungarian Algorithm",
      "description": "이분 assignment 문제를 potential, reduced cost, tight edge, augmenting path로 해석하고 순수 C 배열 구현과 COUPANG2 상품별 재고 매칭 예시까지 익힙니다.",
      "summary": "assignment problem, Hungarian potentials, 손계산 line-cover trace, 순수 C 배열 구현, COUPANG2 product-wise stock matching",
      "order": 50,
      "folderId": "heuristic-notes",
      "tags": [
        "hungarian",
        "assignment",
        "weighted-matching",
        "bipartite-matching",
        "optimization",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 80,
      "prerequisites": [
        "greedy",
        "graph-tree-basics"
      ],
      "nextLessons": [
        "matroid-algorithms"
      ],
      "relatedLessons": [
        "weighted-matching",
        "min-cost-flow",
        "matching-cover-duality"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "string-matching-kmp-z",
      "title": "문자열 매칭: KMP, Z, Rolling Hash",
      "description": "긴 텍스트에서 패턴을 빠르게 찾고 부분 문자열을 비교하기 위한 KMP, Z algorithm, rolling hash의 선택 기준과 구현을 익힙니다.",
      "summary": "KMP 실패 함수, Z function, rolling hash 전처리와 구간 비교, 해시 충돌 주의까지 이어지는 문자열 매칭 입문",
      "order": 55,
      "folderId": "heuristic-reference",
      "tags": [
        "string",
        "kmp",
        "z-algorithm",
        "rolling-hash",
        "pattern-matching",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 65,
      "prerequisites": [
        "cpp-contest-basics",
        "modular-arithmetic"
      ],
      "nextLessons": [
        "trie-aho-corasick",
        "suffix-periodicity-structures"
      ],
      "relatedLessons": [
        "two-pointers-sliding-window",
        "sorting"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "proof"
      ]
    },
    {
      "lessonId": "trie-aho-corasick",
      "title": "Trie와 Aho-Corasick",
      "description": "여러 문자열을 Trie에 저장하고 실패 링크를 붙여 다중 패턴 매칭을 선형 시간에 처리하는 방법을 익힙니다.",
      "summary": "Trie 삽입과 접두사 탐색, Aho-Corasick 실패 링크, 출력 전파, 각 패턴별 등장 횟수 집계까지 이어지는 문자열 심화 레슨",
      "order": 56,
      "folderId": "heuristic-reference",
      "tags": [
        "trie",
        "aho-corasick",
        "multi-pattern-matching",
        "automaton",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 60,
      "prerequisites": [
        "string-matching-kmp-z",
        "bfs-dfs-grid"
      ],
      "nextLessons": [
        "suffix-periodicity-structures"
      ],
      "relatedLessons": [
        "dynamic-programming"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "suffix-periodicity-structures",
      "title": "Suffix and Periodicity Structures",
      "description": "Suffix Array, Suffix Automaton, Suffix Tree, runs, border automaton, period query를 문자열 구조 선택 기준으로 묶습니다.",
      "summary": "suffix ordering, substring automaton, generalized strings, suffix tree, runs/periodicity, border automaton을 하나의 문자열 고급 구조 트랙으로 정리하는 허브",
      "order": 57,
      "folderId": "heuristic-reference",
      "tags": [
        "strings",
        "suffix-array",
        "suffix-automaton",
        "suffix-tree",
        "periodicity",
        "border",
        "lcp",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 300,
      "prerequisites": [
        "string-matching-kmp-z",
        "trie-aho-corasick",
        "sorting",
        "sparse-table-rmq"
      ],
      "nextLessons": [
        "palindrome-structures",
        "lyndon-factorization"
      ],
      "relatedLessons": [
        "palindrome-structures",
        "trie-aho-corasick",
        "string-matching-kmp-z"
      ],
      "pages": [
        {
          "pageId": "suffix-array-lcp",
          "title": "Suffix Array and LCP",
          "description": "Suffix Array와 LCP를 구현하고 패턴 검색, LCP 질의, 반복·서로 다른 부분 문자열 계산으로 이어갑니다.",
          "order": 20,
          "file": "pages/suffix-array-lcp.md"
        },
        {
          "pageId": "suffix-automaton",
          "title": "Suffix Automaton",
          "description": "모든 substring을 O(N) 상태 DAG로 압축합니다.",
          "order": 40,
          "file": "pages/suffix-automaton.md"
        },
        {
          "pageId": "generalized-suffix-automaton",
          "title": "여러 문자열의 Suffix Automaton 질의",
          "description": "첫 문자열의 SAM을 스캔해 여러 문자열의 공통 부분 문자열을 구하고 일반화 구축과의 차이를 살핍니다.",
          "order": 60,
          "file": "pages/generalized-suffix-automaton.md"
        },
        {
          "pageId": "suffix-tree-ukkonen",
          "title": "Suffix Tree and Ukkonen",
          "description": "Ukkonen의 상태를 abab$ 예제로 따라간 뒤 압축 간선과 suffix link 구현을 읽습니다.",
          "order": 70,
          "file": "pages/suffix-tree-ukkonen.md"
        },
        {
          "pageId": "runs-periodicity",
          "title": "Runs and Periodicity",
          "description": "반복 구간, run, 문자열 주기를 다룹니다.",
          "order": 80,
          "file": "pages/runs-periodicity.md"
        },
        {
          "pageId": "border-automaton",
          "title": "Border Automaton",
          "description": "prefix-function 기반 automaton과 border 전이를 다룹니다.",
          "order": 90,
          "file": "pages/border-automaton.md"
        }
      ],
      "status": "published",
      "lessonType": "overview",
      "seriesId": "suffix-periodicity-structures",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "palindrome-structures",
      "title": "Palindrome Structures",
      "description": "Palindromic Tree, palindrome query, range DP, suffix-palindrome 응용을 회문 문제 모델 선택 기준으로 묶습니다.",
      "summary": "회문 판정, 서로 다른 palindrome substring 집계, 구간 DP, suffix 구조와 palindrome 조건 결합을 하나의 문자열 회문 트랙으로 정리하는 허브",
      "order": 59,
      "folderId": "heuristic-reference",
      "tags": [
        "strings",
        "palindrome",
        "palindromic-tree",
        "manacher",
        "rolling-hash",
        "range-dp",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 170,
      "prerequisites": [
        "string-matching-kmp-z",
        "suffix-periodicity-structures",
        "dynamic-programming"
      ],
      "nextLessons": [
        "lyndon-factorization",
        "suffix-periodicity-structures"
      ],
      "relatedLessons": [
        "trie-aho-corasick",
        "suffix-periodicity-structures",
        "string-matching-kmp-z"
      ],
      "pages": [
        {
          "pageId": "palindromic-tree",
          "title": "Palindromic Tree",
          "description": "모든 서로 다른 palindrome substring을 Eertree 노드로 압축합니다.",
          "order": 20,
          "file": "pages/palindromic-tree.md"
        },
        {
          "pageId": "palindrome-query-structures",
          "title": "Palindrome Query Structures",
          "description": "Manacher, rolling hash, update query 모델을 구분합니다.",
          "order": 30,
          "file": "pages/palindrome-query-structures.md"
        },
        {
          "pageId": "palindrome-range-dp",
          "title": "Palindrome Range DP",
          "description": "구간 palindrome table과 range DP 응용입니다.",
          "order": 40,
          "file": "pages/palindrome-range-dp.md"
        }
      ],
      "status": "published",
      "lessonType": "overview",
      "seriesId": "palindrome-structures",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "lyndon-factorization",
      "title": "Lyndon Factorization",
      "description": "Lyndon word의 성질과 Duval algorithm을 이용해 문자열을 선형 시간에 분해하고 최소 회전으로 연결합니다.",
      "summary": "Lyndon word 정의, Chen-Fox-Lyndon 분해, Duval algorithm, minimum rotation과 suffix 구조와의 차이까지 이어지는 문자열 분해 레슨",
      "order": 61,
      "folderId": "heuristic-reference",
      "tags": [
        "lyndon-word",
        "duval",
        "string",
        "minimum-rotation",
        "factorization",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 55,
      "prerequisites": [
        "palindrome-structures",
        "string-matching-kmp-z"
      ],
      "nextLessons": [
        "suffix-periodicity-structures"
      ],
      "relatedLessons": [
        "suffix-periodicity-structures"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof"
      ]
    },
    {
      "lessonId": "geometry-ccw-segment-intersection",
      "title": "기하 기본: CCW, 선분 교차, Convex Hull",
      "description": "정수 좌표에서 외적 부호로 방향을 판정하고, 선분 교차와 convex hull을 안정적으로 구현하는 기하 기본기를 익힙니다.",
      "summary": "CCW, 선분 교차의 일직선/끝점 처리, monotonic chain convex hull, 정수 기하와 실수 오차 구분까지 이어지는 기하 입문",
      "order": 63,
      "folderId": "heuristic-reference",
      "tags": [
        "geometry",
        "ccw",
        "cross-product",
        "segment-intersection",
        "convex-hull",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 60,
      "prerequisites": [
        "sorting",
        "cpp-contest-basics"
      ],
      "nextLessons": [
        "rotating-calipers"
      ],
      "relatedLessons": [
        "complexity-input-size"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "rotating-calipers",
      "title": "Rotating Calipers",
      "description": "볼록 hull 위 포인터를 전진시키며 지름과 최소 폭을 구하고 지지선·접선·직사각형으로 연결합니다.",
      "summary": "같은 Point와 외적 연산으로 지름·폭을 구현하고 hull 전제와 동률 처리를 확인합니다.",
      "order": 64,
      "folderId": "heuristic-reference",
      "tags": [
        "geometry",
        "rotating-calipers",
        "convex-hull",
        "diameter",
        "antipodal-pair",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 75,
      "prerequisites": [
        "geometry-ccw-segment-intersection"
      ],
      "nextLessons": [
        "minkowski-sum",
        "sweep-line-geometry"
      ],
      "relatedLessons": [
        "two-pointers-sliding-window"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof"
      ]
    },
    {
      "lessonId": "sweep-line-geometry",
      "title": "Sweep Line Geometry",
      "description": "기하 이벤트를 한 축으로 정렬하고 active set 또는 구간 자료구조로 직사각형 넓이와 교차 판정을 처리합니다.",
      "summary": "이벤트 정렬, active set, y좌표 압축, 직사각형 합집합 넓이, 선분 교차 sweep의 tie-breaking까지 이어지는 기하 심화",
      "order": 65,
      "folderId": "heuristic-reference",
      "tags": [
        "geometry",
        "sweep-line",
        "events",
        "active-set",
        "rectangle-union",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 70,
      "prerequisites": [
        "geometry-ccw-segment-intersection",
        "segment-tree"
      ],
      "nextLessons": [
        "closest-pair-sweep"
      ],
      "relatedLessons": [
        "rotating-calipers",
        "two-pointers-sliding-window"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "closest-pair-sweep",
      "title": "Closest Pair Sweep",
      "description": "평면 점을 x좌표로 훑으며 active set의 y범위 후보만 검사해 가장 가까운 두 점을 찾습니다.",
      "summary": "정렬, active y set, x/y 거리 후보 제한, 중복 점과 overflow 처리까지 이어지는 closest pair sweep 레슨",
      "order": 66,
      "folderId": "heuristic-reference",
      "tags": [
        "geometry",
        "closest-pair",
        "sweep-line",
        "set",
        "distance",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 55,
      "prerequisites": [
        "sweep-line-geometry",
        "geometry-ccw-segment-intersection"
      ],
      "nextLessons": [
        "line-arrangement"
      ],
      "relatedLessons": [
        "rotating-calipers"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "line-arrangement",
      "title": "Line Arrangement",
      "description": "직선의 중복, 평행, 교점을 정확히 다루며 arrangement 영역 수와 sweep 확장 관점을 익힙니다.",
      "summary": "직선 정규화, rational 교점 dedup, 새 직선이 추가하는 영역 수, 선분 arrangement와 Euler formula 연결까지 이어지는 기하 심화",
      "order": 67,
      "folderId": "heuristic-reference",
      "tags": [
        "geometry",
        "line-arrangement",
        "intersection",
        "sweep-line",
        "rational",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 65,
      "prerequisites": [
        "sweep-line-geometry",
        "closest-pair-sweep"
      ],
      "nextLessons": [
        "voronoi-delaunay"
      ],
      "relatedLessons": [
        "geometry-ccw-segment-intersection",
        "rotating-calipers"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "voronoi-delaunay",
      "title": "Voronoi와 Delaunay",
      "description": "Voronoi cell과 Delaunay edge의 쌍대 관계, empty circumcircle 성질, nearest 구조 문제의 활용 기준을 익힙니다.",
      "summary": "Voronoi/Delaunay duality, in-circle predicate, Euclidean MST 후보 성질, half-plane cell 관점과 degeneracy 처리까지 이어지는 계산기하 심화",
      "order": 68,
      "folderId": "heuristic-reference",
      "tags": [
        "voronoi",
        "delaunay",
        "geometry",
        "nearest-neighbor",
        "circumcircle",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 70,
      "prerequisites": [
        "line-arrangement",
        "closest-pair-sweep"
      ],
      "nextLessons": [
        "half-plane-intersection",
        "geometry-robustness-and-duality"
      ],
      "relatedLessons": [
        "geometry-ccw-segment-intersection",
        "rotating-calipers"
      ],
      "pages": [],
      "lessonType": "overview",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "half-plane-intersection",
      "title": "Half-Plane Intersection",
      "description": "주어진 볼록 영역을 반평면으로 자르는 구현과 각도 정렬 deque의 적용 범위를 구분합니다.",
      "summary": "bounded polygon clipping, 평행 제약, 수치 오차와 무한 영역 처리의 차이",
      "order": 69,
      "folderId": "heuristic-reference",
      "tags": [
        "half-plane-intersection",
        "geometry",
        "convex-polygon",
        "line-intersection",
        "voronoi",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 35,
      "prerequisites": [
        "line-arrangement",
        "voronoi-delaunay"
      ],
      "nextLessons": [
        "minkowski-sum"
      ],
      "relatedLessons": [
        "geometry-ccw-segment-intersection",
        "sweep-line-geometry",
        "line-arrangement"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "gcd-extended-euclid-crt",
      "title": "정수론 심화: GCD, Extended Euclid, CRT, Sieve",
      "description": "gcd, 확장 유클리드 알고리즘, 일반 모듈러 역원, CRT, 최소 소인수 전처리로 정수론 문제를 확장해 풉니다.",
      "summary": "유클리드 알고리즘, extended gcd, 합성수 mod 역원, 일반 CRT, smallest prime factor sieve까지 이어지는 정수론 심화",
      "order": 70,
      "folderId": "heuristic-reference",
      "tags": [
        "number-theory",
        "gcd",
        "extended-euclid",
        "crt",
        "sieve",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 65,
      "prerequisites": [
        "modular-arithmetic"
      ],
      "nextLessons": [
        "combinatorics-ncr"
      ],
      "relatedLessons": [
        "complexity-input-size"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "proof"
      ]
    },
    {
      "lessonId": "combinatorics-ncr",
      "title": "조합론: nCr, 포함-배제, Lucas",
      "description": "모듈러 조합 계산, 포함-배제, Lucas 정리로 경우의 수 문제를 체계적으로 세는 방법을 익힙니다.",
      "summary": "factorial과 inverse factorial nCr, 포함-배제 부호 처리, Lucas 정리와 큰 n 조합 계산까지 이어지는 수학 심화",
      "order": 71,
      "folderId": "heuristic-reference",
      "tags": [
        "combinatorics",
        "ncr",
        "inclusion-exclusion",
        "lucas-theorem",
        "modular-arithmetic",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 65,
      "prerequisites": [
        "modular-arithmetic"
      ],
      "nextLessons": [
        "matrix-exponentiation",
        "polynomial-recurrence-algorithms",
        "probability-expected-value",
        "game-theory-grundy"
      ],
      "relatedLessons": [
        "gcd-extended-euclid-crt",
        "dynamic-programming"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "proof"
      ]
    },
    {
      "lessonId": "matrix-exponentiation",
      "title": "Matrix Exponentiation",
      "description": "선형 점화식과 상태 전이를 행렬로 만들고 빠른 거듭제곱으로 큰 반복 횟수를 처리합니다.",
      "summary": "상태 벡터, companion matrix, 행렬 빠른 거듭제곱, 그래프 walk 수와 affine transform까지 이어지는 수학/DP 레슨",
      "order": 72,
      "folderId": "heuristic-reference",
      "tags": [
        "matrix-exponentiation",
        "linear-recurrence",
        "fast-power",
        "dynamic-programming",
        "graph-walk",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 60,
      "prerequisites": [
        "modular-arithmetic",
        "dynamic-programming",
        "combinatorics-ncr"
      ],
      "nextLessons": [
        "polynomial-recurrence-algorithms"
      ],
      "relatedLessons": [
        "gcd-extended-euclid-crt",
        "topological-sort-dag"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "polynomial-recurrence-algorithms",
      "title": "Polynomial and Recurrence Algorithms",
      "description": "FFT/NTT, FPS, 다점평가, 보간, 생성함수, Kitamasa, Bostan-Mori, Berlekamp-Massey를 계수열 알고리즘 흐름으로 묶습니다.",
      "summary": "convolution, formal power series, multipoint evaluation, interpolation, generating function, linear recurrence nth term, recurrence guessing을 하나의 수학 알고리즘 트랙으로 정리하는 허브",
      "order": 73,
      "folderId": "heuristic-reference",
      "tags": [
        "math",
        "polynomial",
        "fft",
        "ntt",
        "formal-power-series",
        "generating-function",
        "linear-recurrence",
        "berlekamp-massey",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 360,
      "prerequisites": [
        "modular-arithmetic",
        "combinatorics-ncr",
        "matrix-exponentiation"
      ],
      "nextLessons": [
        "black-box-linear-algebra",
        "linear-algebra-applications",
        "sparse-linear-systems"
      ],
      "relatedLessons": [
        "gcd-extended-euclid-crt",
        "convex-dp-optimization",
        "randomized-determinant"
      ],
      "pages": [
        {
          "pageId": "fft-ntt",
          "title": "FFT and NTT",
          "description": "다항식 곱셈과 convolution을 빠르게 계산합니다.",
          "order": 20,
          "file": "pages/fft-ntt.md"
        },
        {
          "pageId": "formal-power-series",
          "title": "Formal Power Series",
          "description": "FPS 기본 연산, inverse, truncate를 다룹니다.",
          "order": 30,
          "file": "pages/formal-power-series.md"
        },
        {
          "pageId": "multipoint-evaluation",
          "title": "Multipoint Evaluation",
          "description": "Subproduct tree의 나머지 전파를 작은 다항식으로 추적하고 고속 평가에 필요한 연산을 구분합니다.",
          "order": 50,
          "file": "pages/multipoint-evaluation.md"
        },
        {
          "pageId": "polynomial-interpolation",
          "title": "Polynomial Interpolation",
          "description": "값에서 polynomial 계수를 복원합니다.",
          "order": 60,
          "file": "pages/polynomial-interpolation.md"
        },
        {
          "pageId": "generating-function-modeling",
          "title": "Generating Function Modeling",
          "description": "counting과 DP를 생성함수 계수 문제로 번역합니다.",
          "order": 70,
          "file": "pages/generating-function-modeling.md"
        },
        {
          "pageId": "linear-recurrence-kitamasa",
          "title": "Linear Recurrence and Kitamasa",
          "description": "characteristic polynomial로 n번째 항을 계산합니다.",
          "order": 80,
          "file": "pages/linear-recurrence-kitamasa.md"
        },
        {
          "pageId": "bostan-mori",
          "title": "Bostan-Mori",
          "description": "rational generating function의 n번째 계수를 추출합니다.",
          "order": 90,
          "file": "pages/bostan-mori.md"
        },
        {
          "pageId": "berlekamp-massey",
          "title": "Berlekamp–Massey: 점화식 추정과 검증",
          "description": "항 생성과 차수 상한, BM 구현, 별도 항 검증, Kitamasa 연결을 함께 다룹니다.",
          "order": 120,
          "file": "pages/berlekamp-massey.md"
        }
      ],
      "status": "published",
      "lessonType": "overview",
      "seriesId": "polynomial-recurrence-algorithms",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "probability-expected-value",
      "title": "확률과 기대값",
      "description": "확률 분포와 기대값 DP를 세우고, DAG 전이와 순환 전이, 모듈러 확률 처리를 구분해 익힙니다.",
      "summary": "확률 DP, 기대값 식, 기대값의 선형성, 순환 상태의 연립방정식, 모듈러 확률 표현까지 이어지는 수학/DP 레슨",
      "order": 80,
      "folderId": "heuristic-reference",
      "tags": [
        "probability",
        "expected-value",
        "dynamic-programming",
        "markov-chain",
        "modular-arithmetic",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 60,
      "prerequisites": [
        "dynamic-programming",
        "modular-arithmetic",
        "combinatorics-ncr"
      ],
      "nextLessons": [
        "game-theory-grundy",
        "probabilistic-decision-ai"
      ],
      "relatedLessons": [
        "matrix-exponentiation",
        "testing-and-stress"
      ],
      "pages": [],
      "lessonType": "core",
      "practiceStatus": "todo",
      "implementationStatus": "concept-only",
      "audience": "contest-core",
      "difficultyAxes": [
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "game-theory-grundy",
      "title": "Game Theory와 Grundy Number",
      "description": "Impartial game에서 win/lose DP와 Grundy number를 계산하고, 여러 독립 게임의 xor 합성으로 승패를 판정합니다.",
      "summary": "terminal losing, mex, Sprague-Grundy theorem, 여러 게임 xor, misere play 주의점까지 이어지는 게임 이론 입문",
      "order": 81,
      "folderId": "heuristic-reference",
      "tags": [
        "game-theory",
        "grundy-number",
        "sprague-grundy",
        "mex",
        "nim",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 55,
      "prerequisites": [
        "dynamic-programming",
        "proof-and-invariants"
      ],
      "nextLessons": [
        "minimax-alpha-beta",
        "game-theory-applications"
      ],
      "relatedLessons": [
        "probability-expected-value",
        "testing-and-stress"
      ],
      "pages": [],
      "lessonType": "core",
      "practiceStatus": "todo",
      "implementationStatus": "concept-only",
      "audience": "contest-core",
      "difficultyAxes": [
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "treap",
      "title": "Treap과 BST 기본",
      "description": "BST가 기울어지는 이유를 이해하고, Treap의 split·merge로 삽입·삭제와 순위 질의를 구현합니다.",
      "summary": "key와 무작위 priority로 균형을 유지하고 split·merge, 삽입·삭제, 순위 질의를 구현합니다.",
      "order": 82,
      "folderId": "heuristic-notes",
      "tags": [
        "treap",
        "binary-search-tree",
        "bst",
        "randomized",
        "split-merge",
        "order-statistics",
        "data-structure",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 40,
      "prerequisites": [
        "binary-search",
        "sorting"
      ],
      "nextLessons": [
        "euler-tour-tree"
      ],
      "relatedLessons": [
        "segment-tree",
        "tree-advanced",
        "avl-splay-tree"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "probabilistic-decision-ai",
      "title": "Probabilistic Decision AI",
      "description": "MDP, MCTS, imperfect information, POMDP, PBVI, POMCP, Bayesian Bandits, online planning evaluation을 reference 트랙으로 묶습니다.",
      "summary": "Bellman 기반 확률적 의사결정, hidden-state belief, simulation planning, bandit, online planning 평가를 정확 알고리즘과 heuristic/reference 경계로 정리하는 허브",
      "order": 83,
      "folderId": "heuristic-reference",
      "tags": [
        "probability",
        "decision-process",
        "mdp",
        "mcts",
        "pomdp",
        "bandits",
        "online-planning",
        "imperfect-information",
        "reference"
      ],
      "level": "advanced",
      "estimatedMinutes": 320,
      "prerequisites": [
        "probability-expected-value",
        "dynamic-programming",
        "minimax-alpha-beta",
        "heuristic"
      ],
      "nextLessons": [
        "game-theory-applications",
        "online-convex-optimization",
        "testing-and-stress"
      ],
      "relatedLessons": [
        "game-theory-grundy",
        "sparse-linear-systems",
        "black-box-linear-algebra"
      ],
      "pages": [
        {
          "pageId": "finite-horizon-mdp",
          "title": "MDP: 유한 지평, 할인과 정책 반복",
          "description": "유한 지평 DP부터 할인 가치 반복과 고정 정책 평가·개선까지 종료 조건을 구분해 구현합니다.",
          "order": 30,
          "file": "pages/finite-horizon-mdp.md"
        },
        {
          "pageId": "stochastic-shortest-path",
          "title": "Stochastic Shortest Path",
          "description": "absorbing goal, proper policy, 무한 기대 비용 가능성을 다룹니다.",
          "order": 60,
          "file": "pages/stochastic-shortest-path.md"
        },
        {
          "pageId": "monte-carlo-tree-search",
          "title": "Monte Carlo Tree Search",
          "description": "UCT, rollout, backpropagation으로 큰 game tree를 근사 탐색합니다.",
          "order": 80,
          "file": "pages/monte-carlo-tree-search.md"
        },
        {
          "pageId": "imperfect-information-search",
          "title": "Imperfect Information Search",
          "description": "information set, belief filtering, hidden-state search를 다룹니다.",
          "order": 90,
          "file": "pages/imperfect-information-search.md"
        },
        {
          "pageId": "pomdp",
          "title": "Partially Observable MDP",
          "description": "belief distribution과 observation model을 상태로 올립니다.",
          "order": 100,
          "file": "pages/pomdp.md"
        },
        {
          "pageId": "point-based-value-iteration",
          "title": "Point-Based Value Iteration",
          "description": "대표 belief point에서 alpha vector value function을 근사합니다.",
          "order": 110,
          "file": "pages/point-based-value-iteration.md"
        },
        {
          "pageId": "pomcp",
          "title": "POMCP",
          "description": "particle belief와 UCT를 결합한 online POMDP planning입니다.",
          "order": 120,
          "file": "pages/pomcp.md"
        },
        {
          "pageId": "bayesian-bandits",
          "title": "Bayesian Bandits",
          "description": "posterior update로 탐색과 활용을 조절합니다.",
          "order": 130,
          "file": "pages/bayesian-bandits.md"
        },
        {
          "pageId": "online-planning-evaluation",
          "title": "Online Planning Evaluation",
          "description": "planning 성능을 seed, budget, variance, deadline 기준으로 평가합니다.",
          "order": 140,
          "file": "pages/online-planning-evaluation.md"
        }
      ],
      "status": "published",
      "lessonType": "reference",
      "seriesId": "probabilistic-decision-ai",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "research-reference",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "offline-time-axis-techniques",
      "title": "Offline and Time-Axis Techniques",
      "description": "Mo, offline sorting, parallel binary search, rollback, time segment tree, dynamic connectivity, retroactivity를 시간축 모델 선택 기준으로 묶습니다.",
      "summary": "offline query reordering, answer search, rollback over time, dynamic connectivity, retroactive modeling을 하나의 시간축 문제군으로 정리하는 허브",
      "order": 84,
      "folderId": "heuristic-reference",
      "tags": [
        "offline-queries",
        "time-axis",
        "mo-algorithm",
        "rollback",
        "dynamic-connectivity",
        "parallel-binary-search",
        "retroactive",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 180,
      "prerequisites": [
        "sqrt-decomposition",
        "union-find",
        "segment-tree",
        "binary-search"
      ],
      "nextLessons": [
        "versioned-data-structures",
        "dynamic-network-optimization",
        "link-cut-tree"
      ],
      "relatedLessons": [
        "fenwick-tree",
        "segment-tree",
        "versioned-data-structures",
        "euler-tour-tree",
        "dynamic-network-optimization"
      ],
      "pages": [
        {
          "pageId": "offline-queries",
          "title": "Parallel Binary Search",
          "description": "단조 판정 질의를 묶는 Parallel Binary Search의 진행과 불변식을 설명합니다.",
          "order": 20,
          "file": "pages/offline-queries.md"
        },
        {
          "pageId": "offline-range-query-techniques",
          "title": "Offline Range Query Techniques",
          "description": "구간 질의에서 add/remove 상태, Mo 변형, offline Fenwick을 고릅니다.",
          "order": 30,
          "file": "pages/offline-range-query-techniques.md"
        },
        {
          "pageId": "rollback-techniques",
          "title": "Rollback Techniques",
          "description": "snapshot stack과 segment tree over time의 공통 구현 규칙입니다.",
          "order": 40,
          "file": "pages/rollback-techniques.md"
        },
        {
          "pageId": "dynamic-connectivity",
          "title": "Dynamic Connectivity",
          "description": "간선 활성 구간을 rollback DSU로 처리하는 offline connectivity입니다.",
          "order": 50,
          "file": "pages/dynamic-connectivity.md"
        },
        {
          "pageId": "retroactive-data-structures",
          "title": "Retroactive Data Structures",
          "description": "과거 operation 변경을 active interval로 바꾸는 제한적 retroactivity입니다.",
          "order": 60,
          "file": "pages/retroactive-data-structures.md"
        }
      ],
      "status": "published",
      "lessonType": "overview",
      "seriesId": "offline-time-axis-techniques",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "selection"
      ]
    },
    {
      "lessonId": "minimax-alpha-beta",
      "title": "Minimax와 Alpha-Beta Pruning",
      "description": "두 플레이어 game tree에서 minimax 값을 계산하고 alpha-beta pruning으로 불필요한 가지를 줄이는 방법을 익힙니다.",
      "summary": "작은 게임 트리에서 상대의 선택을 계산하고, 이미 확보한 점수로 가지를 자르는 이유와 캐시의 상한·하한을 이해합니다.",
      "order": 85,
      "folderId": "heuristic-notes",
      "tags": [
        "minimax",
        "alpha-beta",
        "game-tree",
        "search",
        "heuristic",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 15,
      "prerequisites": [
        "testing-and-stress"
      ],
      "nextLessons": [
        "probabilistic-decision-ai"
      ],
      "relatedLessons": [
        "proof-and-invariants",
        "heuristic",
        "game-theory-grundy"
      ],
      "pages": [],
      "lessonType": "overview",
      "practiceStatus": "linked",
      "implementationStatus": "concept-only",
      "audience": "contest-core",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "proof-and-invariants",
      "title": "Proof와 Invariant",
      "description": "이분 탐색의 답 보존, 회의 선택의 교환 논리, 격자 경로 DP의 중복 없는 전이를 설명합니다.",
      "summary": "실제 이분 탐색, 회의 선택, 격자 경로 DP에서 답 보존과 전이의 완전성을 설명합니다.",
      "order": 86,
      "folderId": "heuristic-notes",
      "tags": [
        "proof",
        "invariant",
        "exchange-argument",
        "monotonicity",
        "counterexample",
        "practice"
      ],
      "level": "intermediate",
      "estimatedMinutes": 15,
      "prerequisites": [
        "greedy",
        "binary-search",
        "dynamic-programming"
      ],
      "nextLessons": [
        "divide-and-conquer-dp-optimization",
        "knuth-optimization"
      ],
      "relatedLessons": [
        "testing-and-stress"
      ],
      "pages": [],
      "lessonType": "core",
      "practiceStatus": "linked",
      "implementationStatus": "concept-only",
      "audience": "contest-core",
      "difficultyAxes": [
        "proof"
      ]
    },
    {
      "lessonId": "divide-and-conquer-dp-optimization",
      "title": "Divide and Conquer DP Optimization",
      "description": "최적 분할점 단조성을 이용해 layer DP의 후보 범위를 줄이는 divide-and-conquer DP optimization을 익힙니다.",
      "summary": "구간 분할 DP, opt 단조성, 재귀적 후보 범위 축소, cost 계산과 적용 조건 검증까지 이어지는 DP 최적화 레슨",
      "order": 87,
      "folderId": "heuristic-reference",
      "tags": [
        "divide-and-conquer-dp",
        "dp-optimization",
        "monotone-opt",
        "partition-dp",
        "quadrangle-inequality",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 65,
      "prerequisites": [
        "dynamic-programming",
        "proof-and-invariants"
      ],
      "nextLessons": [
        "knuth-optimization",
        "monge-smawk"
      ],
      "relatedLessons": [
        "convex-dp-optimization",
        "probability-expected-value"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "selection"
      ]
    },
    {
      "lessonId": "knuth-optimization",
      "title": "Knuth Optimization",
      "description": "Interval DP에서 최적 분할점의 단조 범위를 이용해 `O(N^3)` 전이를 `O(N^2)`로 줄이는 Knuth Optimization을 익힙니다.",
      "summary": "구간 DP 전이, opt monotonicity, `opt[l][r-1]..opt[l+1][r]` 후보 범위, 파일 합치기와 적용 조건 점검까지 이어지는 DP 최적화",
      "order": 88,
      "folderId": "heuristic-reference",
      "tags": [
        "knuth-optimization",
        "interval-dp",
        "dp-optimization",
        "quadrangle-inequality",
        "optimal-bst",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 60,
      "prerequisites": [
        "dynamic-programming",
        "proof-and-invariants"
      ],
      "nextLessons": [
        "monge-smawk"
      ],
      "relatedLessons": [
        "divide-and-conquer-dp-optimization"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "selection"
      ]
    },
    {
      "lessonId": "monge-smawk",
      "title": "Monge와 SMAWK",
      "description": "Monge array와 totally monotone matrix의 row minimum 단조성을 이용해 SMAWK와 monotone optimization을 이해합니다.",
      "summary": "Monge inequality, totally monotone matrix, monotone row minima, SMAWK column reduction과 DP 최적화 연결까지 이어지는 고급 최적화 레슨",
      "order": 89,
      "folderId": "heuristic-reference",
      "tags": [
        "monge",
        "smawk",
        "totally-monotone",
        "dp-optimization",
        "row-minima",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 70,
      "prerequisites": [
        "divide-and-conquer-dp-optimization",
        "knuth-optimization"
      ],
      "nextLessons": [
        "parametric-optimization",
        "knuth-optimization"
      ],
      "relatedLessons": [
        "convex-dp-optimization"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "selection"
      ]
    },
    {
      "lessonId": "parametric-optimization",
      "title": "Parametric Optimization",
      "description": "Alien Optimization, Parametric DP, fractional objectives, Lagrangian relaxation을 하나의 parameter 기반 최적화 흐름으로 묶어 선택 기준과 구현 함정을 정리합니다.",
      "summary": "제약이나 답 후보를 parameter로 고정해 더 쉬운 oracle을 풀고, 단조성, tie-break, breakpoint, 답 복원으로 원래 최적화 문제를 해결하는 허브 레슨입니다.",
      "order": 90,
      "folderId": "heuristic-reference",
      "tags": [
        "dp-optimization",
        "parametric-search",
        "alien-optimization",
        "fractional-programming",
        "lagrangian-relaxation",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 110,
      "prerequisites": [
        "binary-search",
        "dynamic-programming",
        "divide-and-conquer-dp-optimization",
        "monge-smawk"
      ],
      "nextLessons": [
        "online-convex-optimization",
        "convex-cost-flow"
      ],
      "relatedLessons": [
        "convex-dp-optimization",
        "flow-with-lower-bound"
      ],
      "pages": [
        {
          "pageId": "fractional-objectives",
          "title": "Fractional Objectives",
          "description": "평균과 비율 목적식을 value - lambda * weight 판정으로 바꿉니다.",
          "order": 30,
          "file": "pages/fractional-objectives.md"
        },
        {
          "pageId": "general-lagrangian-relaxation",
          "title": "General Lagrangian Relaxation",
          "description": "여러 제약과 relaxed oracle을 dual variable 관점에서 다룹니다.",
          "order": 40,
          "file": "pages/general-lagrangian-relaxation.md"
        }
      ],
      "status": "published",
      "lessonType": "overview",
      "seriesId": "parametric-optimization",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "dynamic-segment-tree",
      "title": "Dynamic Segment Tree",
      "description": "좌표 범위가 매우 크고 실제 접근 지점이 적은 상황에서 필요한 node만 생성하는 sparse Segment Tree를 익힙니다.",
      "summary": "큰 좌표 범위에서 구간 덧셈과 합 질의를 구현하고 lazy 전달에 따른 노드 생성과 메모리를 계산합니다.",
      "order": 93,
      "folderId": "heuristic-notes",
      "tags": [
        "segment-tree",
        "dynamic-segment-tree",
        "sparse",
        "lazy-propagation",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 40,
      "prerequisites": [
        "segment-tree",
        "coordinate-compression"
      ],
      "nextLessons": [],
      "relatedLessons": [
        "versioned-data-structures",
        "link-cut-tree"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "linked",
      "implementationStatus": "full",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation"
      ]
    },
    {
      "lessonId": "linear-basis-xor",
      "title": "XOR Linear Basis",
      "description": "XOR 기저를 만들고 표현 가능성·최댓값·k번째 값·그래프 cycle과 구간 질의로 이어갑니다.",
      "summary": "하나의 기저 구현에서 rank와 정규화, counting, walk XOR, basis merge를 연결합니다.",
      "order": 94,
      "folderId": "heuristic-reference",
      "tags": [
        "xor",
        "linear-basis",
        "gaussian-elimination",
        "bitwise",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 80,
      "prerequisites": [
        "modular-arithmetic",
        "proof-and-invariants",
        "polynomial-recurrence-algorithms"
      ],
      "nextLessons": [],
      "relatedLessons": [
        "combinatorics-ncr",
        "game-theory-grundy"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "convex-dp-optimization",
      "title": "Convex DP Optimization",
      "description": "CHT, Li Chao Tree, Slope Trick, Min-Plus Convolution, Kinetic/Fully Dynamic Hull을 DP 전이식 선택 기준으로 묶습니다.",
      "summary": "전이식의 line query, argmin monotonicity, convex function, min-plus merge, dynamic line set 여부를 보고 DP 최적화 기법을 고르는 허브",
      "order": 95,
      "folderId": "heuristic-reference",
      "tags": [
        "dynamic-programming",
        "convex-optimization",
        "convex-hull-trick",
        "li-chao-tree",
        "slope-trick",
        "min-plus-convolution",
        "monge",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 260,
      "prerequisites": [
        "dynamic-programming",
        "segment-tree",
        "divide-and-conquer-dp-optimization"
      ],
      "nextLessons": [
        "convex-cost-flow",
        "offline-time-axis-techniques"
      ],
      "relatedLessons": [
        "monge-smawk",
        "parametric-optimization",
        "versioned-data-structures",
        "geometry-robustness-and-duality"
      ],
      "pages": [
        {
          "pageId": "convex-hull-trick-li-chao",
          "title": "Convex Hull Trick과 Li Chao Tree",
          "description": "DP 식 전개, 단조 deque 구현과 적용, Li Chao 대안을 한 흐름으로 읽습니다.",
          "order": 30,
          "file": "pages/convex-hull-trick-li-chao.md"
        },
        {
          "pageId": "slope-trick",
          "title": "Slope Trick",
          "description": "convex piecewise-linear function을 priority queue로 유지합니다.",
          "order": 60,
          "file": "pages/slope-trick.md"
        },
        {
          "pageId": "min-plus-convolution",
          "title": "Min-Plus Convolution",
          "description": "cost sequence merge와 convex/Monge 특수형을 구분합니다.",
          "order": 70,
          "file": "pages/min-plus-convolution.md"
        },
        {
          "pageId": "kinetic-hull",
          "title": "Kinetic Hull",
          "description": "시간에 따라 움직이는 line/hull의 이벤트를 다룹니다.",
          "order": 80,
          "file": "pages/kinetic-hull.md"
        },
        {
          "pageId": "fully-dynamic-cht",
          "title": "Fully Dynamic CHT",
          "description": "line 삽입과 삭제가 모두 필요한 경우의 선택지입니다.",
          "order": 90,
          "file": "pages/fully-dynamic-cht.md"
        }
      ],
      "status": "published",
      "lessonType": "overview",
      "seriesId": "convex-dp-optimization",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "graph-cut-structures",
      "title": "Graph Cut Structures",
      "description": "s-t min cut 이후의 global min cut, Gomory-Hu Tree, sparsification, randomized contraction, cactus cut family를 하나의 흐름으로 정리합니다.",
      "summary": "cut model selection, Stoer-Wagner, Karger contraction, Gomory-Hu Tree, sparse certificate, cactus representation을 묶는 그래프 cut 허브",
      "order": 97,
      "folderId": "heuristic-reference",
      "tags": [
        "graph",
        "min-cut",
        "global-min-cut",
        "gomory-hu-tree",
        "cactus",
        "sparsification",
        "randomized",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 210,
      "prerequisites": [
        "max-flow-min-cut",
        "flow-with-lower-bound"
      ],
      "nextLessons": [
        "offline-time-axis-techniques",
        "planar-graph-duality"
      ],
      "relatedLessons": [
        "proof-and-invariants",
        "dynamic-network-optimization",
        "planar-graph-duality"
      ],
      "pages": [
        {
          "pageId": "global-min-cut",
          "title": "Global Min Cut",
          "description": "무향 그래프의 전체 minimum cut과 Stoer-Wagner 알고리즘입니다.",
          "order": 20,
          "file": "pages/global-min-cut.md"
        },
        {
          "pageId": "randomized-min-cut",
          "title": "Randomized Min Cut",
          "description": "Karger contraction과 반복 확률 증폭으로 global min cut을 찾는 randomized 접근입니다.",
          "order": 30,
          "file": "pages/randomized-min-cut.md"
        },
        {
          "pageId": "gomory-hu-tree",
          "title": "Gomory-Hu Tree",
          "description": "4정점에서 parent 갱신을 따라가고 구성 구현과 모든 쌍 min-cut 질의로 연결합니다.",
          "order": 40,
          "file": "pages/gomory-hu-tree.md"
        },
        {
          "pageId": "cut-sparsification",
          "title": "Cut Sparsification",
          "description": "작은 cut과 edge connectivity를 보존하는 sparse certificate 관점입니다.",
          "order": 60,
          "file": "pages/cut-sparsification.md"
        },
        {
          "pageId": "cactus-representation",
          "title": "Cactus Representation",
          "description": "cactus graph와 min cut family 표현을 구분합니다.",
          "order": 80,
          "file": "pages/cactus-representation.md"
        }
      ],
      "status": "published",
      "lessonType": "overview",
      "seriesId": "graph-cut-structures",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "euler-tour-tree",
      "title": "Euler Tour Tree",
      "description": "dynamic forest를 Euler tour sequence와 balanced binary tree로 표현해 online link, cut, connectivity를 처리합니다.",
      "summary": "정점 marker와 양방향 arc로 일관된 link/cut 순환 tour를 추적하고 필요한 parent와 handle 관리를 설명합니다.",
      "order": 98,
      "folderId": "heuristic-reference",
      "tags": [
        "data-structures",
        "euler-tour-tree",
        "dynamic-forest",
        "treap",
        "connectivity",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 30,
      "prerequisites": [
        "link-cut-tree",
        "offline-time-axis-techniques",
        "tree-advanced"
      ],
      "nextLessons": [
        "versioned-data-structures"
      ],
      "relatedLessons": [
        "union-find",
        "offline-time-axis-techniques"
      ],
      "pages": [],
      "lessonType": "reference",
      "practiceStatus": "todo",
      "implementationStatus": "concept-only",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "mobius-inversion",
      "title": "Mobius Inversion",
      "description": "Mobius function으로 약수 합 관계를 되돌리고 gcd, 서로소 pair, divisor transform 문제를 포함-배제로 처리합니다.",
      "summary": "Mobius function, divisor inversion, coprime pair count, exact gcd count, multiple sieve와 pair 보정까지 이어지는 수학 심화 레슨",
      "order": 99,
      "folderId": "heuristic-reference",
      "tags": [
        "math",
        "number-theory",
        "mobius-inversion",
        "gcd",
        "inclusion-exclusion",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 50,
      "prerequisites": [
        "gcd-extended-euclid-crt",
        "combinatorics-ncr"
      ],
      "nextLessons": [
        "dirichlet-convolution"
      ],
      "relatedLessons": [
        "linear-basis-xor",
        "proof-and-invariants"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "convex-cost-flow",
      "title": "Convex Cost Flow",
      "description": "사용량이 늘수록 marginal cost가 증가하는 비용을 edge split으로 표현해 Min-Cost Flow 모델에 결합합니다.",
      "summary": "convex marginal cost, unit/piecewise edge split, demand allocation, Slope Trick과 Min-Cost Flow의 선택 기준을 다루는 최적화 심화 레슨",
      "order": 100,
      "folderId": "heuristic-reference",
      "tags": [
        "optimization",
        "convex-cost-flow",
        "min-cost-flow",
        "convexity",
        "network-flow",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 45,
      "prerequisites": [
        "min-cost-flow",
        "convex-dp-optimization",
        "parametric-optimization"
      ],
      "nextLessons": [
        "convex-dp-optimization"
      ],
      "relatedLessons": [
        "convex-dp-optimization",
        "flow-with-lower-bound"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "dynamic-network-optimization",
      "title": "Dynamic Network Optimization",
      "description": "Dynamic Flow, Dynamic MST, offline time-axis, rebuild, residual reuse, cut/cycle property를 하나의 동적 그래프 최적화 선택 흐름으로 묶습니다.",
      "summary": "flow나 MST가 시간에 따라 바뀌는 문제를 완전 동적 자료구조부터 보지 않고 residual reuse, time-expanded network, block rebuild, offline interval 모델로 낮추는 허브",
      "order": 102,
      "folderId": "heuristic-reference",
      "tags": [
        "graph",
        "dynamic-graph",
        "flow",
        "mst",
        "offline-query",
        "cut",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 160,
      "prerequisites": [
        "max-flow-min-cut",
        "min-cost-flow",
        "graph-tree-basics",
        "offline-time-axis-techniques"
      ],
      "nextLessons": [
        "link-cut-tree",
        "euler-tour-tree"
      ],
      "relatedLessons": [
        "graph-cut-structures",
        "flow-with-lower-bound",
        "versioned-data-structures",
        "planar-graph-duality"
      ],
      "pages": [
        {
          "pageId": "dynamic-flow",
          "title": "Dynamic Flow",
          "description": "capacity update, residual reuse, time-expanded network, batch rebuild를 구분합니다.",
          "order": 10,
          "file": "pages/dynamic-flow.md"
        },
        {
          "pageId": "dynamic-mst",
          "title": "Dynamic MST",
          "description": "edge insertion/deletion, replacement edge, rebuild baseline, block strategy를 구분합니다.",
          "order": 20,
          "file": "pages/dynamic-mst.md"
        }
      ],
      "status": "published",
      "lessonType": "overview",
      "seriesId": "dynamic-network-optimization",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "dirichlet-convolution",
      "title": "Dirichlet Convolution",
      "description": "약수 관계 위 convolution으로 Mobius Inversion, multiplicative function, divisor transform을 하나의 틀에서 정리합니다.",
      "summary": "Dirichlet convolution의 정의, 기본 산술 함수 관계, divisor zeta transform, Mobius inverse를 다루는 정수론 심화 레슨",
      "order": 109,
      "folderId": "heuristic-reference",
      "tags": [
        "math",
        "number-theory",
        "dirichlet-convolution",
        "mobius-inversion",
        "divisor-transform",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 50,
      "prerequisites": [
        "mobius-inversion",
        "gcd-extended-euclid-crt",
        "combinatorics-ncr"
      ],
      "nextLessons": [
        "multiplicative-functions"
      ],
      "relatedLessons": [
        "modular-arithmetic",
        "linear-basis-xor"
      ],
      "pages": [],
      "lessonType": "overview",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "minkowski-sum",
      "title": "Minkowski Sum",
      "description": "두 convex polygon의 모든 점 합을 edge vector merge로 계산하고 충돌 판정과 거리 모델링으로 연결합니다.",
      "summary": "Minkowski sum 정의, convex polygon edge merge, reflected polygon 충돌 판정, support function과 configuration space 관점을 다루는 기하 심화 레슨",
      "order": 111,
      "folderId": "heuristic-reference",
      "tags": [
        "geometry",
        "minkowski-sum",
        "convex-polygon",
        "collision-detection",
        "support-function",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 60,
      "prerequisites": [
        "rotating-calipers",
        "half-plane-intersection",
        "geometry-ccw-segment-intersection"
      ],
      "nextLessons": [
        "rotating-calipers",
        "shape-distance-modeling"
      ],
      "relatedLessons": [
        "sweep-line-geometry",
        "voronoi-delaunay"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "multiplicative-functions",
      "title": "Multiplicative Functions",
      "description": "서로소 곱에서 값이 분리되는 산술 함수를 prime power 공식과 linear sieve로 계산합니다.",
      "summary": "Euler phi, Mobius, divisor count 같은 multiplicative function을 prime power 공식과 linear sieve 상태 관리로 한 번에 계산하는 정수론 심화 레슨",
      "order": 113,
      "folderId": "heuristic-reference",
      "tags": [
        "math",
        "number-theory",
        "multiplicative-function",
        "linear-sieve",
        "dirichlet-convolution",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 55,
      "prerequisites": [
        "dirichlet-convolution",
        "mobius-inversion",
        "gcd-extended-euclid-crt"
      ],
      "nextLessons": [
        "summatory-number-theory"
      ],
      "relatedLessons": [
        "modular-arithmetic",
        "combinatorics-ncr"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "full",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "summatory-number-theory",
      "title": "Summatory Number Theory",
      "description": "floor division grouping과 divisor transform으로 큰 n의 정수론 누적합을 빠르게 계산하는 관점을 익힙니다.",
      "summary": "multiplicative function prefix, Mobius inversion, floor quotient block을 결합하는 정수론 summatory 레슨",
      "order": 122,
      "folderId": "heuristic-reference",
      "tags": [
        "math",
        "number-theory",
        "summatory-function",
        "floor-division",
        "mobius-inversion",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 55,
      "prerequisites": [
        "multiplicative-functions",
        "mobius-inversion",
        "dirichlet-convolution"
      ],
      "nextLessons": [],
      "relatedLessons": [
        "gcd-extended-euclid-crt",
        "combinatorics-ncr"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "shape-distance-modeling",
      "title": "Shape Distance Modeling",
      "description": "Minkowski difference, support function, separating axis로 도형 거리와 충돌 문제를 모델링하는 법을 익힙니다.",
      "summary": "convex shape distance, reflected obstacle, support function, segment-distance baseline을 연결하는 계산기하 레슨",
      "order": 125,
      "folderId": "heuristic-reference",
      "tags": [
        "geometry",
        "shape-distance",
        "minkowski-sum",
        "support-function",
        "separating-axis",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 60,
      "prerequisites": [
        "minkowski-sum",
        "rotating-calipers",
        "geometry-ccw-segment-intersection"
      ],
      "nextLessons": [
        "circle-geometry"
      ],
      "relatedLessons": [
        "half-plane-intersection",
        "sweep-line-geometry",
        "voronoi-delaunay"
      ],
      "pages": [],
      "lessonType": "overview",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "circle-geometry",
      "title": "Circle Geometry",
      "description": "원-직선, 원-원 교점과 접선 construction, 각도 구간 sweep의 case 분기를 익힙니다.",
      "summary": "circle-line intersection, circle-circle intersection, tangent construction, angular interval sweep을 다루는 계산기하 레슨",
      "order": 130,
      "folderId": "heuristic-reference",
      "tags": [
        "geometry",
        "circle",
        "intersection",
        "tangent",
        "angular-sweep",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 60,
      "prerequisites": [
        "shape-distance-modeling",
        "geometry-ccw-segment-intersection",
        "closest-pair-sweep"
      ],
      "nextLessons": [
        "circle-arrangement",
        "geometry-robustness-and-duality",
        "inversion-geometry"
      ],
      "relatedLessons": [
        "voronoi-delaunay",
        "sweep-line-geometry"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "circle-arrangement",
      "title": "Circle Arrangement",
      "description": "여러 원의 교점으로 arc를 나누고 union area, perimeter, depth를 angular sweep으로 계산합니다.",
      "summary": "circle-circle intersection angle, arc midpoint depth, union boundary, sector contribution, 포함 원 처리를 다루는 계산기하 레슨",
      "order": 135,
      "folderId": "heuristic-reference",
      "tags": [
        "geometry",
        "circle",
        "arrangement",
        "angular-sweep",
        "area-union",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 60,
      "prerequisites": [
        "circle-geometry",
        "sweep-line-geometry",
        "shape-distance-modeling"
      ],
      "nextLessons": [],
      "relatedLessons": [
        "half-plane-intersection",
        "voronoi-delaunay"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "geometry-robustness-and-duality",
      "title": "Geometry Robustness and Duality",
      "description": "Robust predicate, Power Diagram, Robust Delaunay, 3D Convex Hull, Regular Triangulation을 계산기하 안정성과 duality 흐름으로 묶습니다.",
      "summary": "좌표 predicate 안정성, weighted Voronoi, Delaunay incircle, 3D lifting, lower hull duality를 구현 위험도와 문제 신호별로 고르는 계산기하 허브",
      "order": 138,
      "folderId": "heuristic-reference",
      "tags": [
        "geometry",
        "robust-predicate",
        "duality",
        "power-diagram",
        "delaunay",
        "convex-hull-3d",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 260,
      "prerequisites": [
        "geometry-ccw-segment-intersection",
        "circle-geometry",
        "sweep-line-geometry",
        "half-plane-intersection"
      ],
      "nextLessons": [
        "voronoi-delaunay",
        "planar-graph-duality"
      ],
      "relatedLessons": [
        "shape-distance-modeling",
        "circle-arrangement",
        "inversion-geometry"
      ],
      "pages": [
        {
          "pageId": "robust-geometry-predicates",
          "title": "Robust Geometry Predicates",
          "description": "orientation, segment intersection, incircle 같은 분기 조건의 exact/EPS 정책입니다.",
          "order": 10,
          "file": "pages/robust-geometry-predicates.md"
        },
        {
          "pageId": "power-diagram",
          "title": "Power Diagram",
          "description": "weighted site의 power distance와 radical axis cell 모델입니다.",
          "order": 20,
          "file": "pages/power-diagram.md"
        },
        {
          "pageId": "robust-delaunay",
          "title": "Robust Delaunay",
          "description": "Delaunay edge flip, incircle predicate, cocircular degeneracy를 안정적으로 처리합니다.",
          "order": 30,
          "file": "pages/robust-delaunay.md"
        },
        {
          "pageId": "3d-convex-hull",
          "title": "3D Convex Hull",
          "description": "signed volume, oriented face, visible face, horizon edge를 다룹니다.",
          "order": 40,
          "file": "pages/3d-convex-hull.md"
        },
        {
          "pageId": "regular-triangulation",
          "title": "Regular Triangulation",
          "description": "weighted point lifting과 lower hull로 Power Diagram의 dual을 해석합니다.",
          "order": 50,
          "file": "pages/regular-triangulation.md"
        }
      ],
      "status": "published",
      "lessonType": "overview",
      "seriesId": "geometry-robustness-and-duality",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "black-box-linear-algebra",
      "title": "Black-Box Linear Algebra",
      "description": "Sparse matrix-vector product만으로 Krylov sequence와 Wiedemann 계열 선형대수 모델을 다룹니다.",
      "summary": "큰 sparse matrix를 matvec oracle로 보고 Krylov sequence, Berlekamp-Massey, randomized projection 검증을 연결하는 선형대수 심화 레슨",
      "order": 142,
      "folderId": "heuristic-reference",
      "tags": [
        "math",
        "linear-algebra",
        "sparse-matrix",
        "berlekamp-massey",
        "randomized",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 65,
      "prerequisites": [
        "polynomial-recurrence-algorithms",
        "modular-arithmetic"
      ],
      "nextLessons": [
        "sparse-linear-systems",
        "linear-algebra-applications"
      ],
      "relatedLessons": [
        "matrix-exponentiation",
        "polynomial-recurrence-algorithms"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "game-theory-applications",
      "title": "Game Theory Applications",
      "description": "Grundy, minimax, MDP, hidden information 모델을 문제 신호별로 고르는 게임 이론 응용 기준을 정리합니다.",
      "summary": "impartial game, xor 합성, minimax, MDP, imperfect information을 문제 조건별로 선택하는 게임 모델링 레슨",
      "order": 143,
      "folderId": "heuristic-reference",
      "tags": [
        "game-theory",
        "grundy-number",
        "minimax",
        "mdp",
        "imperfect-information",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 55,
      "prerequisites": [
        "game-theory-grundy",
        "minimax-alpha-beta",
        "probabilistic-decision-ai"
      ],
      "nextLessons": [
        "probabilistic-decision-ai"
      ],
      "relatedLessons": [
        "probabilistic-decision-ai"
      ],
      "pages": [],
      "lessonType": "overview",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "inversion-geometry",
      "title": "Inversion Geometry",
      "description": "원과 직선을 inversion으로 변환해 접선, 교점, 원다발 문제를 단순화하는 기하 모델링을 익힙니다.",
      "summary": "점 inversion 공식, 중심을 지나는 원의 직선 변환, angle 보존, degeneracy 처리 기준을 다루는 계산기하 심화 레슨",
      "order": 144,
      "folderId": "heuristic-reference",
      "tags": [
        "geometry",
        "inversion",
        "circle",
        "tangent",
        "transformation",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 55,
      "prerequisites": [
        "circle-geometry",
        "geometry-robustness-and-duality",
        "shape-distance-modeling"
      ],
      "nextLessons": [],
      "relatedLessons": [
        "circle-arrangement",
        "voronoi-delaunay",
        "half-plane-intersection"
      ],
      "pages": [],
      "lessonType": "overview",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "matroid-algorithms",
      "title": "Matroid Algorithms",
      "description": "Matroid greedy, exchange, intersection, union, parity를 구현 완성도별 reference 트랙으로 정리합니다.",
      "summary": "matroid 공리와 greedy, exchange graph, intersection/union/parity reference, contest 구현 경계를 다루는 조합 최적화 허브",
      "order": 151,
      "folderId": "heuristic-reference",
      "tags": [
        "graph",
        "matroid",
        "combinatorial-optimization",
        "exchange",
        "matching",
        "linear-algebra",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 120,
      "prerequisites": [
        "general-matching",
        "weighted-matching",
        "linear-basis-xor",
        "proof-and-invariants"
      ],
      "nextLessons": [
        "randomized-determinant",
        "sparse-linear-systems"
      ],
      "relatedLessons": [
        "linear-algebra-applications",
        "max-flow-min-cut",
        "proof-and-invariants"
      ],
      "pages": [
        {
          "pageId": "matroid-basics-and-exchange",
          "title": "Matroid Basics and Exchange",
          "description": "matroid 독립성 공리, greedy 정당성, exchange 사고를 정리합니다.",
          "order": 10,
          "file": "pages/matroid-basics-and-exchange.md"
        },
        {
          "pageId": "matroid-intersection",
          "title": "Matroid Intersection",
          "description": "두 matroid 독립성 조건을 동시에 만족하는 exchange graph reference입니다.",
          "order": 20,
          "file": "pages/matroid-intersection.md"
        },
        {
          "pageId": "matroid-union",
          "title": "Matroid Union",
          "description": "여러 matroid 독립 집합의 합과 layer exchange를 다루는 reference입니다.",
          "order": 30,
          "file": "pages/matroid-union.md"
        },
        {
          "pageId": "matroid-parity",
          "title": "Matroid Parity",
          "description": "pair 단위 선택과 matroid 독립성을 결합하는 reference입니다.",
          "order": 40,
          "file": "pages/matroid-parity.md"
        }
      ],
      "status": "published",
      "lessonType": "reference",
      "seriesId": "matroid-algorithms",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "research-reference",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "sparse-linear-systems",
      "title": "Sparse Linear Systems",
      "description": "대부분의 계수가 0인 큰 연립방정식에서 sparse row, matvec oracle, rank consistency를 구분해 풉니다.",
      "summary": "sparse matrix-vector product, rank/augmented rank 비교, fill-in 위험, black-box solver 선택 기준을 다루는 선형대수 심화 레슨",
      "order": 152,
      "folderId": "heuristic-reference",
      "tags": [
        "math",
        "linear-algebra",
        "sparse-matrix",
        "gaussian-elimination",
        "rank",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 60,
      "prerequisites": [
        "black-box-linear-algebra",
        "modular-arithmetic",
        "matrix-exponentiation"
      ],
      "nextLessons": [
        "linear-algebra-applications"
      ],
      "relatedLessons": [
        "polynomial-recurrence-algorithms",
        "summatory-number-theory"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling"
      ]
    },
    {
      "lessonId": "linear-algebra-applications",
      "title": "Linear Algebra Applications",
      "description": "rank, determinant, xor basis, sparse solver, recurrence, graph counting을 먼저 선택표로 구분한 뒤 vector space 모델로 번역하는 선형대수 모델링 허브입니다.",
      "summary": "GF(2) basis, dense/sparse linear system, determinant, matrix-tree, randomized identity test, recurrence 모델 중 무엇을 써야 하는지 고르는 선형대수 decision map",
      "order": 153,
      "folderId": "heuristic-reference",
      "tags": [
        "math",
        "linear-algebra",
        "rank",
        "determinant",
        "modeling",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 70,
      "prerequisites": [
        "linear-basis-xor",
        "sparse-linear-systems",
        "black-box-linear-algebra"
      ],
      "nextLessons": [
        "randomized-determinant",
        "matrix-tree-theorem-applications"
      ],
      "relatedLessons": [
        "linear-basis-xor",
        "polynomial-recurrence-algorithms",
        "matroid-algorithms",
        "matrix-exponentiation"
      ],
      "pages": [],
      "status": "published",
      "lessonType": "overview",
      "seriesId": "linear-algebra-modeling",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "online-convex-optimization",
      "title": "Online Convex Optimization",
      "description": "regret minimization, projected gradient descent, mirror descent, dual averaging을 하나의 online optimization 흐름으로 정리합니다.",
      "summary": "online decision, regret, OGD, mirror descent, dual averaging, full-information/bandit feedback 구분을 다루는 온라인 최적화 허브",
      "order": 157,
      "folderId": "heuristic-reference",
      "tags": [
        "optimization",
        "online-learning",
        "convex",
        "regret",
        "mirror-descent",
        "dual-averaging",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 100,
      "prerequisites": [
        "convex-dp-optimization",
        "probability-expected-value"
      ],
      "nextLessons": [
        "probabilistic-decision-ai"
      ],
      "relatedLessons": [
        "parametric-optimization",
        "probabilistic-decision-ai",
        "convex-dp-optimization"
      ],
      "pages": [
        {
          "pageId": "online-decision-and-regret",
          "title": "Online Decision and Regret",
          "description": "온라인 의사결정의 regret 정의와 projected gradient descent 기본형입니다.",
          "order": 10,
          "file": "pages/online-decision-and-regret.md"
        },
        {
          "pageId": "mirror-descent-and-multiplicative-weights",
          "title": "Mirror Descent and Multiplicative Weights",
          "description": "simplex와 entropy regularizer에서 나오는 multiplicative weights update를 다룹니다.",
          "order": 20,
          "file": "pages/mirror-descent-and-multiplicative-weights.md"
        },
        {
          "pageId": "dual-averaging",
          "title": "Dual Averaging",
          "description": "누적 gradient와 regularizer로 다음 decision을 고르는 dual averaging 패턴입니다.",
          "order": 30,
          "file": "pages/dual-averaging.md"
        }
      ],
      "status": "published",
      "lessonType": "overview",
      "seriesId": "online-convex-optimization",
      "practiceStatus": "linked",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling",
        "selection"
      ]
    },
    {
      "lessonId": "randomized-determinant",
      "title": "Randomized Determinant",
      "description": "determinant polynomial에 무작위 값을 대입해 rank, matching 존재성, polynomial identity를 확률적으로 판정합니다.",
      "summary": "Schwartz-Zippel, random substitution, modular determinant, Tutte matrix 기반 존재성 판정을 다루는 선형대수 심화 레슨",
      "order": 162,
      "folderId": "heuristic-reference",
      "tags": [
        "math",
        "linear-algebra",
        "determinant",
        "randomized",
        "matching",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 60,
      "prerequisites": [
        "black-box-linear-algebra",
        "modular-arithmetic",
        "probability-expected-value"
      ],
      "nextLessons": [
        "matrix-tree-theorem-applications"
      ],
      "relatedLessons": [
        "general-matching",
        "linear-algebra-applications",
        "testing-and-stress"
      ],
      "pages": [],
      "lessonType": "implementation",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "matrix-tree-theorem-applications",
      "title": "Matrix-Tree Theorem Applications",
      "description": "Laplacian cofactor determinant로 spanning tree, rooted arborescence, edge 포함 조건을 계산합니다.",
      "summary": "무향/방향 Laplacian, cofactor determinant, contraction/deletion 기반 edge criticality를 연결하는 그래프 수학 레슨",
      "order": 163,
      "folderId": "heuristic-reference",
      "tags": [
        "graph",
        "matrix-tree-theorem",
        "laplacian",
        "determinant",
        "spanning-tree",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 60,
      "prerequisites": [
        "graph-tree-basics",
        "modular-arithmetic",
        "randomized-determinant"
      ],
      "nextLessons": [],
      "relatedLessons": [
        "linear-algebra-applications",
        "sparse-linear-systems",
        "proof-and-invariants"
      ],
      "pages": [],
      "lessonType": "overview",
      "practiceStatus": "todo",
      "implementationStatus": "partial",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "implementation",
        "proof",
        "modeling"
      ]
    },
    {
      "lessonId": "planar-graph-duality",
      "title": "Planar Graph Duality",
      "description": "평면 그래프의 half-edge face traversal, dual graph 구성, cut-cycle duality, planar min-cut 변환을 정리합니다.",
      "summary": "planar embedding, half-edge traversal, outer face, dual edge construction, cut-cycle 대응, planar min-cut과 dual shortest path를 연결하는 그래프/기하 심화 허브",
      "order": 168,
      "folderId": "heuristic-reference",
      "tags": [
        "graph",
        "planar-graph",
        "duality",
        "half-edge",
        "face-graph",
        "min-cut",
        "practice"
      ],
      "level": "advanced",
      "estimatedMinutes": 105,
      "prerequisites": [
        "graph-tree-basics",
        "max-flow-min-cut",
        "geometry-ccw-segment-intersection"
      ],
      "nextLessons": [],
      "relatedLessons": [
        "sweep-line-geometry",
        "matrix-tree-theorem-applications",
        "graph-cut-structures"
      ],
      "pages": [
        {
          "pageId": "half-edge-and-face-traversal",
          "title": "Face 순회와 Dual Graph 구성",
          "description": "Half-edge로 face를 찾고 그 결과를 dual graph의 정점과 간선으로 연결합니다.",
          "order": 10,
          "file": "pages/half-edge-and-face-traversal.md"
        },
        {
          "pageId": "cut-cycle-duality",
          "title": "Cut-Cycle Duality",
          "description": "Primal cut-cycle 대응과 dual 최단 경로로 바꿀 수 있는 경계·방향 조건을 함께 확인합니다.",
          "order": 30,
          "file": "pages/cut-cycle-duality.md"
        }
      ],
      "status": "published",
      "lessonType": "overview",
      "seriesId": "planar-embedding-duality",
      "practiceStatus": "linked",
      "implementationStatus": "concept-only",
      "audience": "advanced-contest",
      "difficultyAxes": [
        "proof",
        "modeling",
        "selection"
      ]
    }
  ]
}
