diff --git a/package.json b/package.json index 280f08bb7..ce161d586 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "flowbite": "2.5.2", "lucia": "2.7.7", "lucide-svelte": "^0.515.0", + "p-queue": "^8.1.0", "playwright": "1.53.0", "pnpm": "10.12.1", "prisma-erd-generator": "2.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0d35475a2..36a7c91e4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,6 +50,9 @@ importers: lucide-svelte: specifier: ^0.515.0 version: 0.515.0(svelte@5.34.3) + p-queue: + specifier: ^8.1.0 + version: 8.1.0 playwright: specifier: 1.53.0 version: 1.53.0 @@ -3603,6 +3606,14 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + p-queue@8.1.0: + resolution: {integrity: sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==} + engines: {node: '>=18'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -8405,6 +8416,13 @@ snapshots: dependencies: p-limit: 3.1.0 + p-queue@8.1.0: + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.4 + + p-timeout@6.1.4: {} + package-json-from-dist@1.0.1: {} package-manager-detector@1.3.0: {} diff --git a/prisma/seed.ts b/prisma/seed.ts index f265065ac..e3f7d1a54 100755 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -1,5 +1,10 @@ -// // See: -// // https://www.prisma.io/docs/getting-started/quickstart +/** + * This script seeds the database with initial data. + * Run this script using `pnpm db:seed`. + */ + +// See: +// https://www.prisma.io/docs/getting-started/quickstart import { PrismaClient } from '@prisma/client'; import { initialize, @@ -10,13 +15,16 @@ import { defineTaskTagFactory, defineTaskAnswerFactory, defineSubmissionStatusFactory, + defineWorkBookFactory, } from './.fabbrica'; +import PQueue from 'p-queue'; import { generateLuciaPasswordHash } from 'lucia/utils'; import { classifyContest } from '../src/lib/utils/contest'; -import { users } from './users'; +import { users, USER_PASSWORD_FOR_SEED } from './users'; import { tasks } from './tasks'; +import { workbooks } from './workbooks'; import { tags } from './tags'; import { task_tags } from './task_tags'; import { answers } from './answers'; @@ -26,38 +34,72 @@ import { submission_statuses } from './submission_statuses'; const prisma = new PrismaClient(); initialize({ prisma }); +// Queue concurrency configuration +// Adjust these values based on your database connection limits and performance requirements +// Can be overridden via environment variables (e.g., SEED_USERS_CONCURRENCY=4) +const QUEUE_CONCURRENCY = { + users: Number(process.env.SEED_USERS_CONCURRENCY) || 2, // User creation with password hashing (CPU intensive) + tasks: Number(process.env.SEED_TASKS_CONCURRENCY) || 3, // Task creation (lightweight) + tags: Number(process.env.SEED_TAGS_CONCURRENCY) || 2, // Tag creation (lightweight) + taskTags: Number(process.env.SEED_TASK_TAGS_CONCURRENCY) || 2, // TaskTag relations (multiple validations) + submissionStatuses: Number(process.env.SEED_SUBMISSION_STATUSES_CONCURRENCY) || 2, // SubmissionStatus creation (lightweight) + answers: Number(process.env.SEED_ANSWERS_CONCURRENCY) || 2, // Answer creation (multiple validations) +} as const; + // See: // https://github.com/TeemuKoivisto/sveltekit-monorepo-template/blob/main/packages/db/prisma/seed.ts // https://lucia-auth.com/basics/keys/#password-hashing // https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#findunique +// https://github.com/sindresorhus/p-queue async function main() { - addUsers(); - addTasks(); - addTags(); - addTaskTags(); - addSubmissionStatuses(); - addAnswers(); + try { + console.log('Seeding has been started.'); + + await addUsers(); + await addTasks(); + await addWorkBooks(); + await addTags(); + await addTaskTags(); + await addSubmissionStatuses(); + await addAnswers(); + + console.log('Seeding has been completed.'); + } catch (e) { + console.error('Failed to seed:', e); + throw e; + } } -function addUsers() { +async function addUsers() { + console.log('Start adding users...'); + const userFactory = defineUserFactory(); const keyFactory = defineKeyFactory({ defaultData: { user: userFactory } }); - users.map(async (user) => { - const password = 'Ch0kuda1'; - const registeredUser = await prisma.user.findUnique({ - where: { - username: user.name, - }, + // Create a queue with limited concurrency for user operations + const userQueue = new PQueue({ concurrency: QUEUE_CONCURRENCY.users }); + + for (const user of users) { + userQueue.add(async () => { + try { + const registeredUser = await prisma.user.findUnique({ + where: { + username: user.name, + }, + }); + + if (!registeredUser) { + await addUser(user, USER_PASSWORD_FOR_SEED, userFactory, keyFactory); + console.log('username:', user.name, 'was registered.'); + } + } catch (e) { + console.error('Failed to add user', user.name, e); + } }); + } - if (!registeredUser) { - await addUser(user, password, userFactory, keyFactory); - console.log('username:', user.name, 'was registered.'); - } else { - console.log('username:', user.name, 'has already registered.'); - } - }); + await userQueue.onIdle(); // Wait for all users to complete + console.log('Finished adding users.'); } // See: @@ -77,158 +119,239 @@ async function addUser(user, password: string, userFactory, keyFactory) { }); } -function addTasks() { +async function addTasks() { + console.log('Start adding tasks...'); + const taskFactory = defineTaskFactory(); - tasks.map(async (task) => { - const registeredTask = await prisma.task.findMany({ - where: { - task_id: task.id, - }, - }); - const registeredTaskTag = await prisma.taskTag.findMany({ - where: { - task_id: task.id, - }, + // Create a queue with limited concurrency for database operations + const taskQueue = new PQueue({ concurrency: QUEUE_CONCURRENCY.tasks }); + + for (const task of tasks) { + taskQueue.add(async () => { + try { + const registeredTask = await prisma.task.findUnique({ + where: { + task_id: task.id, + }, + }); + + if (!registeredTask) { + await addTask(task, taskFactory); + console.log('task id:', task.id, 'was registered.'); + } + } catch (e) { + console.error('Failed to add task', task.id, e); + } }); + } - if (registeredTask.length === 0) { - console.log('task id:', task.id, 'was registered.'); - await addTask(task, taskFactory, registeredTaskTag.length !== 0); - } else { - //console.log('task id:', task.id, 'has already been registered.'); - } + await taskQueue.onIdle(); // Wait for all tasks to complete + console.log('Finished adding tasks.'); +} + +async function addTask(task, taskFactory) { + // Note: Task-Tag relationships are handled separately via TaskTag table + await taskFactory.create({ + contest_type: classifyContest(task.contest_id), + contest_id: task.contest_id, + task_table_index: task.problem_index, + task_id: task.id, + title: task.title, + grade: task.grade, }); } -async function addTask(task, taskFactory, isHavingTaskTag) { - if (isHavingTaskTag) { - await taskFactory.create({ - contest_type: classifyContest(task.contest_id), - contest_id: task.contest_id, - task_table_index: task.problem_index, - task_id: task.id, - title: task.title, - grade: task.grade, - tags: { - create: [ - { - tag: { - connect: { task_id: task.task_id }, - }, +async function addWorkBooks() { + console.log('Start adding workbooks...'); + + const workBookFactory = defineWorkBookFactory({ defaultData: { user: defineUserFactory() } }); + + // Note: Use a for loop to ensure each workbook is processed sequentially. + for (const workbook of workbooks) { + try { + const author = await prisma.user.findUnique({ + where: { + id: workbook.authorId, + }, + }); + + const normalizedUrlSlug = normalizeUrlSlug(workbook.urlSlug); + // Validate for existing workbook using appropriate criteria + let registeredWorkBook; + + if (normalizedUrlSlug) { + // If urlSlug exists, check by urlSlug + registeredWorkBook = await prisma.workBook.findUnique({ + where: { + urlSlug: normalizedUrlSlug, }, - ], - }, - }); - } else { - await taskFactory.create({ - contest_type: classifyContest(task.contest_id), - contest_id: task.contest_id, - task_table_index: task.problem_index, - task_id: task.id, - title: task.title, - grade: task.grade, - }); + }); + } else { + // If no urlSlug, check by title and authorId to avoid duplicates + registeredWorkBook = await prisma.workBook.findFirst({ + where: { + title: workbook.title, + authorId: workbook.authorId, + }, + }); + } + + if (!author) { + console.warn('Not found author id: ', workbook.authorId, '.'); + } else if (registeredWorkBook) { + if (normalizedUrlSlug) { + console.warn('Url slug ', workbook.urlSlug, ' has already been registered.'); + } else { + console.warn( + 'Workbook title "', + workbook.title, + '" by author', + workbook.authorId, + 'has already been registered.', + ); + } + } else { + await addWorkBook(workbook, workBookFactory); + console.log('workbook title:', workbook.title, 'was registered.'); + } + } catch (e) { + console.error('Failed to add workbook', workbook.title, e); + } } + + console.log('Finished adding workbooks.'); +} + +async function addWorkBook(workbook, workBookFactory) { + const urlSlug = normalizeUrlSlug(workbook.urlSlug); + + await workBookFactory.create({ + user: { + connect: { id: workbook.authorId }, + }, + title: workbook.title, + description: workbook.description, + editorialUrl: workbook.editorialUrl, + isPublished: workbook.isPublished, + isOfficial: workbook.isOfficial, + isReplenished: workbook.isReplenished, + workBookType: workbook.workBookType, + urlSlug: urlSlug, + workBookTasks: { + create: workbook.workBookTasks, + }, + }); +} + +/** + * Normalizes a URL slug by converting empty strings and null values to undefined. + * + * @param urlSlug - The URL slug to normalize. Can be a string, null, or undefined. + * @returns The normalized URL slug as a string if it has content, otherwise undefined. + * + * @example + * ```typescript + * normalizeUrlSlug("union-find") // returns "union-find" + * normalizeUrlSlug("") // returns undefined + * normalizeUrlSlug(null) // returns undefined + * normalizeUrlSlug(undefined) // returns undefined + * ``` + */ +function normalizeUrlSlug(urlSlug: string | null | undefined): string | undefined { + return urlSlug && urlSlug.trim() !== '' ? urlSlug.trim().toLowerCase() : undefined; } async function addTags() { + console.log('Start adding tags...'); + const tagFactory = defineTagFactory(); - tags.map(async (tag) => { - const registeredTag = await prisma.tag.findMany({ - where: { - id: tag.id, - }, - }); + // Create a queue with limited concurrency for tag operations + const tagQueue = new PQueue({ concurrency: QUEUE_CONCURRENCY.tags }); - const registeredTaskTag = await prisma.taskTag.findMany({ - where: { - tag_id: tag.id, - }, + for (const tag of tags) { + tagQueue.add(async () => { + try { + const registeredTag = await prisma.tag.findUnique({ + where: { + id: tag.id, + }, + }); + + if (!registeredTag) { + await addTag(tag, tagFactory); + console.log('tag id:', tag.id, 'was registered.'); + } + } catch (e) { + console.error('Failed to add tag', tag.id, e); + } }); + } - if (registeredTag.length === 0) { - console.log('tag id:', tag.id, 'was registered.'); - await addTag(tag, tagFactory, registeredTaskTag.length !== 0); - } else { - //console.log('tag id:', tag.id, 'has already been registered.'); - } - }); + await tagQueue.onIdle(); // Wait for all tags to complete + console.log('Finished adding tags.'); } -async function addTag(tag, tagFactory, isHavingTaskTag) { - if (isHavingTaskTag) { - await tagFactory.create({ - id: tag.id, - name: tag.name, - is_official: tag.is_official, - is_published: tag.is_published, - tasks: { - create: [ - { - task: { - connect: { tag_id: tag.id }, - }, - }, - ], - }, - }); - } else { - await tagFactory.create({ - id: tag.id, - name: tag.name, - is_official: tag.is_official, - is_published: tag.is_published, - }); - } +async function addTag(tag, tagFactory) { + // Note: Tags and Tasks are connected via the TaskTag relationship table + // which is handled separately in addTaskTags() + await tagFactory.create({ + id: tag.id, + name: tag.name, + is_official: tag.is_official, + is_published: tag.is_published, + }); } async function addTaskTags() { + console.log('Start adding task tags...'); + const taskFactory = defineTaskFactory(); const tagFactory = defineTagFactory(); const taskTagFactory = defineTaskTagFactory({ defaultData: { task: taskFactory, tag: tagFactory }, }); - task_tags.map(async (task_tag) => { - const registeredTaskTag = await prisma.taskTag.findMany({ - where: { - AND: [{ task_id: task_tag.task_id }, { tag_id: task_tag.tag_id }], - }, - }); - - const registeredTask = await prisma.task.findMany({ - where: { - task_id: task_tag.task_id, - }, - }); - - const registeredTag = await prisma.tag.findMany({ - where: { - id: task_tag.tag_id, - }, + // Create a queue with limited concurrency for task tag operations + const taskTagQueue = new PQueue({ concurrency: QUEUE_CONCURRENCY.taskTags }); + + for (const task_tag of task_tags) { + taskTagQueue.add(async () => { + try { + const [registeredTaskTag, registeredTask, registeredTag] = await Promise.all([ + prisma.taskTag.findUnique({ + where: { + task_id_tag_id: { + task_id: task_tag.task_id, + tag_id: task_tag.tag_id, + }, + }, + }), + prisma.task.findUnique({ + where: { + task_id: task_tag.task_id, + }, + }), + prisma.tag.findUnique({ + where: { + id: task_tag.tag_id, + }, + }), + ]); + + if (!registeredTaskTag && registeredTag && registeredTask) { + await addTaskTag(task_tag, taskTagFactory); + console.log('tag id:', task_tag.tag_id, 'task_id:', task_tag.task_id, 'was registered.'); + } + } catch (e) { + console.error('Failed to add task tag', task_tag, e); + } }); + } - if ( - registeredTaskTag.length === 0 && - registeredTag.length === 1 && - registeredTask.length === 1 - ) { - console.log('tag id:', task_tag.tag_id, 'task_id:', task_tag.task_id, 'was registered.'); - await addTaskTag(task_tag, taskTagFactory); - } else if (registeredTaskTag.length !== 0) { - //console.log( - // 'tag id:', - // task_tag.tag_id, - // 'task id:', - // task_tag.task_id, - // 'has already been registered.', - //); - } else if (registeredTag.length !== 1 || registeredTask.length !== 1) { - //console.log('tag id:', task_tag.tag_id, ' or task id:', task_tag.task_id, 'is missing.'); - } - }); + await taskTagQueue.onIdle(); // Wait for all task tags to complete + console.log('Finished adding task tags.'); } async function addTaskTag(task_tag, taskTagFactory) { await taskTagFactory.create({ @@ -243,24 +366,36 @@ async function addTaskTag(task_tag, taskTagFactory) { }); } -//insert data to submission_status table +// Add data to submission_status table async function addSubmissionStatuses() { + console.log('Start adding submission statuses...'); + const submissionStatusFactory = defineSubmissionStatusFactory(); - submission_statuses.map(async (submission_status) => { - const registeredSubmissionStatus = await prisma.submissionStatus.findMany({ - where: { - id: submission_status.id, - }, + // Create a queue with limited concurrency for submission status operations + const submissionStatusQueue = new PQueue({ concurrency: QUEUE_CONCURRENCY.submissionStatuses }); + + for (const submission_status of submission_statuses) { + submissionStatusQueue.add(async () => { + try { + const registeredSubmissionStatus = await prisma.submissionStatus.findUnique({ + where: { + id: submission_status.id, + }, + }); + + if (!registeredSubmissionStatus) { + await addSubmissionStatus(submission_status, submissionStatusFactory); + console.log('submission_status id:', submission_status.id, 'was registered.'); + } + } catch (e) { + console.error('Failed to add submission status', submission_status.id, e); + } }); + } - if (registeredSubmissionStatus.length === 0) { - console.log('submission_status id:', submission_status.id, 'was registered.'); - await addSubmissionStatus(submission_status, submissionStatusFactory); - } else { - //console.log('tag id:', tag.id, 'has already been registered.'); - } - }); + await submissionStatusQueue.onIdle(); // Wait for all submission statuses to complete + console.log('Finished adding submission statuses.'); } async function addSubmissionStatus(submission_status, submissionStatusFactory) { @@ -274,47 +409,63 @@ async function addSubmissionStatus(submission_status, submissionStatusFactory) { }); } -//insert data to answer table +// Add data to answer table async function addAnswers() { - const answerFactory = defineTaskAnswerFactory(); + console.log('Start adding answers...'); - answers.map(async (answer) => { - const registeredAnswer = await prisma.taskAnswer.findMany({ - where: { - id: answer.id, - }, - }); + const answerFactory = defineTaskAnswerFactory(); - const registeredUser = await prisma.user.findMany({ - where: { - id: answer.user_id, - }, + // Create a queue with limited concurrency for answer operations + const answerQueue = new PQueue({ concurrency: QUEUE_CONCURRENCY.answers }); + + for (const answer of answers) { + answerQueue.add(async () => { + try { + const [registeredAnswer, registeredUser] = await Promise.all([ + prisma.taskAnswer.findUnique({ + where: { + task_id_user_id: { + task_id: answer.task_id, + user_id: answer.user_id, + }, + }, + }), + prisma.user.findUnique({ + where: { + id: answer.user_id, + }, + }), + ]); + + if (!registeredAnswer && registeredUser) { + await addAnswer(answer, answerFactory); + console.log('answer id:', answer.id, 'was registered.'); + } else { + console.warn( + 'answer exists:', + !!registeredAnswer, + 'user exists:', + !!registeredUser, + answer.id, + 'was not registered.', + ); + } + } catch (e) { + console.error('Failed to add answer', answer.id, e); + } }); + } - if (registeredAnswer.length === 0 && registeredUser.length === 1) { - console.log('answer id:', answer.id, 'was registered.'); - await addAnswer(answer, answerFactory); - } else { - console.log( - 'answer len:', - registeredAnswer.length, - 'user len:', - registeredUser.length, - answer.id, - 'was not registered.', - ); - } - }); + await answerQueue.onIdle(); // Wait for all answers to complete + console.log('Finished adding answers.'); } async function addAnswer(answer, taskAnswerFactory) { await taskAnswerFactory.create({ id: answer.id, - //task_id: answer.task_id, task: { connect: { task_id: answer.task_id }, }, - //username: answer.username, user: { connect: { id: answer.user_id }, }, diff --git a/prisma/tasks.ts b/prisma/tasks.ts index 2d3cf37d8..a72761eec 100755 --- a/prisma/tasks.ts +++ b/prisma/tasks.ts @@ -2,1775 +2,4024 @@ // https://kenkoooo.com/atcoder/resources/problems.json export const tasks = [ { - id: 'abc231_a', - contest_id: 'abc231', - problem_index: 'A', - name: 'Water Pressure', - title: 'A. Water Pressure', - grade: 'PENDING', + id: 'APG4bPython_co', + contest_id: 'APG4bPython', + problem_index: 'EX8', + name: 'たくさんのA足すB問題', + title: 'EX8. たくさんのA足すB問題', + grade: 'Q8', }, { - id: 'abc214_a', - contest_id: 'abc214', - problem_index: 'A', - name: 'New Generation ABC', - title: 'A. New Generation ABC', - grade: 'PENDING', + id: 'abc408_g', + contest_id: 'abc408', + problem_index: 'G', + name: 'A/B < p/q < C/D', + title: 'G. A/B < p/q < C/D', + grade: 'D3', }, { - id: 'abc202_a', - contest_id: 'abc202', - problem_index: 'A', - name: 'Three Dice', - title: 'A. Three Dice', - grade: 'PENDING', + id: 'abc408_f', + contest_id: 'abc408', + problem_index: 'F', + name: 'Athletic', + title: 'F. Athletic', + grade: 'D2', }, { - id: 'abc331_a', - contest_id: 'abc331', - problem_index: 'A', - name: 'Tomorrow', - title: 'A. Tomorrow', - grade: 'PENDING', + id: 'abc408_e', + contest_id: 'abc408', + problem_index: 'E', + name: 'Minimum OR Path', + title: 'E. Minimum OR Path', + grade: 'D1', }, { - id: 'abc331_b', - contest_id: 'abc331', - problem_index: 'B', - name: 'Buy One Carton of Milk', - title: 'B. Buy One Carton of Milk', - grade: 'PENDING', + id: 'abc408_d', + contest_id: 'abc408', + problem_index: 'D', + name: 'Flip to Gather', + title: 'D. Flip to Gather', + grade: 'Q1', }, { - id: 'abc331_c', - contest_id: 'abc331', + id: 'abc408_c', + contest_id: 'abc408', problem_index: 'C', - name: 'Sum of Numbers Greater Than Me', - title: 'C. Sum of Numbers Greater Than Me', - grade: 'PENDING', - }, - { - id: 'abc331_d', - contest_id: 'abc331', - problem_index: 'D', - name: 'Tile Pattern', - title: 'D. Tile Pattern', - grade: 'PENDING', + name: 'Not All Covered', + title: 'C. Not All Covered', + grade: 'Q3', }, { - id: 'abc331_e', - contest_id: 'abc331', - problem_index: 'E', - name: 'Set Meal', - title: 'E. Set Meal', - grade: 'PENDING', + id: 'abc408_b', + contest_id: 'abc408', + problem_index: 'B', + name: 'Compression', + title: 'B. Compression', + grade: 'Q6', }, { - id: 'abc331_f', - contest_id: 'abc331', - problem_index: 'F', - name: 'Palindrome Query', - title: 'F. Palindrome Query', - grade: 'PENDING', + id: 'abc408_a', + contest_id: 'abc408', + problem_index: 'A', + name: 'Timeout', + title: 'A. Timeout', + grade: 'Q7', }, { - id: 'abc331_g', - contest_id: 'abc331', + id: 'abc407_g', + contest_id: 'abc407', problem_index: 'G', - name: 'Collect Them All', - title: 'G. Collect Them All', + name: 'Domino Covering SUM', + title: 'G. Domino Covering SUM', + grade: 'D3', }, { - id: 'abc311_b', - contest_id: 'abc311', - problem_index: 'B', - name: 'Vacation Together', - title: 'B. Vacation Together', - grade: 'PENDING', + id: 'abc407_f', + contest_id: 'abc407', + problem_index: 'F', + name: 'Sums of Sliding Window Maximum', + title: 'F. Sums of Sliding Window Maximum', + grade: 'D2', }, { - id: 'abc311_c', - contest_id: 'abc311', - problem_index: 'C', - name: 'Find it!', - title: 'C. Find it!', - grade: 'PENDING', + id: 'abc407_e', + contest_id: 'abc407', + problem_index: 'E', + name: 'Most Valuable Parentheses', + title: 'E. Most Valuable Parentheses', + grade: 'D1', }, { - id: 'abc311_d', - contest_id: 'abc311', + id: 'abc407_d', + contest_id: 'abc407', problem_index: 'D', - name: 'Grid Ice Floor', - title: 'D. Grid Ice Floor', - grade: 'PENDING', - }, - { - id: 'abc311_e', - contest_id: 'abc311', - problem_index: 'E', - name: 'Defect-free Squares', - title: 'E. Defect-free Squares', + name: 'Domino Covering XOR', + title: 'D. Domino Covering XOR', + grade: 'Q1', }, { - id: 'abc311_f', - contest_id: 'abc311', - problem_index: 'F', - name: 'Yet Another Grid Task', - title: 'F. Yet Another Grid Task', - grade: 'PENDING', + id: 'abc407_c', + contest_id: 'abc407', + problem_index: 'C', + name: 'Security 2', + title: 'C. Security 2', + grade: 'Q3', }, { - id: 'abc311_g', - contest_id: 'abc311', - problem_index: 'G', - name: 'One More Grid Task', - title: 'G. One More Grid Task', - grade: 'PENDING', + id: 'abc407_b', + contest_id: 'abc407', + problem_index: 'B', + name: 'P(X or Y)', + title: 'B. P(X or Y)', + grade: 'Q6', }, { - id: 'abc311_h', - contest_id: 'abc311', - problem_index: 'Ex', - name: 'Many Illumination Plans', - title: 'Ex. Many Illumination Plans', - grade: 'PENDING', + id: 'abc407_a', + contest_id: 'abc407', + problem_index: 'A', + name: 'Approximation', + title: 'A. Approximation', + grade: 'Q7', }, { - id: 'abc329_g', - contest_id: 'abc329', + id: 'abc406_g', + contest_id: 'abc406', problem_index: 'G', - name: 'Delivery on Tree', - title: 'G. Delivery on Tree', + name: 'Travelling Salesman Problem', + title: 'G. Travelling Salesman Problem', grade: 'D5', }, { - id: 'abc329_f', - contest_id: 'abc329', + id: 'abc406_f', + contest_id: 'abc406', problem_index: 'F', - name: 'Colored Ball', - title: 'F. Colored Ball', - grade: 'Q1', + name: 'Compare Tree Weights', + title: 'F. Compare Tree Weights', + grade: 'D1', }, { - id: 'abc329_e', - contest_id: 'abc329', + id: 'abc406_e', + contest_id: 'abc406', problem_index: 'E', - name: 'Stamp', - title: 'E. Stamp', + name: 'Popcount Sum 3', + title: 'E. Popcount Sum 3', grade: 'D1', }, { - id: 'abc329_d', - contest_id: 'abc329', + id: 'abc406_d', + contest_id: 'abc406', problem_index: 'D', - name: 'Election Quick Report', - title: 'D. Election Quick Report', - grade: 'Q4', + name: 'Garbage Removal', + title: 'D. Garbage Removal', + grade: 'Q1', }, { - id: 'abc329_c', - contest_id: 'abc329', + id: 'abc406_c', + contest_id: 'abc406', problem_index: 'C', - name: 'Count xxx', - title: 'C. Count xxx', - grade: 'Q5', + name: '~', + title: 'C. ~', + grade: 'Q2', }, { - id: 'abc329_b', - contest_id: 'abc329', + id: 'abc406_b', + contest_id: 'abc406', problem_index: 'B', - name: 'Next', - title: 'B. Next', - grade: 'Q7', + name: 'Product Calculator', + title: 'B. Product Calculator', + grade: 'Q5', }, { - id: 'abc329_a', - contest_id: 'abc329', + id: 'abc406_a', + contest_id: 'abc406', problem_index: 'A', - name: 'Spread', - title: 'A. Spread', + name: 'Not Acceptable', + title: 'A. Not Acceptable', grade: 'Q8', }, { - id: 'abc328_g', - contest_id: 'abc328', + id: 'abc405_g', + contest_id: 'abc405', problem_index: 'G', - name: 'Cut and Reorder', - title: 'G. Cut and Reorder', - grade: 'D3', + name: 'Range Shuffle Query', + title: 'G. Range Shuffle Query', + grade: 'D4', }, { - id: 'abc328_f', - contest_id: 'abc328', + id: 'abc405_f', + contest_id: 'abc405', problem_index: 'F', - name: 'Good Set Query', - title: 'F. Good Set Query', + name: 'Chord Crossing', + title: 'F. Chord Crossing', grade: 'D1', }, { - id: 'abc328_e', - contest_id: 'abc328', + id: 'abc405_e', + contest_id: 'abc405', problem_index: 'E', - name: 'Modulo MST', - title: 'E. Modulo MST', - grade: 'Q1', + name: 'Fruit Lineup', + title: 'E. Fruit Lineup', + grade: 'D1', }, { - id: 'abc328_d', - contest_id: 'abc328', + id: 'abc405_d', + contest_id: 'abc405', problem_index: 'D', - name: 'Take ABC', - title: 'D. Take ABC', - grade: 'Q3', + name: 'Escape Route', + title: 'D. Escape Route', + grade: 'Q2', }, { - id: 'abc328_c', - contest_id: 'abc328', + id: 'abc405_c', + contest_id: 'abc405', problem_index: 'C', - name: 'Consecutive', - title: 'C. Consecutive', + name: 'Sum of Product', + title: 'C. Sum of Product', grade: 'Q4', }, { - id: 'abc328_b', - contest_id: 'abc328', + id: 'abc405_b', + contest_id: 'abc405', problem_index: 'B', - name: '11/11', - title: 'B. 11/11', + name: 'Not All', + title: 'B. Not All', grade: 'Q6', }, { - id: 'abc328_a', - contest_id: 'abc328', + id: 'abc405_a', + contest_id: 'abc405', problem_index: 'A', - name: 'Not Too Hard', - title: 'A. Not Too Hard', - grade: 'Q8', + name: 'Is it rated?', + title: 'A. Is it rated?', + grade: 'Q7', }, { - id: 'abc327_g', - contest_id: 'abc327', + id: 'abc404_g', + contest_id: 'abc404', problem_index: 'G', - name: 'Many Good Tuple Problems', - title: 'G. Many Good Tuple Problems', - grade: 'D5', + name: 'Specified Range Sums', + title: 'G. Specified Range Sums', + grade: 'D2', }, { - id: 'abc327_f', - contest_id: 'abc327', + id: 'abc404_f', + contest_id: 'abc404', problem_index: 'F', - name: 'Apples', - title: 'F. Apples', - grade: 'D2', + name: 'Lost and Pound', + title: 'F. Lost and Pound', + grade: 'D3', }, { - id: 'abc327_e', - contest_id: 'abc327', + id: 'abc404_e', + contest_id: 'abc404', problem_index: 'E', - name: 'Maximize Rating', - title: 'E. Maximize Rating', - grade: 'D1', + name: 'Bowls and Beans', + title: 'E. Bowls and Beans', + grade: 'Q1', }, { - id: 'abc327_d', - contest_id: 'abc327', + id: 'abc404_d', + contest_id: 'abc404', problem_index: 'D', - name: 'Good Tuple Problem', - title: 'D. Good Tuple Problem', + name: "Goin' to the Zoo", + title: "D. Goin' to the Zoo", grade: 'Q2', }, { - id: 'abc327_c', - contest_id: 'abc327', + id: 'abc404_c', + contest_id: 'abc404', problem_index: 'C', - name: 'Number Place', - title: 'C. Number Place', - grade: 'Q5', + name: 'Cycle Graph?', + title: 'C. Cycle Graph?', + grade: 'Q4', }, { - id: 'abc327_b', - contest_id: 'abc327', + id: 'abc404_b', + contest_id: 'abc404', problem_index: 'B', - name: 'A^A', - title: 'B. A^A', - grade: 'Q6', + name: 'Grid Rotation', + title: 'B. Grid Rotation', + grade: 'Q5', }, { - id: 'abc327_a', - contest_id: 'abc327', + id: 'abc404_a', + contest_id: 'abc404', problem_index: 'A', - name: 'ab', - title: 'A. ab', - grade: 'Q7', + name: 'Not Found', + title: 'A. Not Found', + grade: 'Q6', }, { - id: 'abc326_g', - contest_id: 'abc326', + id: 'abc403_g', + contest_id: 'abc403', problem_index: 'G', - name: 'Unlock Achievement', - title: 'G. Unlock Achievement', - grade: 'D4', + name: 'Odd Position Sum Query', + title: 'G. Odd Position Sum Query', + grade: 'D3', }, { - id: 'abc326_f', - contest_id: 'abc326', + id: 'abc403_f', + contest_id: 'abc403', problem_index: 'F', - name: 'Robot Rotation', - title: 'F. Robot Rotation', + name: 'Shortest One Formula', + title: 'F. Shortest One Formula', grade: 'D2', }, { - id: 'abc326_e', - contest_id: 'abc326', + id: 'abc403_e', + contest_id: 'abc403', problem_index: 'E', - name: 'Revenge of "The Salary of AtCoder Inc."', - title: 'E. Revenge of "The Salary of AtCoder Inc."', + name: 'Forbidden Prefix', + title: 'E. Forbidden Prefix', grade: 'D1', }, { - id: 'abc326_d', - contest_id: 'abc326', + id: 'abc403_d', + contest_id: 'abc403', problem_index: 'D', - name: 'ABC Puzzle', - title: 'D. ABC Puzzle', - grade: 'D1', + name: 'Forbidden Difference', + title: 'D. Forbidden Difference', + grade: 'Q1', }, { - id: 'abc326_c', - contest_id: 'abc326', + id: 'abc403_c', + contest_id: 'abc403', problem_index: 'C', - name: 'Peak', - title: 'C. Peak', - grade: 'Q4', + name: '403 Forbidden', + title: 'C. 403 Forbidden', + grade: 'Q3', }, { - id: 'abc326_b', - contest_id: 'abc326', + id: 'abc403_b', + contest_id: 'abc403', problem_index: 'B', - name: '326-like Numbers', - title: 'B. 326-like Numbers', - grade: 'Q7', + name: 'Four Hidden', + title: 'B. Four Hidden', + grade: 'Q6', }, { - id: 'abc326_a', - contest_id: 'abc326', + id: 'abc403_a', + contest_id: 'abc403', problem_index: 'A', - name: '2UP3DOWN', - title: 'A. 2UP3DOWN', + name: 'Odd Position Sum', + title: 'A. Odd Position Sum', grade: 'Q7', }, { - id: 'abc325_g', - contest_id: 'abc325', + id: 'abc402_g', + contest_id: 'abc402', problem_index: 'G', - name: 'offence', - title: 'G. offence', - grade: 'D3', + name: 'Sum of Prod of Mod of Linear', + title: 'G. Sum of Prod of Mod of Linear', + grade: 'D5', }, { - id: 'abc325_f', - contest_id: 'abc325', + id: 'abc402_f', + contest_id: 'abc402', problem_index: 'F', - name: 'Sensor Optimization Dilemma ', - title: 'F. Sensor Optimization Dilemma ', + name: 'Path to Integer', + title: 'F. Path to Integer', grade: 'D2', }, { - id: 'abc325_e', - contest_id: 'abc325', + id: 'abc402_e', + contest_id: 'abc402', problem_index: 'E', - name: 'Our clients, please wait a moment', - title: 'E. Our clients, please wait a moment', - grade: 'Q1', + name: 'Payment Required', + title: 'E. Payment Required', + grade: 'D1', }, { - id: 'abc325_d', - contest_id: 'abc325', + id: 'abc402_d', + contest_id: 'abc402', problem_index: 'D', - name: 'Printing Machine', - title: 'D. Printing Machine', - grade: 'D1', + name: 'Line Crossing', + title: 'D. Line Crossing', + grade: 'Q1', }, { - id: 'abc325_c', - contest_id: 'abc325', + id: 'abc402_c', + contest_id: 'abc402', problem_index: 'C', - name: 'Sensors', - title: 'C. Sensors', + name: 'Dislike Foods', + title: 'C. Dislike Foods', grade: 'Q3', }, { - id: 'abc325_b', - contest_id: 'abc325', + id: 'abc402_b', + contest_id: 'abc402', problem_index: 'B', - name: 'World Meeting', - title: 'B. World Meeting', + name: 'Restaurant Queue', + title: 'B. Restaurant Queue', grade: 'Q5', }, { - id: 'abc325_a', - contest_id: 'abc325', + id: 'abc402_a', + contest_id: 'abc402', problem_index: 'A', - name: 'Takahashi san', - title: 'A. Takahashi san', - grade: 'Q8', + name: 'CBC', + title: 'A. CBC', + grade: 'Q7', }, { - id: 'abc324_g', - contest_id: 'abc324', + id: 'abc401_g', + contest_id: 'abc401', problem_index: 'G', - name: 'Generate Arrays', - title: 'G. Generate Arrays', - grade: 'D4', + name: 'Push Simultaneously', + title: 'G. Push Simultaneously', + grade: 'D2', }, { - id: 'abc324_f', - contest_id: 'abc324', + id: 'abc401_f', + contest_id: 'abc401', problem_index: 'F', - name: 'Beautiful Path', - title: 'F. Beautiful Path', + name: 'Add One Edge 3', + title: 'F. Add One Edge 3', grade: 'D2', }, { - id: 'abc324_e', - contest_id: 'abc324', + id: 'abc401_e', + contest_id: 'abc401', problem_index: 'E', - name: 'Joint Two Strings', - title: 'E. Joint Two Strings', + name: 'Reachable Set', + title: 'E. Reachable Set', grade: 'Q1', }, { - id: 'abc324_d', - contest_id: 'abc324', + id: 'abc401_d', + contest_id: 'abc401', problem_index: 'D', - name: 'Square Permutation', - title: 'D. Square Permutation', - grade: 'Q2', + name: 'Logical Filling', + title: 'D. Logical Filling', + grade: 'D1', }, { - id: 'abc324_c', - contest_id: 'abc324', + id: 'abc401_c', + contest_id: 'abc401', problem_index: 'C', - name: 'Error Correction', - title: 'C. Error Correction', - grade: 'Q2', + name: 'K-bonacci', + title: 'C. K-bonacci', + grade: 'Q3', }, { - id: 'abc324_b', - contest_id: 'abc324', + id: 'abc401_b', + contest_id: 'abc401', problem_index: 'B', - name: '3-smooth Numbers', - title: 'B. 3-smooth Numbers', + name: 'Unauthorized', + title: 'B. Unauthorized', grade: 'Q6', }, { - id: 'abc324_a', - contest_id: 'abc324', + id: 'abc401_a', + contest_id: 'abc401', problem_index: 'A', - name: 'Same', - title: 'A. Same', - grade: 'Q7', + name: 'Status Code', + title: 'A. Status Code', + grade: 'Q8', }, { - id: 'abc323_g', - contest_id: 'abc323', + id: 'abc400_g', + contest_id: 'abc400', problem_index: 'G', - name: 'Inversion of Tree', - title: 'G. Inversion of Tree', + name: 'Patisserie ABC 3', + title: 'G. Patisserie ABC 3', grade: 'D5', }, { - id: 'abc323_f', - contest_id: 'abc323', + id: 'abc400_f', + contest_id: 'abc400', problem_index: 'F', - name: 'Push and Carry', - title: 'F. Push and Carry', - grade: 'D1', + name: 'Happy Birthday! 3', + title: 'F. Happy Birthday! 3', + grade: 'D3', }, { - id: 'abc323_e', - contest_id: 'abc323', + id: 'abc400_e', + contest_id: 'abc400', problem_index: 'E', - name: 'Playlist', - title: 'E. Playlist', + name: "Ringo's Favorite Numbers 3", + title: "E. Ringo's Favorite Numbers 3", grade: 'D1', }, { - id: 'abc323_d', - contest_id: 'abc323', + id: 'abc400_d', + contest_id: 'abc400', problem_index: 'D', - name: 'Merge Slimes', - title: 'D. Merge Slimes', - grade: 'Q2', + name: 'Takahashi the Wall Breaker', + title: 'D. Takahashi the Wall Breaker', + grade: 'Q1', }, { - id: 'abc323_c', - contest_id: 'abc323', + id: 'abc400_c', + contest_id: 'abc400', problem_index: 'C', - name: 'World Tour Finals', - title: 'C. World Tour Finals', - grade: 'Q4', + name: '2^a b^2', + title: 'C. 2^a b^2', + grade: 'Q1', }, { - id: 'abc323_b', - contest_id: 'abc323', + id: 'abc400_b', + contest_id: 'abc400', problem_index: 'B', - name: 'Round-Robin Tournament', - title: 'B. Round-Robin Tournament', + name: 'Sum of Geometric Series', + title: 'B. Sum of Geometric Series', grade: 'Q6', }, { - id: 'abc323_a', - contest_id: 'abc323', + id: 'abc400_a', + contest_id: 'abc400', problem_index: 'A', - name: 'Weak Beats', - title: 'A. Weak Beats', - grade: 'Q7', + name: 'ABC400 Party', + title: 'A. ABC400 Party', + grade: 'Q8', }, { - id: 'abc322_g', - contest_id: 'abc322', + id: 'abc399_g', + contest_id: 'abc399', problem_index: 'G', - name: 'Two Kinds of Base', - title: 'G. Two Kinds of Base', - grade: 'D4', + name: 'Colorful Spanning Tree', + title: 'G. Colorful Spanning Tree', + grade: 'D6', }, { - id: 'abc322_f', - contest_id: 'abc322', + id: 'abc399_f', + contest_id: 'abc399', problem_index: 'F', - name: 'Vacation Query', - title: 'F. Vacation Query', + name: 'Range Power Sum', + title: 'F. Range Power Sum', grade: 'D2', }, { - id: 'abc322_e', - contest_id: 'abc322', + id: 'abc399_e', + contest_id: 'abc399', problem_index: 'E', - name: 'Product Development', - title: 'E. Product Development', - grade: 'Q1', + name: 'Replace', + title: 'E. Replace', + grade: 'D3', }, { - id: 'abc322_d', - contest_id: 'abc322', + id: 'abc399_d', + contest_id: 'abc399', problem_index: 'D', - name: 'Polyomino', - title: 'D. Polyomino', + name: 'Switch Seats', + title: 'D. Switch Seats', grade: 'Q1', }, { - id: 'abc322_c', - contest_id: 'abc322', + id: 'abc399_c', + contest_id: 'abc399', problem_index: 'C', - name: 'Festival', - title: 'C. Festival', - grade: 'Q5', + name: 'Make it Forest', + title: 'C. Make it Forest', + grade: 'Q2', }, { - id: 'abc322_b', - contest_id: 'abc322', + id: 'abc399_b', + contest_id: 'abc399', problem_index: 'B', - name: 'Prefix and Suffix', - title: 'B. Prefix and Suffix', - grade: 'Q6', + name: 'Ranking with Ties', + title: 'B. Ranking with Ties', + grade: 'Q5', }, { - id: 'abc322_a', - contest_id: 'abc322', + id: 'abc399_a', + contest_id: 'abc399', problem_index: 'A', - name: 'First ABC 2', - title: 'A. First ABC 2', - grade: 'Q7', + name: 'Hamming Distance', + title: 'A. Hamming Distance', + grade: 'Q8', }, { - id: 'abc321_g', - contest_id: 'abc321', + id: 'abc398_g', + contest_id: 'abc398', problem_index: 'G', - name: 'Electric Circuit', - title: 'G. Electric Circuit', - grade: 'D4', + name: 'Not Only Tree Game', + title: 'G. Not Only Tree Game', + grade: 'D5', }, { - id: 'abc321_f', - contest_id: 'abc321', + id: 'abc398_f', + contest_id: 'abc398', problem_index: 'F', - name: '#(subset sum = K) with Add and Erase ', - title: 'F. #(subset sum = K) with Add and Erase ', - grade: 'D2', + name: 'ABCBA', + title: 'F. ABCBA', + grade: 'D1', }, { - id: 'abc321_e', - contest_id: 'abc321', + id: 'abc398_e', + contest_id: 'abc398', problem_index: 'E', - name: 'Complete Binary Tree', - title: 'E. Complete Binary Tree', - grade: 'D2', + name: 'Tree Game', + title: 'E. Tree Game', + grade: 'D1', }, { - id: 'abc321_d', - contest_id: 'abc321', + id: 'abc398_d', + contest_id: 'abc398', problem_index: 'D', - name: 'Set Menu', - title: 'D. Set Menu', - grade: 'Q2', + name: 'Bonfire', + title: 'D. Bonfire', + grade: 'Q1', }, { - id: 'abc321_c', - contest_id: 'abc321', + id: 'abc398_c', + contest_id: 'abc398', problem_index: 'C', - name: '321-like Searcher', - title: 'C. 321-like Searcher', - grade: 'Q2', + name: 'Uniqueness', + title: 'C. Uniqueness', + grade: 'Q4', }, { - id: 'abc321_b', - contest_id: 'abc321', + id: 'abc398_b', + contest_id: 'abc398', problem_index: 'B', - name: 'Cutoff', - title: 'B. Cutoff', - grade: 'Q4', + name: 'Full House 3', + title: 'B. Full House 3', + grade: 'Q5', }, { - id: 'abc321_a', - contest_id: 'abc321', + id: 'abc398_a', + contest_id: 'abc398', problem_index: 'A', - name: '321-like Checker', - title: 'A. 321-like Checker', + name: 'Doors in the Center', + title: 'A. Doors in the Center', grade: 'Q7', }, { - id: 'abc320_g', - contest_id: 'abc320', + id: 'abc397_g', + contest_id: 'abc397', problem_index: 'G', - name: 'Slot Strategy 2 (Hard)', - title: 'G. Slot Strategy 2 (Hard)', + name: 'Maximize Distance', + title: 'G. Maximize Distance', + grade: 'D5', }, { - id: 'abc320_f', - contest_id: 'abc320', + id: 'abc397_f', + contest_id: 'abc397', problem_index: 'F', - name: 'Fuel Round Trip', - title: 'F. Fuel Round Trip', + name: 'Variety Split Hard', + title: 'F. Variety Split Hard', + grade: 'D2', }, { - id: 'abc320_e', - contest_id: 'abc320', + id: 'abc397_e', + contest_id: 'abc397', problem_index: 'E', - name: 'Somen Nagashi', - title: 'E. Somen Nagashi', + name: 'Path Decomposition of a Tree', + title: 'E. Path Decomposition of a Tree', + grade: 'D1', }, { - id: 'abc320_d', - contest_id: 'abc320', + id: 'abc397_d', + contest_id: 'abc397', problem_index: 'D', - name: 'Relative Position', - title: 'D. Relative Position', + name: 'Cubes', + title: 'D. Cubes', + grade: 'D1', }, { - id: 'abc320_c', - contest_id: 'abc320', + id: 'abc397_c', + contest_id: 'abc397', problem_index: 'C', - name: 'Slot Strategy 2 (Easy)', - title: 'C. Slot Strategy 2 (Easy)', + name: 'Variety Split Easy', + title: 'C. Variety Split Easy', + grade: 'Q3', }, { - id: 'abc320_b', - contest_id: 'abc320', + id: 'abc397_b', + contest_id: 'abc397', problem_index: 'B', - name: 'Longest Palindrome', - title: 'B. Longest Palindrome', - grade: 'Q6', + name: 'Ticket Gate Log', + title: 'B. Ticket Gate Log', + grade: 'Q5', }, { - id: 'abc320_a', - contest_id: 'abc320', + id: 'abc397_a', + contest_id: 'abc397', problem_index: 'A', - name: 'Leyland Number', - title: 'A. Leyland Number', - grade: 'Q7', + name: 'Thermometer', + title: 'A. Thermometer', + grade: 'Q8', }, { - id: 'abc319_g', - contest_id: 'abc319', + id: 'abc396_g', + contest_id: 'abc396', problem_index: 'G', - name: 'Counting Shortest Paths', - title: 'G. Counting Shortest Paths', + name: 'Flip Row or Col', + title: 'G. Flip Row or Col', + grade: 'D3', }, { - id: 'abc319_f', - contest_id: 'abc319', + id: 'abc396_f', + contest_id: 'abc396', problem_index: 'F', - name: 'Fighter Takahashi', - title: 'F. Fighter Takahashi', + name: 'Rotated Inversions', + title: 'F. Rotated Inversions', + grade: 'D1', }, { - id: 'abc319_e', - contest_id: 'abc319', + id: 'abc396_e', + contest_id: 'abc396', problem_index: 'E', - name: 'Bus Stops', - title: 'E. Bus Stops', + name: 'Min of Restricted Sum', + title: 'E. Min of Restricted Sum', + grade: 'D1', }, { - id: 'abc319_d', - contest_id: 'abc319', + id: 'abc396_d', + contest_id: 'abc396', problem_index: 'D', - name: 'Minimum Width', - title: 'D. Minimum Width', + name: 'Minimum XOR Path', + title: 'D. Minimum XOR Path', + grade: 'Q3', }, { - id: 'abc319_c', - contest_id: 'abc319', + id: 'abc396_c', + contest_id: 'abc396', problem_index: 'C', - name: 'False Hope', - title: 'C. False Hope', + name: 'Buy Balls', + title: 'C. Buy Balls', + grade: 'Q3', }, { - id: 'abc319_b', - contest_id: 'abc319', + id: 'abc396_b', + contest_id: 'abc396', problem_index: 'B', - name: 'Measure', - title: 'B. Measure', - grade: 'Q6', + name: 'Card Pile', + title: 'B. Card Pile', + grade: 'Q5', }, { - id: 'abc319_a', - contest_id: 'abc319', + id: 'abc396_a', + contest_id: 'abc396', problem_index: 'A', - name: 'Legendary Players', - title: 'A. Legendary Players', + name: 'Triple Four', + title: 'A. Triple Four', grade: 'Q7', }, { - id: 'abc318_h', - contest_id: 'abc318', - problem_index: 'Ex', - name: 'Count Strong Test Cases', - title: 'Ex. Count Strong Test Cases', - }, - { - id: 'abc318_g', - contest_id: 'abc318', + id: 'abc395_g', + contest_id: 'abc395', problem_index: 'G', - name: 'Typical Path Problem', - title: 'G. Typical Path Problem', + name: 'Minimum Steiner Tree 2', + title: 'G. Minimum Steiner Tree 2', + grade: 'D4', }, { - id: 'abc318_f', - contest_id: 'abc318', + id: 'abc395_f', + contest_id: 'abc395', problem_index: 'F', - name: 'Octopus', - title: 'F. Octopus', + name: 'Smooth Occlusion', + title: 'F. Smooth Occlusion', + grade: 'D1', }, { - id: 'abc318_e', - contest_id: 'abc318', + id: 'abc395_e', + contest_id: 'abc395', problem_index: 'E', - name: 'Sandwiches', - title: 'E. Sandwiches', + name: 'Flip Edge', + title: 'E. Flip Edge', + grade: 'Q1', }, { - id: 'abc318_d', - contest_id: 'abc318', + id: 'abc395_d', + contest_id: 'abc395', problem_index: 'D', - name: 'General Weighted Max Matching', - title: 'D. General Weighted Max Matching', + name: 'Pigeon Swap', + title: 'D. Pigeon Swap', + grade: 'Q2', }, { - id: 'abc318_c', - contest_id: 'abc318', + id: 'abc395_c', + contest_id: 'abc395', problem_index: 'C', - name: 'Blue Spring', - title: 'C. Blue Spring', + name: 'Shortest Duplicate Subarray', + title: 'C. Shortest Duplicate Subarray', + grade: 'Q4', }, { - id: 'abc318_b', - contest_id: 'abc318', + id: 'abc395_b', + contest_id: 'abc395', problem_index: 'B', - name: 'Overlapping sheets', - title: 'B. Overlapping sheets', + name: 'Make Target', + title: 'B. Make Target', + grade: 'Q5', }, { - id: 'abc318_a', - contest_id: 'abc318', + id: 'abc395_a', + contest_id: 'abc395', problem_index: 'A', - name: 'Full Moon', - title: 'A. Full Moon', + name: 'Strictly Increasing?', + title: 'A. Strictly Increasing?', grade: 'Q7', }, { - id: 'abc317_h', - contest_id: 'abc317', - problem_index: 'Ex', - name: 'Walk', - title: 'Ex. Walk', - }, - { - id: 'abc317_g', - contest_id: 'abc317', + id: 'abc394_g', + contest_id: 'abc394', problem_index: 'G', - name: 'Rearranging', - title: 'G. Rearranging', + name: 'Dense Buildings', + title: 'G. Dense Buildings', + grade: 'D3', }, { - id: 'abc317_f', - contest_id: 'abc317', + id: 'abc394_f', + contest_id: 'abc394', problem_index: 'F', - name: 'Nim', - title: 'F. Nim', + name: 'Alkane', + title: 'F. Alkane', + grade: 'D1', }, { - id: 'abc317_e', - contest_id: 'abc317', + id: 'abc394_e', + contest_id: 'abc394', problem_index: 'E', - name: 'Avoid Eye Contact', - title: 'E. Avoid Eye Contact', + name: 'Palindromic Shortest Path', + title: 'E. Palindromic Shortest Path', + grade: 'D1', }, { - id: 'abc317_d', - contest_id: 'abc317', + id: 'abc394_d', + contest_id: 'abc394', problem_index: 'D', - name: 'President', - title: 'D. President', + name: 'Colorful Bracket Sequence', + title: 'D. Colorful Bracket Sequence', + grade: 'Q3', }, { - id: 'abc317_c', - contest_id: 'abc317', + id: 'abc394_c', + contest_id: 'abc394', problem_index: 'C', - name: 'Remembering the Days', - title: 'C. Remembering the Days', + name: 'Debug', + title: 'C. Debug', + grade: 'Q4', }, { - id: 'abc317_b', - contest_id: 'abc317', + id: 'abc394_b', + contest_id: 'abc394', problem_index: 'B', - name: 'MissingNo.', - title: 'B. MissingNo.', + name: 'cat', + title: 'B. cat', + grade: 'Q5', }, { - id: 'abc317_a', - contest_id: 'abc317', + id: 'abc394_a', + contest_id: 'abc394', problem_index: 'A', - name: 'Potions', - title: 'A. Potions', - grade: 'Q7', - }, - { - id: 'abc315_h', - contest_id: 'abc315', - problem_index: 'Ex', - name: 'Typical Convolution Problem', - title: 'Ex. Typical Convolution Problem', + name: '22222', + title: 'A. 22222', + grade: 'Q8', }, { - id: 'abc315_g', - contest_id: 'abc315', + id: 'abc393_g', + contest_id: 'abc393', problem_index: 'G', - name: 'Ai + Bj + Ck = X (1 <= i, j, k <= N)', - title: 'G. Ai + Bj + Ck = X (1 <= i, j, k <= N)', + name: 'Unevenness', + title: 'G. Unevenness', + grade: 'D6', }, { - id: 'abc315_f', - contest_id: 'abc315', + id: 'abc393_f', + contest_id: 'abc393', problem_index: 'F', - name: 'Shortcuts', - title: 'F. Shortcuts', + name: 'Prefix LIS Query ', + title: 'F. Prefix LIS Query ', grade: 'D1', }, { - id: 'abc315_e', - contest_id: 'abc315', + id: 'abc393_e', + contest_id: 'abc393', problem_index: 'E', - name: 'Prerequisites', - title: 'E. Prerequisites', + name: 'GCD of Subset', + title: 'E. GCD of Subset', + grade: 'D1', }, { - id: 'abc315_d', - contest_id: 'abc315', + id: 'abc393_d', + contest_id: 'abc393', problem_index: 'D', - name: 'Magical Cookies', - title: 'D. Magical Cookies', + name: 'Swap to Gather', + title: 'D. Swap to Gather', + grade: 'Q2', }, { - id: 'abc315_c', - contest_id: 'abc315', + id: 'abc393_c', + contest_id: 'abc393', problem_index: 'C', - name: 'Flavors', - title: 'C. Flavors', + name: 'Make it Simple', + title: 'C. Make it Simple', + grade: 'Q4', }, { - id: 'abc315_b', - contest_id: 'abc315', + id: 'abc393_b', + contest_id: 'abc393', problem_index: 'B', - name: 'The Middle Day', - title: 'B. The Middle Day', + name: 'A..B..C', + title: 'B. A..B..C', + grade: 'Q6', }, { - id: 'abc315_a', - contest_id: 'abc315', + id: 'abc393_a', + contest_id: 'abc393', problem_index: 'A', - name: 'tcdr', - title: 'A. tcdr', - grade: 'Q8', - }, - { - id: 'abc314_h', - contest_id: 'abc314', - problem_index: 'Ex', - name: 'Disk and Segments', - title: 'Ex. Disk and Segments', + name: 'Poisonous Oyster ', + title: 'A. Poisonous Oyster ', + grade: 'Q7', }, { - id: 'abc314_g', - contest_id: 'abc314', + id: 'abc392_g', + contest_id: 'abc392', problem_index: 'G', - name: 'Amulets', - title: 'G. Amulets', + name: 'Fine Triplets', + title: 'G. Fine Triplets', + grade: 'D2', }, { - id: 'abc314_f', - contest_id: 'abc314', + id: 'abc392_f', + contest_id: 'abc392', problem_index: 'F', - name: 'A Certain Game', - title: 'F. A Certain Game', + name: 'Insert', + title: 'F. Insert', + grade: 'D1', }, { - id: 'abc314_e', - contest_id: 'abc314', + id: 'abc392_e', + contest_id: 'abc392', problem_index: 'E', - name: 'Roulettes', - title: 'E. Roulettes', + name: 'Cables and Servers', + title: 'E. Cables and Servers', + grade: 'Q1', }, { - id: 'abc314_d', - contest_id: 'abc314', + id: 'abc392_d', + contest_id: 'abc392', problem_index: 'D', - name: 'LOWER', - title: 'D. LOWER', + name: 'Doubles', + title: 'D. Doubles', + grade: 'Q2', }, { - id: 'abc314_c', - contest_id: 'abc314', + id: 'abc392_c', + contest_id: 'abc392', problem_index: 'C', - name: 'Rotate Colored Subsequence', - title: 'C. Rotate Colored Subsequence', + name: 'Bib', + title: 'C. Bib', + grade: 'Q4', }, { - id: 'abc314_b', - contest_id: 'abc314', + id: 'abc392_b', + contest_id: 'abc392', problem_index: 'B', - name: 'Roulette', - title: 'B. Roulette', + name: 'Who is Missing?', + title: 'B. Who is Missing?', + grade: 'Q6', }, { - id: 'abc314_a', - contest_id: 'abc314', + id: 'abc392_a', + contest_id: 'abc392', problem_index: 'A', - name: '3.14', - title: 'A. 3.14', - grade: 'Q7', - }, - { - id: 'abc313_h', - contest_id: 'abc313', - problem_index: 'Ex', - name: 'Group Photo', - title: 'Ex. Group Photo', + name: 'Shuffled Equation', + title: 'A. Shuffled Equation', + grade: 'Q8', }, { - id: 'abc313_g', - contest_id: 'abc313', + id: 'abc391_g', + contest_id: 'abc391', problem_index: 'G', - name: 'Redistribution of Piles', - title: 'G. Redistribution of Piles', + name: 'Many LCS', + title: 'G. Many LCS', + grade: 'D3', }, { - id: 'abc313_f', - contest_id: 'abc313', + id: 'abc391_f', + contest_id: 'abc391', problem_index: 'F', - name: 'Flip Machines', - title: 'F. Flip Machines', + name: 'K-th Largest Triplet ', + title: 'F. K-th Largest Triplet ', + grade: 'D1', }, { - id: 'abc313_e', - contest_id: 'abc313', + id: 'abc391_e', + contest_id: 'abc391', problem_index: 'E', - name: 'Duplicate', - title: 'E. Duplicate', + name: 'Hierarchical Majority Vote', + title: 'E. Hierarchical Majority Vote', + grade: 'Q1', }, { - id: 'abc313_d', - contest_id: 'abc313', + id: 'abc391_d', + contest_id: 'abc391', problem_index: 'D', - name: 'Odd or Even', - title: 'D. Odd or Even', + name: 'Gravity', + title: 'D. Gravity', + grade: 'Q1', }, { - id: 'abc313_c', - contest_id: 'abc313', + id: 'abc391_c', + contest_id: 'abc391', problem_index: 'C', - name: 'Approximate Equalization 2', - title: 'C. Approximate Equalization 2', + name: 'Pigeonhole Query', + title: 'C. Pigeonhole Query', + grade: 'Q3', }, { - id: 'abc313_b', - contest_id: 'abc313', + id: 'abc391_b', + contest_id: 'abc391', problem_index: 'B', - name: 'Who is Saikyo?', - title: 'B. Who is Saikyo?', - grade: 'Q4', + name: 'Seek Grid', + title: 'B. Seek Grid', + grade: 'Q5', }, { - id: 'abc313_a', - contest_id: 'abc313', + id: 'abc391_a', + contest_id: 'abc391', problem_index: 'A', - name: 'To Be Saikyo', - title: 'A. To Be Saikyo', - grade: 'Q6', - }, - { - id: 'abc312_h', - contest_id: 'abc312', - problem_index: 'Ex', - name: 'snukesnuke', - title: 'Ex. snukesnuke', + name: 'Lucky Direction', + title: 'A. Lucky Direction', + grade: 'Q8', }, { - id: 'abc312_g', - contest_id: 'abc312', + id: 'abc390_g', + contest_id: 'abc390', problem_index: 'G', - name: 'Avoid Straight Line', - title: 'G. Avoid Straight Line', + name: 'Permutation Concatenation', + title: 'G. Permutation Concatenation', + grade: 'D4', }, { - id: 'abc312_f', - contest_id: 'abc312', + id: 'abc390_f', + contest_id: 'abc390', problem_index: 'F', - name: 'Cans and Openers', - title: 'F. Cans and Openers', + name: 'Double Sum 3', + title: 'F. Double Sum 3', + grade: 'D2', }, { - id: 'abc312_e', - contest_id: 'abc312', + id: 'abc390_e', + contest_id: 'abc390', problem_index: 'E', - name: 'Tangency of Cuboids ', - title: 'E. Tangency of Cuboids ', + name: 'Vitamin Balance', + title: 'E. Vitamin Balance', + grade: 'D1', }, { - id: 'abc312_d', - contest_id: 'abc312', + id: 'abc390_d', + contest_id: 'abc390', problem_index: 'D', - name: 'Count Bracket Sequences', - title: 'D. Count Bracket Sequences', + name: 'Stone XOR', + title: 'D. Stone XOR', + grade: 'D1', }, { - id: 'abc312_c', - contest_id: 'abc312', + id: 'abc390_c', + contest_id: 'abc390', problem_index: 'C', - name: 'Invisible Hand', - title: 'C. Invisible Hand', + name: 'Paint to make a rectangle', + title: 'C. Paint to make a rectangle', + grade: 'Q4', }, { - id: 'abc312_b', - contest_id: 'abc312', + id: 'abc390_b', + contest_id: 'abc390', problem_index: 'B', - name: 'TaK Code', - title: 'B. TaK Code', + name: 'Geometric Sequence', + title: 'B. Geometric Sequence', + grade: 'Q5', }, { - id: 'abc312_a', - contest_id: 'abc312', + id: 'abc390_a', + contest_id: 'abc390', problem_index: 'A', - name: 'Chord', - title: 'A. Chord', - grade: 'Q8', - }, - { - id: 'abc311_h', - contest_id: 'abc311', - problem_index: 'Ex', - name: 'Many Illumination Plans', - title: 'Ex. Many Illumination Plans', + name: '12435', + title: 'A. 12435', + grade: 'Q6', }, { - id: 'abc311_g', - contest_id: 'abc311', + id: 'abc389_g', + contest_id: 'abc389', problem_index: 'G', - name: 'One More Grid Task', - title: 'G. One More Grid Task', + name: 'Odd Even Graph', + title: 'G. Odd Even Graph', + grade: 'D4', }, { - id: 'abc311_f', - contest_id: 'abc311', + id: 'abc389_f', + contest_id: 'abc389', problem_index: 'F', - name: 'Yet Another Grid Task', - title: 'F. Yet Another Grid Task', + name: 'Rated Range', + title: 'F. Rated Range', + grade: 'D2', }, { - id: 'abc311_e', - contest_id: 'abc311', + id: 'abc389_e', + contest_id: 'abc389', problem_index: 'E', - name: 'Defect-free Squares', - title: 'E. Defect-free Squares', + name: 'Square Price', + title: 'E. Square Price', + grade: 'D2', }, { - id: 'abc311_d', - contest_id: 'abc311', + id: 'abc389_d', + contest_id: 'abc389', problem_index: 'D', - name: 'Grid Ice Floor', - title: 'D. Grid Ice Floor', + name: 'Squares in Circle', + title: 'D. Squares in Circle', + grade: 'Q1', }, { - id: 'abc311_c', - contest_id: 'abc311', + id: 'abc389_c', + contest_id: 'abc389', problem_index: 'C', - name: 'Find it!', - title: 'C. Find it!', + name: 'Snake Queue', + title: 'C. Snake Queue', + grade: 'Q3', }, { - id: 'abc311_b', - contest_id: 'abc311', + id: 'abc389_b', + contest_id: 'abc389', problem_index: 'B', - name: 'Vacation Together', - title: 'B. Vacation Together', + name: 'tcaF', + title: 'B. tcaF', grade: 'Q6', }, { - id: 'abc311_a', - contest_id: 'abc311', + id: 'abc389_a', + contest_id: 'abc389', problem_index: 'A', - name: 'First ABC', - title: 'A. First ABC', - grade: 'Q7', - }, - { - id: 'abc310_h', - contest_id: 'abc310', - problem_index: 'Ex', - name: 'Negative Cost', - title: 'Ex. Negative Cost', + name: '9x9', + title: 'A. 9x9', + grade: 'Q8', }, { - id: 'abc310_g', - contest_id: 'abc310', + id: 'abc388_g', + contest_id: 'abc388', problem_index: 'G', - name: 'Takahashi And Pass-The-Ball Game', - title: 'G. Takahashi And Pass-The-Ball Game', + name: 'Simultaneous Kagamimochi 2', + title: 'G. Simultaneous Kagamimochi 2', + grade: 'D2', }, { - id: 'abc310_f', - contest_id: 'abc310', + id: 'abc388_f', + contest_id: 'abc388', problem_index: 'F', - name: 'Make 10 Again', - title: 'F. Make 10 Again', + name: 'Dangerous Sugoroku ', + title: 'F. Dangerous Sugoroku ', + grade: 'D3', }, { - id: 'abc310_e', - contest_id: 'abc310', + id: 'abc388_e', + contest_id: 'abc388', problem_index: 'E', - name: 'NAND repeatedly', - title: 'E. NAND repeatedly', + name: 'Simultaneous Kagamimochi', + title: 'E. Simultaneous Kagamimochi', + grade: 'Q1', }, { - id: 'abc310_d', - contest_id: 'abc310', + id: 'abc388_d', + contest_id: 'abc388', problem_index: 'D', - name: 'Peaceful Teams', - title: 'D. Peaceful Teams', + name: 'Coming of Age Celebration', + title: 'D. Coming of Age Celebration', + grade: 'Q2', }, { - id: 'abc310_c', - contest_id: 'abc310', + id: 'abc388_c', + contest_id: 'abc388', problem_index: 'C', - name: 'Reversible', - title: 'C. Reversible', + name: 'Various Kagamimochi', + title: 'C. Various Kagamimochi', + grade: 'Q4', }, { - id: 'abc310_b', - contest_id: 'abc310', + id: 'abc388_b', + contest_id: 'abc388', problem_index: 'B', - name: 'Strictly Superior', - title: 'B. Strictly Superior', + name: 'Heavy Snake', + title: 'B. Heavy Snake', + grade: 'Q6', }, { - id: 'abc310_a', - contest_id: 'abc310', + id: 'abc388_a', + contest_id: 'abc388', problem_index: 'A', - name: 'Order Something Else', - title: 'A. Order Something Else', - grade: 'Q7', - }, - { - id: 'abc309_h', - contest_id: 'abc309', - problem_index: 'Ex', - name: 'Simple Path Counting Problem', - title: 'Ex. Simple Path Counting Problem', + name: '?UPC', + title: 'A. ?UPC', + grade: 'Q9', }, { - id: 'abc309_g', - contest_id: 'abc309', + id: 'abc387_g', + contest_id: 'abc387', problem_index: 'G', - name: 'Ban Permutation', - title: 'G. Ban Permutation', + name: 'Prime Circuit', + title: 'G. Prime Circuit', + grade: 'D5', }, { - id: 'abc309_f', - contest_id: 'abc309', + id: 'abc387_f', + contest_id: 'abc387', problem_index: 'F', - name: 'Box in Box', - title: 'F. Box in Box', + name: 'Count Arrays', + title: 'F. Count Arrays', + grade: 'D2', }, { - id: 'abc309_e', - contest_id: 'abc309', + id: 'abc387_e', + contest_id: 'abc387', problem_index: 'E', - name: 'Family and Insurance', - title: 'E. Family and Insurance', + name: 'Digit Sum Divisible 2', + title: 'E. Digit Sum Divisible 2', + grade: 'D2', }, { - id: 'abc309_d', - contest_id: 'abc309', + id: 'abc387_d', + contest_id: 'abc387', problem_index: 'D', - name: 'Add One Edge', - title: 'D. Add One Edge', + name: 'Snaky Walk', + title: 'D. Snaky Walk', + grade: 'Q1', }, { - id: 'abc309_c', - contest_id: 'abc309', + id: 'abc387_c', + contest_id: 'abc387', problem_index: 'C', - name: 'Medicine', - title: 'C. Medicine', + name: 'Snake Numbers', + title: 'C. Snake Numbers', + grade: 'Q1', }, { - id: 'abc309_b', - contest_id: 'abc309', + id: 'abc387_b', + contest_id: 'abc387', problem_index: 'B', - name: 'Rotate', - title: 'B. Rotate', - grade: 'Q5', - }, - { - id: 'abc309_a', - contest_id: 'abc309', - problem_index: 'A', - name: 'Nine', - title: 'A. Nine', + name: '9x9 Sum', + title: 'B. 9x9 Sum', grade: 'Q7', }, { - id: 'abc308_h', - contest_id: 'abc308', - problem_index: 'Ex', - name: 'Make Q', - title: 'Ex. Make Q', + id: 'abc387_a', + contest_id: 'abc387', + problem_index: 'A', + name: 'Happy New Year 2025', + title: 'A. Happy New Year 2025', + grade: 'Q9', }, { - id: 'abc308_g', - contest_id: 'abc308', + id: 'abc386_g', + contest_id: 'abc386', problem_index: 'G', - name: 'Minimum Xor Pair Query', - title: 'G. Minimum Xor Pair Query', + name: 'Many MST', + title: 'G. Many MST', + grade: 'D5', }, { - id: 'abc308_f', - contest_id: 'abc308', + id: 'abc386_f', + contest_id: 'abc386', problem_index: 'F', - name: 'Vouchers', - title: 'F. Vouchers', + name: 'Operate K', + title: 'F. Operate K', + grade: 'D2', }, { - id: 'abc308_e', - contest_id: 'abc308', + id: 'abc386_e', + contest_id: 'abc386', problem_index: 'E', - name: 'MEX', - title: 'E. MEX', + name: ' Maximize XOR', + title: 'E. Maximize XOR', + grade: 'D1', }, { - id: 'abc308_d', - contest_id: 'abc308', + id: 'abc386_d', + contest_id: 'abc386', problem_index: 'D', - name: 'Snuke Maze', - title: 'D. Snuke Maze', + name: 'Diagonal Separation', + title: 'D. Diagonal Separation', + grade: 'Q1', }, { - id: 'abc308_c', - contest_id: 'abc308', + id: 'abc386_c', + contest_id: 'abc386', problem_index: 'C', - name: 'Standings', - title: 'C. Standings', - grade: 'Q3', + name: 'Operate 1', + title: 'C. Operate 1', + grade: 'Q4', }, { - id: 'abc308_b', - contest_id: 'abc308', + id: 'abc386_b', + contest_id: 'abc386', problem_index: 'B', - name: 'Default Price', - title: 'B. Default Price', + name: 'Calculator', + title: 'B. Calculator', + grade: 'Q6', }, { - id: 'abc308_a', - contest_id: 'abc308', + id: 'abc386_a', + contest_id: 'abc386', problem_index: 'A', - name: 'New Scheme', - title: 'A. New Scheme', + name: 'Full House 2', + title: 'A. Full House 2', grade: 'Q7', }, { - id: 'abc307_h', - contest_id: 'abc307', - problem_index: 'Ex', - name: 'Marquee', - title: 'Ex. Marquee', - }, - { - id: 'abc307_g', - contest_id: 'abc307', + id: 'abc385_g', + contest_id: 'abc385', problem_index: 'G', - name: 'Approximate Equalization', - title: 'G. Approximate Equalization', + name: 'Counting Buildings', + title: 'G. Counting Buildings', + grade: 'D4', }, { - id: 'abc307_f', - contest_id: 'abc307', + id: 'abc385_f', + contest_id: 'abc385', problem_index: 'F', - name: 'Virus 2', - title: 'F. Virus 2', + name: 'Visible Buildings', + title: 'F. Visible Buildings', + grade: 'D2', }, { - id: 'abc307_e', - contest_id: 'abc307', + id: 'abc385_e', + contest_id: 'abc385', problem_index: 'E', - name: 'Distinct Adjacent', - title: 'E. Distinct Adjacent', + name: 'Snowflake Tree', + title: 'E. Snowflake Tree', + grade: 'D1', }, { - id: 'abc307_d', - contest_id: 'abc307', + id: 'abc385_d', + contest_id: 'abc385', problem_index: 'D', - name: 'Mismatched Parentheses', - title: 'D. Mismatched Parentheses', + name: 'Santa Claus 2', + title: 'D. Santa Claus 2', + grade: 'Q1', }, { - id: 'abc307_c', - contest_id: 'abc307', + id: 'abc385_c', + contest_id: 'abc385', problem_index: 'C', - name: 'Ideal Sheet', - title: 'C. Ideal Sheet', + name: 'Illuminate Buildings', + title: 'C. Illuminate Buildings', + grade: 'Q2', }, { - id: 'abc307_b', - contest_id: 'abc307', + id: 'abc385_b', + contest_id: 'abc385', problem_index: 'B', - name: 'racecar', - title: 'B. racecar', + name: 'Santa Claus 1', + title: 'B. Santa Claus 1', + grade: 'Q5', }, { - id: 'abc307_a', - contest_id: 'abc307', + id: 'abc385_a', + contest_id: 'abc385', problem_index: 'A', - name: 'Weekly Records', - title: 'A. Weekly Records', + name: 'Equally', + title: 'A. Equally', grade: 'Q7', }, { - id: 'abc306_h', - contest_id: 'abc306', - problem_index: 'Ex', - name: 'Balance Scale', - title: 'Ex. Balance Scale', - }, - { - id: 'abc306_g', - contest_id: 'abc306', + id: 'abc384_g', + contest_id: 'abc384', problem_index: 'G', - name: 'Return to 1', - title: 'G. Return to 1', + name: 'Abs Sum', + title: 'G. Abs Sum', + grade: 'D3', }, { - id: 'abc306_f', - contest_id: 'abc306', + id: 'abc384_f', + contest_id: 'abc384', problem_index: 'F', - name: 'Merge Sets', - title: 'F. Merge Sets', + name: 'Double Sum 2', + title: 'F. Double Sum 2', + grade: 'D2', }, { - id: 'abc306_e', - contest_id: 'abc306', + id: 'abc384_e', + contest_id: 'abc384', problem_index: 'E', - name: 'Best Performances', - title: 'E. Best Performances', + name: 'Takahashi is Slime 2', + title: 'E. Takahashi is Slime 2', + grade: 'Q1', }, { - id: 'abc306_d', - contest_id: 'abc306', + id: 'abc384_d', + contest_id: 'abc384', problem_index: 'D', - name: 'Poisonous Full-Course', - title: 'D. Poisonous Full-Course', + name: 'Repeated Sequence', + title: 'D. Repeated Sequence', + grade: 'Q2', }, { - id: 'abc306_c', - contest_id: 'abc306', + id: 'abc384_c', + contest_id: 'abc384', problem_index: 'C', - name: 'Centers', - title: 'C. Centers', + name: 'Perfect Standings', + title: 'C. Perfect Standings', + grade: 'Q3', }, { - id: 'abc306_b', - contest_id: 'abc306', + id: 'abc384_b', + contest_id: 'abc384', problem_index: 'B', - name: 'Base 2', - title: 'B. Base 2', + name: 'ARC Division', + title: 'B. ARC Division', + grade: 'Q6', }, { - id: 'abc306_a', - contest_id: 'abc306', + id: 'abc384_a', + contest_id: 'abc384', problem_index: 'A', - name: 'Echo', - title: 'A. Echo', + name: 'aaaadaa', + title: 'A. aaaadaa', grade: 'Q8', }, { - id: 'abc305_h', - contest_id: 'abc305', - problem_index: 'Ex', - name: 'Shojin', - title: 'Ex. Shojin', - }, - { - id: 'abc305_g', - contest_id: 'abc305', + id: 'abc383_g', + contest_id: 'abc383', problem_index: 'G', - name: 'Banned Substrings', - title: 'G. Banned Substrings', + name: 'Bar Cover', + title: 'G. Bar Cover', + grade: 'D5', }, { - id: 'abc305_f', - contest_id: 'abc305', + id: 'abc383_f', + contest_id: 'abc383', problem_index: 'F', - name: 'Dungeon Explore', - title: 'F. Dungeon Explore', + name: 'Diversity', + title: 'F. Diversity', + grade: 'D2', }, { - id: 'abc305_e', - contest_id: 'abc305', + id: 'abc383_e', + contest_id: 'abc383', problem_index: 'E', - name: 'Art Gallery on Graph', - title: 'E. Art Gallery on Graph', + name: 'Sum of Max Matching', + title: 'E. Sum of Max Matching', + grade: 'D1', }, { - id: 'abc305_d', - contest_id: 'abc305', + id: 'abc383_d', + contest_id: 'abc383', problem_index: 'D', - name: 'Sleep Log', - title: 'D. Sleep Log', + name: '9 Divisors', + title: 'D. 9 Divisors', + grade: 'Q1', }, { - id: 'abc305_c', - contest_id: 'abc305', + id: 'abc383_c', + contest_id: 'abc383', problem_index: 'C', - name: 'Snuke the Cookie Picker', - title: 'C. Snuke the Cookie Picker', + name: 'Humidifier 3', + title: 'C. Humidifier 3', + grade: 'Q2', }, { - id: 'abc305_b', - contest_id: 'abc305', + id: 'abc383_b', + contest_id: 'abc383', problem_index: 'B', - name: 'ABCDEFG', - title: 'B. ABCDEFG', + name: 'Humidifier 2', + title: 'B. Humidifier 2', + grade: 'Q4', }, { - id: 'abc305_a', - contest_id: 'abc305', + id: 'abc383_a', + contest_id: 'abc383', problem_index: 'A', - name: 'Water Station', - title: 'A. Water Station', - grade: 'Q7', - }, - { - id: 'abc304_h', - contest_id: 'abc304', - problem_index: 'Ex', - name: 'Constrained Topological Sort', - title: 'Ex. Constrained Topological Sort', + name: 'Humidifier 1', + title: 'A. Humidifier 1', + grade: 'Q6', }, { - id: 'abc304_g', - contest_id: 'abc304', + id: 'abc382_g', + contest_id: 'abc382', problem_index: 'G', - name: 'Max of Medians', - title: 'G. Max of Medians', + name: 'Tile Distance 3', + title: 'G. Tile Distance 3', + grade: 'D6', }, { - id: 'abc304_f', - contest_id: 'abc304', + id: 'abc382_f', + contest_id: 'abc382', problem_index: 'F', - name: 'Shift Table', - title: 'F. Shift Table', + name: 'Falling Bars', + title: 'F. Falling Bars', + grade: 'D1', }, { - id: 'abc304_e', - contest_id: 'abc304', + id: 'abc382_e', + contest_id: 'abc382', problem_index: 'E', - name: 'Good Graph', - title: 'E. Good Graph', + name: 'Expansion Packs', + title: 'E. Expansion Packs', + grade: 'D1', }, { - id: 'abc304_d', - contest_id: 'abc304', + id: 'abc382_d', + contest_id: 'abc382', problem_index: 'D', - name: 'A Piece of Cake', - title: 'D. A Piece of Cake', + name: 'Keep Distance', + title: 'D. Keep Distance', + grade: 'Q2', }, { - id: 'abc304_c', - contest_id: 'abc304', + id: 'abc382_c', + contest_id: 'abc382', problem_index: 'C', - name: 'Virus', - title: 'C. Virus', + name: 'Kaiten Sushi', + title: 'C. Kaiten Sushi', + grade: 'Q3', }, { - id: 'abc304_b', - contest_id: 'abc304', + id: 'abc382_b', + contest_id: 'abc382', problem_index: 'B', - name: 'Subscribers', - title: 'B. Subscribers', + name: 'Daily Cookie 2', + title: 'B. Daily Cookie 2', + grade: 'Q7', }, { - id: 'abc304_a', - contest_id: 'abc304', + id: 'abc382_a', + contest_id: 'abc382', problem_index: 'A', - name: 'First Player', - title: 'A. First Player', + name: 'Daily Cookie', + title: 'A. Daily Cookie', grade: 'Q7', }, { - id: 'abc303_h', - contest_id: 'abc303', - problem_index: 'Ex', - name: 'Constrained Tree Degree', - title: 'Ex. Constrained Tree Degree', + id: 'abc381_g', + contest_id: 'abc381', + problem_index: 'G', + name: 'Fibonacci Product', + title: 'G. Fibonacci Product', + grade: 'D6', }, { - id: 'abc303_g', - contest_id: 'abc303', + id: 'abc381_f', + contest_id: 'abc381', + problem_index: 'F', + name: '1122 Subsequence', + title: 'F. 1122 Subsequence', + grade: 'D2', + }, + { + id: 'abc381_e', + contest_id: 'abc381', + problem_index: 'E', + name: '11/22 Subsequence', + title: 'E. 11/22 Subsequence', + grade: 'D1', + }, + { + id: 'abc381_d', + contest_id: 'abc381', + problem_index: 'D', + name: '1122 Substring', + title: 'D. 1122 Substring', + grade: 'Q1', + }, + { + id: 'abc381_c', + contest_id: 'abc381', + problem_index: 'C', + name: '11/22 Substring', + title: 'C. 11/22 Substring', + grade: 'Q4', + }, + { + id: 'abc381_b', + contest_id: 'abc381', + problem_index: 'B', + name: '1122 String', + title: 'B. 1122 String', + grade: 'Q6', + }, + { + id: 'abc381_a', + contest_id: 'abc381', + problem_index: 'A', + name: '11/22 String', + title: 'A. 11/22 String', + grade: 'Q6', + }, + { + id: 'abc380_g', + contest_id: 'abc380', problem_index: 'G', - name: 'Bags Game', - title: 'G. Bags Game', + name: 'Another Shuffle Window', + title: 'G. Another Shuffle Window', + grade: 'D3', }, { - id: 'abc303_f', - contest_id: 'abc303', + id: 'abc380_f', + contest_id: 'abc380', problem_index: 'F', - name: 'Damage over Time', - title: 'F. Damage over Time', + name: 'Exchange Game', + title: 'F. Exchange Game', + grade: 'D2', }, { - id: 'abc303_e', - contest_id: 'abc303', + id: 'abc380_e', + contest_id: 'abc380', problem_index: 'E', - name: 'A Gift From the Stars', - title: 'E. A Gift From the Stars', + name: '1D Bucket Tool', + title: 'E. 1D Bucket Tool', + grade: 'D1', }, { - id: 'abc303_d', - contest_id: 'abc303', + id: 'abc380_d', + contest_id: 'abc380', problem_index: 'D', - name: 'Shift vs. CapsLock', - title: 'D. Shift vs. CapsLock', + name: 'Strange Mirroring', + title: 'D. Strange Mirroring', + grade: 'Q1', }, { - id: 'abc303_c', - contest_id: 'abc303', + id: 'abc380_c', + contest_id: 'abc380', problem_index: 'C', - name: 'Dash', - title: 'C. Dash', + name: 'Move Segment', + title: 'C. Move Segment', + grade: 'Q4', }, { - id: 'abc303_b', - contest_id: 'abc303', + id: 'abc380_b', + contest_id: 'abc380', problem_index: 'B', - name: 'Discord', - title: 'B. Discord', + name: 'Hurdle Parsing', + title: 'B. Hurdle Parsing', + grade: 'Q6', }, { - id: 'abc303_a', - contest_id: 'abc303', + id: 'abc380_a', + contest_id: 'abc380', problem_index: 'A', - name: 'Similar String', - title: 'A. Similar String', + name: '123233', + title: 'A. 123233', grade: 'Q7', }, { - id: 'abc302_h', - contest_id: 'abc302', - problem_index: 'Ex', - name: 'Ball Collector', - title: 'Ex. Ball Collector', + id: 'abc379_f', + contest_id: 'abc379', + problem_index: 'F', + name: 'Buildings 2', + title: 'F. Buildings 2', + grade: 'D2', }, { - id: 'abc302_g', - contest_id: 'abc302', - problem_index: 'G', - name: 'Sort from 1 to 4', - title: 'G. Sort from 1 to 4', + id: 'abc378_c', + contest_id: 'abc378', + problem_index: 'C', + name: 'Repeating', + title: 'C. Repeating', + grade: 'Q5', }, { - id: 'abc302_f', - contest_id: 'abc302', - problem_index: 'F', - name: 'Merge Set', - title: 'F. Merge Set', + id: 'abc374_c', + contest_id: 'abc374', + problem_index: 'C', + name: 'Separated Lunch', + title: 'C. Separated Lunch', + grade: 'Q3', }, { - id: 'abc302_e', - contest_id: 'abc302', + id: 'abc373_d', + contest_id: 'abc373', + problem_index: 'D', + name: 'Hidden Weights', + title: 'D. Hidden Weights', + grade: 'Q2', + }, + { + id: 'abc372_d', + contest_id: 'abc372', + problem_index: 'D', + name: 'Buildings', + title: 'D. Buildings', + grade: 'Q1', + }, + { + id: 'abc371_b', + contest_id: 'abc371', + problem_index: 'B', + name: 'Taro', + title: 'B. Taro', + grade: 'Q6', + }, + { + id: 'abc367_c', + contest_id: 'abc367', + problem_index: 'C', + name: 'Enumerate Sequences', + title: 'C. Enumerate Sequences', + grade: 'Q4', + }, + { + id: 'abc365_a', + contest_id: 'abc365', + problem_index: 'A', + name: 'Leap Year', + title: 'A. Leap Year', + grade: 'Q8', + }, + { + id: 'abc362_b', + contest_id: 'abc362', + problem_index: 'B', + name: 'Right Triangle', + title: 'B. Right Triangle', + grade: 'Q6', + }, + { + id: 'abc362_a', + contest_id: 'abc362', + problem_index: 'A', + name: 'Buy a Pen', + title: 'A. Buy a Pen', + grade: 'Q8', + }, + { + id: 'abc359_e', + contest_id: 'abc359', problem_index: 'E', - name: 'Isolation', - title: 'E. Isolation', + name: 'Water Tank', + title: 'E. Water Tank', + grade: 'D1', }, { - id: 'abc302_d', - contest_id: 'abc302', + id: 'abc358_c', + contest_id: 'abc358', + problem_index: 'C', + name: 'Popcorn', + title: 'C. Popcorn', + grade: 'Q3', + }, + { + id: 'abc357_c', + contest_id: 'abc357', + problem_index: 'C', + name: 'Sierpinski carpet', + title: 'C. Sierpinski carpet', + grade: 'Q3', + }, + { + id: 'abc357_b', + contest_id: 'abc357', + problem_index: 'B', + name: 'Uppercase and Lowercase', + title: 'B. Uppercase and Lowercase', + grade: 'Q7', + }, + { + id: 'abc352_a', + contest_id: 'abc352', + problem_index: 'A', + name: 'AtCoder Line', + title: 'A. AtCoder Line', + grade: 'Q8', + }, + { + id: 'abc351_b', + contest_id: 'abc351', + problem_index: 'B', + name: 'Spot the Difference', + title: 'B. Spot the Difference', + grade: 'Q7', + }, + { + id: 'abc350_b', + contest_id: 'abc350', + problem_index: 'B', + name: 'Dentist Aoki', + title: 'B. Dentist Aoki', + grade: 'Q6', + }, + { + id: 'abc343_d', + contest_id: 'abc343', problem_index: 'D', - name: 'Impartial Gift', - title: 'D. Impartial Gift', + name: 'Diversity of Scores', + title: 'D. Diversity of Scores', + grade: 'Q3', + }, + { + id: 'abc343_c', + contest_id: 'abc343', + problem_index: 'C', + name: '343', + title: 'C. 343', + grade: 'Q4', + }, + { + id: 'abc343_a', + contest_id: 'abc343', + problem_index: 'A', + name: 'Wrong Answer', + title: 'A. Wrong Answer', + grade: 'Q8', + }, + { + id: 'abc342_a', + contest_id: 'abc342', + problem_index: 'A', + name: 'Yay!', + title: 'A. Yay!', + grade: 'Q6', + }, + { + id: 'abc341_a', + contest_id: 'abc341', + problem_index: 'A', + name: 'Print 341', + title: 'A. Print 341', + grade: 'Q8', + }, + { + id: 'abc340_c', + contest_id: 'abc340', + problem_index: 'C', + name: 'Divide and Divide', + title: 'C. Divide and Divide', + grade: 'Q3', + }, + { + id: 'abc336_b', + contest_id: 'abc336', + problem_index: 'B', + name: 'CTZ', + title: 'B. CTZ', + grade: 'Q6', + }, + { + id: 'abc336_a', + contest_id: 'abc336', + problem_index: 'A', + name: 'Long Loong', + title: 'A. Long Loong', + grade: 'Q8', + }, + { + id: 'abc335_a', + contest_id: 'abc335', + problem_index: 'A', + name: '2023', + title: 'A. 2023', + grade: 'Q9', + }, + { + id: 'abc334_a', + contest_id: 'abc334', + problem_index: 'A', + name: 'Christmas Present', + title: 'A. Christmas Present', + grade: 'Q9', + }, + { + id: 'abc333_e', + contest_id: 'abc333', + problem_index: 'E', + name: 'Takahashi Quest', + title: 'E. Takahashi Quest', + grade: 'Q1', + }, + { + id: 'abc333_a', + contest_id: 'abc333', + problem_index: 'A', + name: 'Three Threes ', + title: 'A. Three Threes ', + grade: 'Q8', + }, + { + id: 'abc331_g', + contest_id: 'abc331', + problem_index: 'G', + name: 'Collect Them All', + title: 'G. Collect Them All', + grade: 'D4', + }, + { + id: 'abc331_f', + contest_id: 'abc331', + problem_index: 'F', + name: 'Palindrome Query', + title: 'F. Palindrome Query', + grade: 'D2', + }, + { + id: 'abc331_e', + contest_id: 'abc331', + problem_index: 'E', + name: 'Set Meal', + title: 'E. Set Meal', + grade: 'Q1', + }, + { + id: 'abc331_d', + contest_id: 'abc331', + problem_index: 'D', + name: 'Tile Pattern', + title: 'D. Tile Pattern', + grade: 'Q1', + }, + { + id: 'abc331_c', + contest_id: 'abc331', + problem_index: 'C', + name: 'Sum of Numbers Greater Than Me', + title: 'C. Sum of Numbers Greater Than Me', + grade: 'Q4', + }, + { + id: 'abc331_b', + contest_id: 'abc331', + problem_index: 'B', + name: 'Buy One Carton of Milk', + title: 'B. Buy One Carton of Milk', + grade: 'Q5', + }, + { + id: 'abc331_a', + contest_id: 'abc331', + problem_index: 'A', + name: 'Tomorrow', + title: 'A. Tomorrow', + grade: 'Q7', + }, + { + id: 'abc330_c', + contest_id: 'abc330', + problem_index: 'C', + name: 'Minimize Abs 2', + title: 'C. Minimize Abs 2', + grade: 'Q3', + }, + { + id: 'abc329_g', + contest_id: 'abc329', + problem_index: 'G', + name: 'Delivery on Tree', + title: 'G. Delivery on Tree', + grade: 'D5', + }, + { + id: 'abc329_f', + contest_id: 'abc329', + problem_index: 'F', + name: 'Colored Ball', + title: 'F. Colored Ball', + grade: 'D1', + }, + { + id: 'abc329_e', + contest_id: 'abc329', + problem_index: 'E', + name: 'Stamp', + title: 'E. Stamp', + grade: 'D1', + }, + { + id: 'abc329_d', + contest_id: 'abc329', + problem_index: 'D', + name: 'Election Quick Report', + title: 'D. Election Quick Report', + grade: 'Q4', + }, + { + id: 'abc329_c', + contest_id: 'abc329', + problem_index: 'C', + name: 'Count xxx', + title: 'C. Count xxx', + grade: 'Q4', + }, + { + id: 'abc329_b', + contest_id: 'abc329', + problem_index: 'B', + name: 'Next', + title: 'B. Next', + grade: 'Q7', + }, + { + id: 'abc329_a', + contest_id: 'abc329', + problem_index: 'A', + name: 'Spread', + title: 'A. Spread', + grade: 'Q8', + }, + { + id: 'abc328_g', + contest_id: 'abc328', + problem_index: 'G', + name: 'Cut and Reorder', + title: 'G. Cut and Reorder', + grade: 'D3', + }, + { + id: 'abc328_f', + contest_id: 'abc328', + problem_index: 'F', + name: 'Good Set Query', + title: 'F. Good Set Query', + grade: 'D1', + }, + { + id: 'abc328_e', + contest_id: 'abc328', + problem_index: 'E', + name: 'Modulo MST', + title: 'E. Modulo MST', + grade: 'Q1', + }, + { + id: 'abc328_d', + contest_id: 'abc328', + problem_index: 'D', + name: 'Take ABC', + title: 'D. Take ABC', + grade: 'Q2', + }, + { + id: 'abc328_c', + contest_id: 'abc328', + problem_index: 'C', + name: 'Consecutive', + title: 'C. Consecutive', + grade: 'Q3', + }, + { + id: 'abc328_b', + contest_id: 'abc328', + problem_index: 'B', + name: '11/11', + title: 'B. 11/11', + grade: 'Q6', + }, + { + id: 'abc328_a', + contest_id: 'abc328', + problem_index: 'A', + name: 'Not Too Hard', + title: 'A. Not Too Hard', + grade: 'Q7', + }, + { + id: 'abc327_g', + contest_id: 'abc327', + problem_index: 'G', + name: 'Many Good Tuple Problems', + title: 'G. Many Good Tuple Problems', + grade: 'D5', + }, + { + id: 'abc327_f', + contest_id: 'abc327', + problem_index: 'F', + name: 'Apples', + title: 'F. Apples', + grade: 'D2', + }, + { + id: 'abc327_e', + contest_id: 'abc327', + problem_index: 'E', + name: 'Maximize Rating', + title: 'E. Maximize Rating', + grade: 'Q1', + }, + { + id: 'abc327_d', + contest_id: 'abc327', + problem_index: 'D', + name: 'Good Tuple Problem', + title: 'D. Good Tuple Problem', + grade: 'Q2', + }, + { + id: 'abc327_c', + contest_id: 'abc327', + problem_index: 'C', + name: 'Number Place', + title: 'C. Number Place', + grade: 'Q5', + }, + { + id: 'abc327_b', + contest_id: 'abc327', + problem_index: 'B', + name: 'A^A', + title: 'B. A^A', + grade: 'Q6', + }, + { + id: 'abc327_a', + contest_id: 'abc327', + problem_index: 'A', + name: 'ab', + title: 'A. ab', + grade: 'Q8', + }, + { + id: 'abc326_g', + contest_id: 'abc326', + problem_index: 'G', + name: 'Unlock Achievement', + title: 'G. Unlock Achievement', + grade: 'D4', + }, + { + id: 'abc326_f', + contest_id: 'abc326', + problem_index: 'F', + name: 'Robot Rotation', + title: 'F. Robot Rotation', + grade: 'D2', + }, + { + id: 'abc326_e', + contest_id: 'abc326', + problem_index: 'E', + name: 'Revenge of "The Salary of AtCoder Inc."', + title: 'E. Revenge of "The Salary of AtCoder Inc."', + grade: 'D1', + }, + { + id: 'abc326_d', + contest_id: 'abc326', + problem_index: 'D', + name: 'ABC Puzzle', + title: 'D. ABC Puzzle', + grade: 'D1', + }, + { + id: 'abc326_c', + contest_id: 'abc326', + problem_index: 'C', + name: 'Peak', + title: 'C. Peak', + grade: 'Q3', + }, + { + id: 'abc326_b', + contest_id: 'abc326', + problem_index: 'B', + name: '326-like Numbers', + title: 'B. 326-like Numbers', + grade: 'Q6', + }, + { + id: 'abc326_a', + contest_id: 'abc326', + problem_index: 'A', + name: '2UP3DOWN', + title: 'A. 2UP3DOWN', + grade: 'Q7', + }, + { + id: 'abc325_g', + contest_id: 'abc325', + problem_index: 'G', + name: 'offence', + title: 'G. offence', + grade: 'D3', + }, + { + id: 'abc325_f', + contest_id: 'abc325', + problem_index: 'F', + name: 'Sensor Optimization Dilemma ', + title: 'F. Sensor Optimization Dilemma ', + grade: 'D2', + }, + { + id: 'abc325_e', + contest_id: 'abc325', + problem_index: 'E', + name: 'Our clients, please wait a moment', + title: 'E. Our clients, please wait a moment', + grade: 'Q1', + }, + { + id: 'abc325_d', + contest_id: 'abc325', + problem_index: 'D', + name: 'Printing Machine', + title: 'D. Printing Machine', + grade: 'Q1', + }, + { + id: 'abc325_c', + contest_id: 'abc325', + problem_index: 'C', + name: 'Sensors', + title: 'C. Sensors', + grade: 'Q3', + }, + { + id: 'abc325_b', + contest_id: 'abc325', + problem_index: 'B', + name: 'World Meeting', + title: 'B. World Meeting', + grade: 'Q5', + }, + { + id: 'abc325_a', + contest_id: 'abc325', + problem_index: 'A', + name: 'Takahashi san', + title: 'A. Takahashi san', + grade: 'Q9', + }, + { + id: 'abc324_g', + contest_id: 'abc324', + problem_index: 'G', + name: 'Generate Arrays', + title: 'G. Generate Arrays', + grade: 'D4', + }, + { + id: 'abc324_f', + contest_id: 'abc324', + problem_index: 'F', + name: 'Beautiful Path', + title: 'F. Beautiful Path', + grade: 'D2', + }, + { + id: 'abc324_e', + contest_id: 'abc324', + problem_index: 'E', + name: 'Joint Two Strings', + title: 'E. Joint Two Strings', + grade: 'Q1', + }, + { + id: 'abc324_d', + contest_id: 'abc324', + problem_index: 'D', + name: 'Square Permutation', + title: 'D. Square Permutation', + grade: 'Q2', + }, + { + id: 'abc324_c', + contest_id: 'abc324', + problem_index: 'C', + name: 'Error Correction', + title: 'C. Error Correction', + grade: 'Q2', + }, + { + id: 'abc324_b', + contest_id: 'abc324', + problem_index: 'B', + name: '3-smooth Numbers', + title: 'B. 3-smooth Numbers', + grade: 'Q6', + }, + { + id: 'abc324_a', + contest_id: 'abc324', + problem_index: 'A', + name: 'Same', + title: 'A. Same', + grade: 'Q7', + }, + { + id: 'abc323_g', + contest_id: 'abc323', + problem_index: 'G', + name: 'Inversion of Tree', + title: 'G. Inversion of Tree', + grade: 'D5', + }, + { + id: 'abc323_f', + contest_id: 'abc323', + problem_index: 'F', + name: 'Push and Carry', + title: 'F. Push and Carry', + grade: 'D1', + }, + { + id: 'abc323_e', + contest_id: 'abc323', + problem_index: 'E', + name: 'Playlist', + title: 'E. Playlist', + grade: 'D1', + }, + { + id: 'abc323_d', + contest_id: 'abc323', + problem_index: 'D', + name: 'Merge Slimes', + title: 'D. Merge Slimes', + grade: 'Q2', + }, + { + id: 'abc323_c', + contest_id: 'abc323', + problem_index: 'C', + name: 'World Tour Finals', + title: 'C. World Tour Finals', + grade: 'Q4', + }, + { + id: 'abc323_b', + contest_id: 'abc323', + problem_index: 'B', + name: 'Round-Robin Tournament', + title: 'B. Round-Robin Tournament', + grade: 'Q5', + }, + { + id: 'abc323_a', + contest_id: 'abc323', + problem_index: 'A', + name: 'Weak Beats', + title: 'A. Weak Beats', + grade: 'Q7', + }, + { + id: 'abc322_g', + contest_id: 'abc322', + problem_index: 'G', + name: 'Two Kinds of Base', + title: 'G. Two Kinds of Base', + grade: 'D4', + }, + { + id: 'abc322_f', + contest_id: 'abc322', + problem_index: 'F', + name: 'Vacation Query', + title: 'F. Vacation Query', + grade: 'D2', + }, + { + id: 'abc322_e', + contest_id: 'abc322', + problem_index: 'E', + name: 'Product Development', + title: 'E. Product Development', + grade: 'Q1', + }, + { + id: 'abc322_d', + contest_id: 'abc322', + problem_index: 'D', + name: 'Polyomino', + title: 'D. Polyomino', + grade: 'Q1', + }, + { + id: 'abc322_c', + contest_id: 'abc322', + problem_index: 'C', + name: 'Festival', + title: 'C. Festival', + grade: 'Q5', + }, + { + id: 'abc322_b', + contest_id: 'abc322', + problem_index: 'B', + name: 'Prefix and Suffix', + title: 'B. Prefix and Suffix', + grade: 'Q6', + }, + { + id: 'abc322_a', + contest_id: 'abc322', + problem_index: 'A', + name: 'First ABC 2', + title: 'A. First ABC 2', + grade: 'Q7', + }, + { + id: 'abc321_g', + contest_id: 'abc321', + problem_index: 'G', + name: 'Electric Circuit', + title: 'G. Electric Circuit', + grade: 'D4', + }, + { + id: 'abc321_f', + contest_id: 'abc321', + problem_index: 'F', + name: '#(subset sum = K) with Add and Erase ', + title: 'F. #(subset sum = K) with Add and Erase ', + grade: 'D2', + }, + { + id: 'abc321_e', + contest_id: 'abc321', + problem_index: 'E', + name: 'Complete Binary Tree', + title: 'E. Complete Binary Tree', + grade: 'D2', + }, + { + id: 'abc321_d', + contest_id: 'abc321', + problem_index: 'D', + name: 'Set Menu', + title: 'D. Set Menu', + grade: 'Q2', + }, + { + id: 'abc321_c', + contest_id: 'abc321', + problem_index: 'C', + name: '321-like Searcher', + title: 'C. 321-like Searcher', + grade: 'Q2', + }, + { + id: 'abc321_b', + contest_id: 'abc321', + problem_index: 'B', + name: 'Cutoff', + title: 'B. Cutoff', + grade: 'Q5', + }, + { + id: 'abc321_a', + contest_id: 'abc321', + problem_index: 'A', + name: '321-like Checker', + title: 'A. 321-like Checker', + grade: 'Q7', + }, + { + id: 'abc320_g', + contest_id: 'abc320', + problem_index: 'G', + name: 'Slot Strategy 2 (Hard)', + title: 'G. Slot Strategy 2 (Hard)', + grade: 'D4', + }, + { + id: 'abc320_f', + contest_id: 'abc320', + problem_index: 'F', + name: 'Fuel Round Trip', + title: 'F. Fuel Round Trip', + grade: 'D3', + }, + { + id: 'abc320_e', + contest_id: 'abc320', + problem_index: 'E', + name: 'Somen Nagashi', + title: 'E. Somen Nagashi', + grade: 'Q1', + }, + { + id: 'abc320_d', + contest_id: 'abc320', + problem_index: 'D', + name: 'Relative Position', + title: 'D. Relative Position', + grade: 'Q1', + }, + { + id: 'abc320_c', + contest_id: 'abc320', + problem_index: 'C', + name: 'Slot Strategy 2 (Easy)', + title: 'C. Slot Strategy 2 (Easy)', + grade: 'Q2', + }, + { + id: 'abc320_b', + contest_id: 'abc320', + problem_index: 'B', + name: 'Longest Palindrome', + title: 'B. Longest Palindrome', + grade: 'Q6', + }, + { + id: 'abc320_a', + contest_id: 'abc320', + problem_index: 'A', + name: 'Leyland Number', + title: 'A. Leyland Number', + grade: 'Q8', + }, + { + id: 'abc319_g', + contest_id: 'abc319', + problem_index: 'G', + name: 'Counting Shortest Paths', + title: 'G. Counting Shortest Paths', + grade: 'D3', + }, + { + id: 'abc319_f', + contest_id: 'abc319', + problem_index: 'F', + name: 'Fighter Takahashi', + title: 'F. Fighter Takahashi', + grade: 'D3', + }, + { + id: 'abc319_e', + contest_id: 'abc319', + problem_index: 'E', + name: 'Bus Stops', + title: 'E. Bus Stops', + grade: 'D1', + }, + { + id: 'abc319_d', + contest_id: 'abc319', + problem_index: 'D', + name: 'Minimum Width', + title: 'D. Minimum Width', + grade: 'Q2', + }, + { + id: 'abc319_c', + contest_id: 'abc319', + problem_index: 'C', + name: 'False Hope', + title: 'C. False Hope', + grade: 'Q1', + }, + { + id: 'abc319_b', + contest_id: 'abc319', + problem_index: 'B', + name: 'Measure', + title: 'B. Measure', + grade: 'Q6', + }, + { + id: 'abc319_a', + contest_id: 'abc319', + problem_index: 'A', + name: 'Legendary Players', + title: 'A. Legendary Players', + grade: 'Q8', + }, + { + id: 'abc318_h', + contest_id: 'abc318', + problem_index: 'Ex', + name: 'Count Strong Test Cases', + title: 'Ex. Count Strong Test Cases', + grade: 'D4', + }, + { + id: 'abc318_g', + contest_id: 'abc318', + problem_index: 'G', + name: 'Typical Path Problem', + title: 'G. Typical Path Problem', + grade: 'D3', + }, + { + id: 'abc318_f', + contest_id: 'abc318', + problem_index: 'F', + name: 'Octopus', + title: 'F. Octopus', + grade: 'D3', + }, + { + id: 'abc318_e', + contest_id: 'abc318', + problem_index: 'E', + name: 'Sandwiches', + title: 'E. Sandwiches', + grade: 'Q1', + }, + { + id: 'abc318_d', + contest_id: 'abc318', + problem_index: 'D', + name: 'General Weighted Max Matching', + title: 'D. General Weighted Max Matching', + grade: 'Q1', + }, + { + id: 'abc318_c', + contest_id: 'abc318', + problem_index: 'C', + name: 'Blue Spring', + title: 'C. Blue Spring', + grade: 'Q3', + }, + { + id: 'abc318_b', + contest_id: 'abc318', + problem_index: 'B', + name: 'Overlapping sheets', + title: 'B. Overlapping sheets', + grade: 'Q6', + }, + { + id: 'abc318_a', + contest_id: 'abc318', + problem_index: 'A', + name: 'Full Moon', + title: 'A. Full Moon', + grade: 'Q7', + }, + { + id: 'abc317_h', + contest_id: 'abc317', + problem_index: 'Ex', + name: 'Walk', + title: 'Ex. Walk', + }, + { + id: 'abc317_g', + contest_id: 'abc317', + problem_index: 'G', + name: 'Rearranging', + title: 'G. Rearranging', + }, + { + id: 'abc317_f', + contest_id: 'abc317', + problem_index: 'F', + name: 'Nim', + title: 'F. Nim', + }, + { + id: 'abc317_e', + contest_id: 'abc317', + problem_index: 'E', + name: 'Avoid Eye Contact', + title: 'E. Avoid Eye Contact', + }, + { + id: 'abc317_d', + contest_id: 'abc317', + problem_index: 'D', + name: 'President', + title: 'D. President', + }, + { + id: 'abc317_c', + contest_id: 'abc317', + problem_index: 'C', + name: 'Remembering the Days', + title: 'C. Remembering the Days', + grade: 'Q2', + }, + { + id: 'abc317_b', + contest_id: 'abc317', + problem_index: 'B', + name: 'MissingNo.', + title: 'B. MissingNo.', + grade: 'Q6', + }, + { + id: 'abc317_a', + contest_id: 'abc317', + problem_index: 'A', + name: 'Potions', + title: 'A. Potions', + grade: 'Q7', + }, + { + id: 'abc315_h', + contest_id: 'abc315', + problem_index: 'Ex', + name: 'Typical Convolution Problem', + title: 'Ex. Typical Convolution Problem', + }, + { + id: 'abc315_g', + contest_id: 'abc315', + problem_index: 'G', + name: 'Ai + Bj + Ck = X (1 <= i, j, k <= N)', + title: 'G. Ai + Bj + Ck = X (1 <= i, j, k <= N)', + grade: 'D3', + }, + { + id: 'abc315_f', + contest_id: 'abc315', + problem_index: 'F', + name: 'Shortcuts', + title: 'F. Shortcuts', + grade: 'D1', + }, + { + id: 'abc315_e', + contest_id: 'abc315', + problem_index: 'E', + name: 'Prerequisites', + title: 'E. Prerequisites', + }, + { + id: 'abc315_d', + contest_id: 'abc315', + problem_index: 'D', + name: 'Magical Cookies', + title: 'D. Magical Cookies', + grade: 'D1', + }, + { + id: 'abc315_c', + contest_id: 'abc315', + problem_index: 'C', + name: 'Flavors', + title: 'C. Flavors', + grade: 'Q4', + }, + { + id: 'abc315_b', + contest_id: 'abc315', + problem_index: 'B', + name: 'The Middle Day', + title: 'B. The Middle Day', + grade: 'Q6', + }, + { + id: 'abc315_a', + contest_id: 'abc315', + problem_index: 'A', + name: 'tcdr', + title: 'A. tcdr', + grade: 'Q7', + }, + { + id: 'abc314_h', + contest_id: 'abc314', + problem_index: 'Ex', + name: 'Disk and Segments', + title: 'Ex. Disk and Segments', + grade: 'D4', + }, + { + id: 'abc314_g', + contest_id: 'abc314', + problem_index: 'G', + name: 'Amulets', + title: 'G. Amulets', + }, + { + id: 'abc314_f', + contest_id: 'abc314', + problem_index: 'F', + name: 'A Certain Game', + title: 'F. A Certain Game', + }, + { + id: 'abc314_e', + contest_id: 'abc314', + problem_index: 'E', + name: 'Roulettes', + title: 'E. Roulettes', + }, + { + id: 'abc314_d', + contest_id: 'abc314', + problem_index: 'D', + name: 'LOWER', + title: 'D. LOWER', + }, + { + id: 'abc314_c', + contest_id: 'abc314', + problem_index: 'C', + name: 'Rotate Colored Subsequence', + title: 'C. Rotate Colored Subsequence', + grade: 'Q3', + }, + { + id: 'abc314_b', + contest_id: 'abc314', + problem_index: 'B', + name: 'Roulette', + title: 'B. Roulette', + grade: 'Q5', + }, + { + id: 'abc314_a', + contest_id: 'abc314', + problem_index: 'A', + name: '3.14', + title: 'A. 3.14', + grade: 'Q7', + }, + { + id: 'abc313_h', + contest_id: 'abc313', + problem_index: 'Ex', + name: 'Group Photo', + title: 'Ex. Group Photo', + }, + { + id: 'abc313_g', + contest_id: 'abc313', + problem_index: 'G', + name: 'Redistribution of Piles', + title: 'G. Redistribution of Piles', + }, + { + id: 'abc313_f', + contest_id: 'abc313', + problem_index: 'F', + name: 'Flip Machines', + title: 'F. Flip Machines', + }, + { + id: 'abc313_e', + contest_id: 'abc313', + problem_index: 'E', + name: 'Duplicate', + title: 'E. Duplicate', + }, + { + id: 'abc313_d', + contest_id: 'abc313', + problem_index: 'D', + name: 'Odd or Even', + title: 'D. Odd or Even', + }, + { + id: 'abc313_c', + contest_id: 'abc313', + problem_index: 'C', + name: 'Approximate Equalization 2', + title: 'C. Approximate Equalization 2', + grade: 'Q2', + }, + { + id: 'abc313_b', + contest_id: 'abc313', + problem_index: 'B', + name: 'Who is Saikyo?', + title: 'B. Who is Saikyo?', + grade: 'Q4', + }, + { + id: 'abc313_a', + contest_id: 'abc313', + problem_index: 'A', + name: 'To Be Saikyo', + title: 'A. To Be Saikyo', + grade: 'Q6', + }, + { + id: 'abc312_h', + contest_id: 'abc312', + problem_index: 'Ex', + name: 'snukesnuke', + title: 'Ex. snukesnuke', + }, + { + id: 'abc312_g', + contest_id: 'abc312', + problem_index: 'G', + name: 'Avoid Straight Line', + title: 'G. Avoid Straight Line', + }, + { + id: 'abc312_f', + contest_id: 'abc312', + problem_index: 'F', + name: 'Cans and Openers', + title: 'F. Cans and Openers', + grade: 'D1', + }, + { + id: 'abc312_e', + contest_id: 'abc312', + problem_index: 'E', + name: 'Tangency of Cuboids ', + title: 'E. Tangency of Cuboids ', + }, + { + id: 'abc312_d', + contest_id: 'abc312', + problem_index: 'D', + name: 'Count Bracket Sequences', + title: 'D. Count Bracket Sequences', + }, + { + id: 'abc312_c', + contest_id: 'abc312', + problem_index: 'C', + name: 'Invisible Hand', + title: 'C. Invisible Hand', + grade: 'Q2', + }, + { + id: 'abc312_b', + contest_id: 'abc312', + problem_index: 'B', + name: 'TaK Code', + title: 'B. TaK Code', + grade: 'Q5', + }, + { + id: 'abc312_a', + contest_id: 'abc312', + problem_index: 'A', + name: 'Chord', + title: 'A. Chord', + grade: 'Q8', + }, + { + id: 'abc311_h', + contest_id: 'abc311', + problem_index: 'Ex', + name: 'Many Illumination Plans', + title: 'Ex. Many Illumination Plans', + grade: 'D6', + }, + { + id: 'abc311_g', + contest_id: 'abc311', + problem_index: 'G', + name: 'One More Grid Task', + title: 'G. One More Grid Task', + grade: 'D3', + }, + { + id: 'abc311_f', + contest_id: 'abc311', + problem_index: 'F', + name: 'Yet Another Grid Task', + title: 'F. Yet Another Grid Task', + }, + { + id: 'abc311_e', + contest_id: 'abc311', + problem_index: 'E', + name: 'Defect-free Squares', + title: 'E. Defect-free Squares', + }, + { + id: 'abc311_d', + contest_id: 'abc311', + problem_index: 'D', + name: 'Grid Ice Floor', + title: 'D. Grid Ice Floor', + }, + { + id: 'abc311_c', + contest_id: 'abc311', + problem_index: 'C', + name: 'Find it!', + title: 'C. Find it!', + grade: 'Q3', + }, + { + id: 'abc311_b', + contest_id: 'abc311', + problem_index: 'B', + name: 'Vacation Together', + title: 'B. Vacation Together', + grade: 'Q6', + }, + { + id: 'abc311_a', + contest_id: 'abc311', + problem_index: 'A', + name: 'First ABC', + title: 'A. First ABC', + grade: 'Q7', + }, + { + id: 'abc310_h', + contest_id: 'abc310', + problem_index: 'Ex', + name: 'Negative Cost', + title: 'Ex. Negative Cost', + }, + { + id: 'abc310_g', + contest_id: 'abc310', + problem_index: 'G', + name: 'Takahashi And Pass-The-Ball Game', + title: 'G. Takahashi And Pass-The-Ball Game', + }, + { + id: 'abc310_f', + contest_id: 'abc310', + problem_index: 'F', + name: 'Make 10 Again', + title: 'F. Make 10 Again', + }, + { + id: 'abc310_e', + contest_id: 'abc310', + problem_index: 'E', + name: 'NAND repeatedly', + title: 'E. NAND repeatedly', + }, + { + id: 'abc310_d', + contest_id: 'abc310', + problem_index: 'D', + name: 'Peaceful Teams', + title: 'D. Peaceful Teams', + grade: 'Q1', + }, + { + id: 'abc310_c', + contest_id: 'abc310', + problem_index: 'C', + name: 'Reversible', + title: 'C. Reversible', + grade: 'Q4', + }, + { + id: 'abc310_b', + contest_id: 'abc310', + problem_index: 'B', + name: 'Strictly Superior', + title: 'B. Strictly Superior', + grade: 'Q4', + }, + { + id: 'abc310_a', + contest_id: 'abc310', + problem_index: 'A', + name: 'Order Something Else', + title: 'A. Order Something Else', + grade: 'Q7', + }, + { + id: 'abc309_h', + contest_id: 'abc309', + problem_index: 'Ex', + name: 'Simple Path Counting Problem', + title: 'Ex. Simple Path Counting Problem', + }, + { + id: 'abc309_g', + contest_id: 'abc309', + problem_index: 'G', + name: 'Ban Permutation', + title: 'G. Ban Permutation', + }, + { + id: 'abc309_f', + contest_id: 'abc309', + problem_index: 'F', + name: 'Box in Box', + title: 'F. Box in Box', + }, + { + id: 'abc309_e', + contest_id: 'abc309', + problem_index: 'E', + name: 'Family and Insurance', + title: 'E. Family and Insurance', + }, + { + id: 'abc309_d', + contest_id: 'abc309', + problem_index: 'D', + name: 'Add One Edge', + title: 'D. Add One Edge', + }, + { + id: 'abc309_c', + contest_id: 'abc309', + problem_index: 'C', + name: 'Medicine', + title: 'C. Medicine', + grade: 'Q3', + }, + { + id: 'abc309_b', + contest_id: 'abc309', + problem_index: 'B', + name: 'Rotate', + title: 'B. Rotate', + grade: 'Q5', + }, + { + id: 'abc309_a', + contest_id: 'abc309', + problem_index: 'A', + name: 'Nine', + title: 'A. Nine', + grade: 'Q7', + }, + { + id: 'abc308_h', + contest_id: 'abc308', + problem_index: 'Ex', + name: 'Make Q', + title: 'Ex. Make Q', + }, + { + id: 'abc308_g', + contest_id: 'abc308', + problem_index: 'G', + name: 'Minimum Xor Pair Query', + title: 'G. Minimum Xor Pair Query', + grade: 'D2', + }, + { + id: 'abc308_f', + contest_id: 'abc308', + problem_index: 'F', + name: 'Vouchers', + title: 'F. Vouchers', + grade: 'Q1', + }, + { + id: 'abc308_e', + contest_id: 'abc308', + problem_index: 'E', + name: 'MEX', + title: 'E. MEX', + grade: 'Q1', + }, + { + id: 'abc308_d', + contest_id: 'abc308', + problem_index: 'D', + name: 'Snuke Maze', + title: 'D. Snuke Maze', + }, + { + id: 'abc308_c', + contest_id: 'abc308', + problem_index: 'C', + name: 'Standings', + title: 'C. Standings', + grade: 'Q4', + }, + { + id: 'abc308_b', + contest_id: 'abc308', + problem_index: 'B', + name: 'Default Price', + title: 'B. Default Price', + grade: 'Q6', + }, + { + id: 'abc308_a', + contest_id: 'abc308', + problem_index: 'A', + name: 'New Scheme', + title: 'A. New Scheme', + grade: 'Q7', + }, + { + id: 'abc307_h', + contest_id: 'abc307', + problem_index: 'Ex', + name: 'Marquee', + title: 'Ex. Marquee', + }, + { + id: 'abc307_g', + contest_id: 'abc307', + problem_index: 'G', + name: 'Approximate Equalization', + title: 'G. Approximate Equalization', + }, + { + id: 'abc307_f', + contest_id: 'abc307', + problem_index: 'F', + name: 'Virus 2', + title: 'F. Virus 2', + grade: 'D3', + }, + { + id: 'abc307_e', + contest_id: 'abc307', + problem_index: 'E', + name: 'Distinct Adjacent', + title: 'E. Distinct Adjacent', + grade: 'Q1', + }, + { + id: 'abc307_d', + contest_id: 'abc307', + problem_index: 'D', + name: 'Mismatched Parentheses', + title: 'D. Mismatched Parentheses', + grade: 'Q2', + }, + { + id: 'abc307_c', + contest_id: 'abc307', + problem_index: 'C', + name: 'Ideal Sheet', + title: 'C. Ideal Sheet', + grade: 'Q2', + }, + { + id: 'abc307_b', + contest_id: 'abc307', + problem_index: 'B', + name: 'racecar', + title: 'B. racecar', + grade: 'Q6', + }, + { + id: 'abc307_a', + contest_id: 'abc307', + problem_index: 'A', + name: 'Weekly Records', + title: 'A. Weekly Records', + grade: 'Q7', + }, + { + id: 'abc306_h', + contest_id: 'abc306', + problem_index: 'Ex', + name: 'Balance Scale', + title: 'Ex. Balance Scale', + }, + { + id: 'abc306_g', + contest_id: 'abc306', + problem_index: 'G', + name: 'Return to 1', + title: 'G. Return to 1', + }, + { + id: 'abc306_f', + contest_id: 'abc306', + problem_index: 'F', + name: 'Merge Sets', + title: 'F. Merge Sets', + }, + { + id: 'abc306_e', + contest_id: 'abc306', + problem_index: 'E', + name: 'Best Performances', + title: 'E. Best Performances', + grade: 'D1', + }, + { + id: 'abc306_d', + contest_id: 'abc306', + problem_index: 'D', + name: 'Poisonous Full-Course', + title: 'D. Poisonous Full-Course', + grade: 'Q2', + }, + { + id: 'abc306_c', + contest_id: 'abc306', + problem_index: 'C', + name: 'Centers', + title: 'C. Centers', + grade: 'Q5', + }, + { + id: 'abc306_b', + contest_id: 'abc306', + problem_index: 'B', + name: 'Base 2', + title: 'B. Base 2', + grade: 'Q7', + }, + { + id: 'abc306_a', + contest_id: 'abc306', + problem_index: 'A', + name: 'Echo', + title: 'A. Echo', + grade: 'Q8', + }, + { + id: 'abc305_h', + contest_id: 'abc305', + problem_index: 'Ex', + name: 'Shojin', + title: 'Ex. Shojin', + }, + { + id: 'abc305_g', + contest_id: 'abc305', + problem_index: 'G', + name: 'Banned Substrings', + title: 'G. Banned Substrings', + }, + { + id: 'abc305_f', + contest_id: 'abc305', + problem_index: 'F', + name: 'Dungeon Explore', + title: 'F. Dungeon Explore', + grade: 'D1', + }, + { + id: 'abc305_e', + contest_id: 'abc305', + problem_index: 'E', + name: 'Art Gallery on Graph', + title: 'E. Art Gallery on Graph', + }, + { + id: 'abc305_d', + contest_id: 'abc305', + problem_index: 'D', + name: 'Sleep Log', + title: 'D. Sleep Log', + grade: 'Q2', + }, + { + id: 'abc305_c', + contest_id: 'abc305', + problem_index: 'C', + name: 'Snuke the Cookie Picker', + title: 'C. Snuke the Cookie Picker', + grade: 'Q4', + }, + { + id: 'abc305_b', + contest_id: 'abc305', + problem_index: 'B', + name: 'ABCDEFG', + title: 'B. ABCDEFG', + grade: 'Q6', + }, + { + id: 'abc305_a', + contest_id: 'abc305', + problem_index: 'A', + name: 'Water Station', + title: 'A. Water Station', + grade: 'Q7', + }, + { + id: 'abc304_h', + contest_id: 'abc304', + problem_index: 'Ex', + name: 'Constrained Topological Sort', + title: 'Ex. Constrained Topological Sort', + }, + { + id: 'abc304_g', + contest_id: 'abc304', + problem_index: 'G', + name: 'Max of Medians', + title: 'G. Max of Medians', + }, + { + id: 'abc304_f', + contest_id: 'abc304', + problem_index: 'F', + name: 'Shift Table', + title: 'F. Shift Table', + }, + { + id: 'abc304_e', + contest_id: 'abc304', + problem_index: 'E', + name: 'Good Graph', + title: 'E. Good Graph', + }, + { + id: 'abc304_d', + contest_id: 'abc304', + problem_index: 'D', + name: 'A Piece of Cake', + title: 'D. A Piece of Cake', + grade: 'Q1', + }, + { + id: 'abc304_c', + contest_id: 'abc304', + problem_index: 'C', + name: 'Virus', + title: 'C. Virus', + grade: 'Q3', + }, + { + id: 'abc304_b', + contest_id: 'abc304', + problem_index: 'B', + name: 'Subscribers', + title: 'B. Subscribers', + grade: 'Q7', + }, + { + id: 'abc304_a', + contest_id: 'abc304', + problem_index: 'A', + name: 'First Player', + title: 'A. First Player', + grade: 'Q7', + }, + { + id: 'abc303_h', + contest_id: 'abc303', + problem_index: 'Ex', + name: 'Constrained Tree Degree', + title: 'Ex. Constrained Tree Degree', + }, + { + id: 'abc303_g', + contest_id: 'abc303', + problem_index: 'G', + name: 'Bags Game', + title: 'G. Bags Game', + }, + { + id: 'abc303_f', + contest_id: 'abc303', + problem_index: 'F', + name: 'Damage over Time', + title: 'F. Damage over Time', + }, + { + id: 'abc303_e', + contest_id: 'abc303', + problem_index: 'E', + name: 'A Gift From the Stars', + title: 'E. A Gift From the Stars', + }, + { + id: 'abc303_d', + contest_id: 'abc303', + problem_index: 'D', + name: 'Shift vs. CapsLock', + title: 'D. Shift vs. CapsLock', + grade: 'Q2', + }, + { + id: 'abc303_c', + contest_id: 'abc303', + problem_index: 'C', + name: 'Dash', + title: 'C. Dash', + grade: 'Q4', + }, + { + id: 'abc303_b', + contest_id: 'abc303', + problem_index: 'B', + name: 'Discord', + title: 'B. Discord', + grade: 'Q5', + }, + { + id: 'abc303_a', + contest_id: 'abc303', + problem_index: 'A', + name: 'Similar String', + title: 'A. Similar String', + grade: 'Q7', + }, + { + id: 'abc302_h', + contest_id: 'abc302', + problem_index: 'Ex', + name: 'Ball Collector', + title: 'Ex. Ball Collector', + }, + { + id: 'abc302_g', + contest_id: 'abc302', + problem_index: 'G', + name: 'Sort from 1 to 4', + title: 'G. Sort from 1 to 4', + }, + { + id: 'abc302_f', + contest_id: 'abc302', + problem_index: 'F', + name: 'Merge Set', + title: 'F. Merge Set', + }, + { + id: 'abc302_e', + contest_id: 'abc302', + problem_index: 'E', + name: 'Isolation', + title: 'E. Isolation', + grade: 'Q1', + }, + { + id: 'abc302_d', + contest_id: 'abc302', + problem_index: 'D', + name: 'Impartial Gift', + title: 'D. Impartial Gift', + grade: 'Q3', + }, + { + id: 'abc302_c', + contest_id: 'abc302', + problem_index: 'C', + name: 'Almost Equal', + title: 'C. Almost Equal', + grade: 'Q3', + }, + { + id: 'abc302_b', + contest_id: 'abc302', + problem_index: 'B', + name: 'Find snuke', + title: 'B. Find snuke', + grade: 'Q4', + }, + { + id: 'abc302_a', + contest_id: 'abc302', + problem_index: 'A', + name: 'Attack', + title: 'A. Attack', + grade: 'Q7', + }, + { + id: 'abc301_h', + contest_id: 'abc301', + problem_index: 'Ex', + name: 'Difference of Distance', + title: 'Ex. Difference of Distance', + }, + { + id: 'abc301_g', + contest_id: 'abc301', + problem_index: 'G', + name: 'Worst Picture', + title: 'G. Worst Picture', + }, + { + id: 'abc301_f', + contest_id: 'abc301', + problem_index: 'F', + name: 'Anti-DDoS', + title: 'F. Anti-DDoS', + }, + { + id: 'abc301_e', + contest_id: 'abc301', + problem_index: 'E', + name: 'Pac-Takahashi ', + title: 'E. Pac-Takahashi ', + }, + { + id: 'abc301_d', + contest_id: 'abc301', + problem_index: 'D', + name: 'Bitmask', + title: 'D. Bitmask', + grade: 'Q1', + }, + { + id: 'abc301_c', + contest_id: 'abc301', + problem_index: 'C', + name: 'AtCoder Cards', + title: 'C. AtCoder Cards', + grade: 'Q3', + }, + { + id: 'abc301_b', + contest_id: 'abc301', + problem_index: 'B', + name: ' Fill the Gaps', + title: 'B. Fill the Gaps', + grade: 'Q6', + }, + { + id: 'abc301_a', + contest_id: 'abc301', + problem_index: 'A', + name: 'Overall Winner', + title: 'A. Overall Winner', + grade: 'Q7', + }, + { + id: 'abc300_h', + contest_id: 'abc300', + problem_index: 'Ex', + name: 'Fibonacci: Revisited', + title: 'Ex. Fibonacci: Revisited', + }, + { + id: 'abc300_g', + contest_id: 'abc300', + problem_index: 'G', + name: 'P-smooth number', + title: 'G. P-smooth number', + grade: 'D3', + }, + { + id: 'abc300_f', + contest_id: 'abc300', + problem_index: 'F', + name: 'More Holidays', + title: 'F. More Holidays', + }, + { + id: 'abc300_e', + contest_id: 'abc300', + problem_index: 'E', + name: 'Dice Product 3', + title: 'E. Dice Product 3', + grade: 'D1', + }, + { + id: 'abc300_d', + contest_id: 'abc300', + problem_index: 'D', + name: 'AABCC', + title: 'D. AABCC', + grade: 'Q1', + }, + { + id: 'abc300_c', + contest_id: 'abc300', + problem_index: 'C', + name: 'Cross', + title: 'C. Cross', + grade: 'Q4', + }, + { + id: 'abc300_b', + contest_id: 'abc300', + problem_index: 'B', + name: 'Same Map in the RPG World', + title: 'B. Same Map in the RPG World', + grade: 'Q4', + }, + { + id: 'abc300_a', + contest_id: 'abc300', + problem_index: 'A', + name: 'N-choice question', + title: 'A. N-choice question', + grade: 'Q8', + }, + { + id: 'abc297_e', + contest_id: 'abc297', + problem_index: 'E', + name: 'Kth Takoyaki Set', + title: 'E. Kth Takoyaki Set', + grade: 'Q1', + }, + { + id: 'abc296_b', + contest_id: 'abc296', + problem_index: 'B', + name: 'Chessboard', + title: 'B. Chessboard', + grade: 'Q7', + }, + { + id: 'abc294_b', + contest_id: 'abc294', + problem_index: 'B', + name: 'ASCII Art', + title: 'B. ASCII Art', + grade: 'Q7', + }, + { + id: 'abc284_d', + contest_id: 'abc284', + problem_index: 'D', + name: 'Happy New Year 2023 ', + title: 'D. Happy New Year 2023 ', + grade: 'Q2', + }, + { + id: 'abc284_b', + contest_id: 'abc284', + problem_index: 'B', + name: 'Multi Test Cases', + title: 'B. Multi Test Cases', + grade: 'Q7', + }, + { + id: 'abc282_a', + contest_id: 'abc282', + problem_index: 'A', + name: 'Generalized ABC', + title: 'A. Generalized ABC', + grade: 'Q8', + }, + { + id: 'abc281_a', + contest_id: 'abc281', + problem_index: 'A', + name: 'Count Down', + title: 'A. Count Down', + grade: 'Q8', + }, + { + id: 'abc280_f', + contest_id: 'abc280', + problem_index: 'F', + name: 'Pay or Receive', + title: 'F. Pay or Receive', + grade: 'D2', + }, + { + id: 'abc278_b', + contest_id: 'abc278', + problem_index: 'B', + name: 'Misjudge the Time', + title: 'B. Misjudge the Time', + grade: 'Q6', + }, + { + id: 'abc273_a', + contest_id: 'abc273', + problem_index: 'A', + name: 'A Recursive Function', + title: 'A. A Recursive Function', + grade: 'Q7', + }, + { + id: 'abc269_a', + contest_id: 'abc269', + problem_index: 'A', + name: 'Anyway Takahashi', + title: 'A. Anyway Takahashi', + grade: 'Q9', + }, + { + id: 'abc267_a', + contest_id: 'abc267', + problem_index: 'A', + name: 'Saturday', + title: 'A. Saturday', + grade: 'Q8', + }, + { + id: 'abc263_c', + contest_id: 'abc263', + problem_index: 'C', + name: 'Monotonically Increasing', + title: 'C. Monotonically Increasing', + grade: 'Q4', + }, + { + id: 'abc255_h', + contest_id: 'abc255', + problem_index: 'Ex', + name: 'Range Harvest Query', + title: 'Ex. Range Harvest Query', + grade: 'D3', + }, + { + id: 'abc246_a', + contest_id: 'abc246', + problem_index: 'A', + name: 'Four Points', + title: 'A. Four Points', + grade: 'Q6', + }, + { + id: 'abc245_b', + contest_id: 'abc245', + problem_index: 'B', + name: 'Mex', + title: 'B. Mex', + grade: 'Q6', + }, + { + id: 'abc244_a', + contest_id: 'abc244', + problem_index: 'A', + name: 'Last Letter', + title: 'A. Last Letter', + grade: 'Q9', + }, + { + id: 'abc240_a', + contest_id: 'abc240', + problem_index: 'A', + name: 'Edge Checker', + title: 'A. Edge Checker', + grade: 'Q8', + }, + { + id: 'abc239_a', + contest_id: 'abc239', + problem_index: 'A', + name: 'Horizon', + title: 'A. Horizon', + grade: 'Q8', + }, + { + id: 'abc234_g', + contest_id: 'abc234', + problem_index: 'G', + name: 'Divide a Sequence', + title: 'G. Divide a Sequence', + grade: 'D3', + }, + { + id: 'abc234_a', + contest_id: 'abc234', + problem_index: 'A', + name: 'Weird Function', + title: 'A. Weird Function', + grade: 'Q7', + }, + { + id: 'abc233_d', + contest_id: 'abc233', + problem_index: 'D', + name: 'Count Interval', + title: 'D. Count Interval', + grade: 'Q2', + }, + { + id: 'abc231_a', + contest_id: 'abc231', + problem_index: 'A', + name: 'Water Pressure', + title: 'A. Water Pressure', + grade: 'Q9', + }, + { + id: 'abc225_a', + contest_id: 'abc225', + problem_index: 'A', + name: 'Distinct Strings', + title: 'A. Distinct Strings', + grade: 'Q7', + }, + { + id: 'abc219_e', + contest_id: 'abc219', + problem_index: 'E', + name: 'Moat', + title: 'E. Moat', + grade: 'D1', + }, + { + id: 'abc219_a', + contest_id: 'abc219', + problem_index: 'A', + name: 'AtCoder Quiz 2', + title: 'A. AtCoder Quiz 2', + grade: 'Q8', + }, + { + id: 'abc214_a', + contest_id: 'abc214', + problem_index: 'A', + name: 'New Generation ABC', + title: 'A. New Generation ABC', + grade: 'Q8', + }, + { + id: 'abc211_a', + contest_id: 'abc211', + problem_index: 'A', + name: 'Blood Pressure', + title: 'A. Blood Pressure', + grade: 'Q9', + }, + { + id: 'abc205_a', + contest_id: 'abc205', + problem_index: 'A', + name: 'kcal', + title: 'A. kcal', + grade: 'Q9', + }, + { + id: 'abc202_a', + contest_id: 'abc202', + problem_index: 'A', + name: 'Three Dice', + title: 'A. Three Dice', + grade: 'Q9', }, { - id: 'abc302_c', - contest_id: 'abc302', - problem_index: 'C', - name: 'Almost Equal', - title: 'C. Almost Equal', + id: 'abc199_a', + contest_id: 'abc199', + problem_index: 'A', + name: 'Square Inequality', + title: 'A. Square Inequality', + grade: 'Q9', }, { - id: 'abc302_b', - contest_id: 'abc302', - problem_index: 'B', - name: 'Find snuke', - title: 'B. Find snuke', + id: 'abc193_a', + contest_id: 'abc193', + problem_index: 'A', + name: 'Discount', + title: 'A. Discount', }, { - id: 'abc302_a', - contest_id: 'abc302', + id: 'abc188_a', + contest_id: 'abc188', problem_index: 'A', - name: 'Attack', - title: 'A. Attack', - grade: 'Q7', + name: 'Three-Point Shot', + title: 'A. Three-Point Shot', + grade: 'Q8', }, { - id: 'abc301_h', - contest_id: 'abc301', - problem_index: 'Ex', - name: 'Difference of Distance', - title: 'Ex. Difference of Distance', + id: 'abc184_a', + contest_id: 'abc184', + problem_index: 'A', + name: 'Determinant', + title: 'A. Determinant', + grade: 'Q9', }, { - id: 'abc301_g', - contest_id: 'abc301', - problem_index: 'G', - name: 'Worst Picture', - title: 'G. Worst Picture', + id: 'abc183_a', + contest_id: 'abc183', + problem_index: 'A', + name: 'ReLU', + title: 'A. ReLU', + grade: 'Q9', }, { - id: 'abc301_f', - contest_id: 'abc301', - problem_index: 'F', - name: 'Anti-DDoS', - title: 'F. Anti-DDoS', + id: 'abc180_a', + contest_id: 'abc180', + problem_index: 'A', + name: 'box', + title: 'A. box', + grade: 'Q10', }, { - id: 'abc301_e', - contest_id: 'abc301', - problem_index: 'E', - name: 'Pac-Takahashi ', - title: 'E. Pac-Takahashi ', + id: 'abc174_a', + contest_id: 'abc174', + problem_index: 'A', + name: 'Air Conditioner', + title: 'A. Air Conditioner', + grade: 'Q9', }, { - id: 'abc301_d', - contest_id: 'abc301', - problem_index: 'D', - name: 'Bitmask', - title: 'D. Bitmask', + id: 'abc172_a', + contest_id: 'abc172', + problem_index: 'A', + name: 'Calc', + title: 'A. Calc', + grade: 'Q9', }, { - id: 'abc301_c', - contest_id: 'abc301', - problem_index: 'C', - name: 'AtCoder Cards', - title: 'C. AtCoder Cards', + id: 'abc169_a', + contest_id: 'abc169', + problem_index: 'A', + name: 'Multiplication 1', + title: 'A. Multiplication 1', + grade: 'Q10', }, { - id: 'abc301_b', - contest_id: 'abc301', - problem_index: 'B', - name: ' Fill the Gaps', - title: 'B. Fill the Gaps', + id: 'abc163_a', + contest_id: 'abc163', + problem_index: 'A', + name: 'Circle Pond', + title: 'A. Circle Pond', + grade: 'Q9', }, { - id: 'abc301_a', - contest_id: 'abc301', + id: 'abc152_a', + contest_id: 'abc152', problem_index: 'A', - name: 'Overall Winner', - title: 'A. Overall Winner', - grade: 'Q7', + name: 'AC or WA', + title: 'A. AC or WA', + grade: 'Q9', }, { - id: 'abc300_h', - contest_id: 'abc300', - problem_index: 'Ex', - name: 'Fibonacci: Revisited', - title: 'Ex. Fibonacci: Revisited', + id: 'abc150_a', + contest_id: 'abc150', + problem_index: 'A', + name: '500 Yen Coins', + title: 'A. 500 Yen Coins', + grade: 'Q9', }, { - id: 'abc300_g', - contest_id: 'abc300', - problem_index: 'G', - name: 'P-smooth number', - title: 'G. P-smooth number', + id: 'abc146_e', + contest_id: 'abc146', + problem_index: 'E', + name: 'Rem of Sum is Num', + title: 'E. Rem of Sum is Num', + grade: 'D1', }, { - id: 'abc300_f', - contest_id: 'abc300', - problem_index: 'F', - name: 'More Holidays', - title: 'F. More Holidays', + id: 'abc142_a', + contest_id: 'abc142', + problem_index: 'A', + name: 'Odds of Oddness', + title: 'A. Odds of Oddness', + grade: 'Q7', }, { - id: 'abc300_e', - contest_id: 'abc300', - problem_index: 'E', - name: 'Dice Product 3', - title: 'E. Dice Product 3', + id: 'abc140_a', + contest_id: 'abc140', + problem_index: 'A', + name: 'Password', + title: 'A. Password', + grade: 'Q7', }, { - id: 'abc300_d', - contest_id: 'abc300', + id: 'abc123_d', + contest_id: 'abc123', problem_index: 'D', - name: 'AABCC', - title: 'D. AABCC', + name: 'Cake 123', + title: 'D. Cake 123', + grade: 'Q1', }, { - id: 'abc300_c', - contest_id: 'abc300', + id: 'arc188_c', + contest_id: 'arc188', problem_index: 'C', - name: 'Cross', - title: 'C. Cross', - }, - { - id: 'abc300_b', - contest_id: 'abc300', - problem_index: 'B', - name: 'Same Map in the RPG World', - title: 'B. Same Map in the RPG World', + name: 'Honest or Liar or Confused', + title: 'C. Honest or Liar or Confused', + grade: 'D3', }, { - id: 'abc300_a', - contest_id: 'abc300', - problem_index: 'A', - name: 'N-choice question', - title: 'A. N-choice question', - grade: 'Q8', + id: 'arc076_c', + contest_id: 'arc076', + problem_index: 'E', + name: 'Connected?', + title: 'E. Connected?', + grade: 'D2', }, { id: 'practice_1', @@ -2299,4 +4548,284 @@ export const tasks = [ title: 'A. Frog 1', grade: 'Q5', }, + { + id: 'math_and_algorithm_af', + contest_id: 'math-and-algorithm', + problem_index: '034', + name: 'Nearest Points', + title: '034. Nearest Points', + grade: 'Q6', + }, + { + id: 'math_and_algorithm_l', + contest_id: 'math-and-algorithm', + problem_index: '012', + name: 'Primality Test', + title: '012. Primality Test', + grade: 'Q5', + }, + { + id: 'math_and_algorithm_f', + contest_id: 'math-and-algorithm', + problem_index: '006', + name: 'Print 2N+3', + title: '006. Print 2N+3', + grade: 'Q10', + }, + { + id: 'math_and_algorithm_d', + contest_id: 'math-and-algorithm', + problem_index: '004', + name: 'Product of 3 Integers', + title: '004. Product of 3 Integers', + grade: 'Q10', + }, + { + id: 'math_and_algorithm_b', + contest_id: 'math-and-algorithm', + problem_index: '002', + name: 'Sum of 3 Integers', + title: '002. Sum of 3 Integers', + grade: 'Q10', + }, + { + id: 'math_and_algorithm_a', + contest_id: 'math-and-algorithm', + problem_index: '001', + name: 'Print 5+N', + title: '001. Print 5+N', + grade: 'Q10', + }, + { + id: 'tessoku_book_ey', + contest_id: 'tessoku-book', + problem_index: 'C01', + name: 'Tax Rate', + title: 'C01. Tax Rate', + grade: 'Q9', + }, + { + id: 'tessoku_book_eb', + contest_id: 'tessoku-book', + problem_index: 'B55', + name: 'Difference', + title: 'B55. Difference', + grade: 'Q2', + }, + { + id: 'tessoku_book_bz', + contest_id: 'tessoku-book', + problem_index: 'B01', + name: 'A+B Problem', + title: 'B01. A+B Problem', + grade: 'Q10', + }, + { + id: 'tessoku_book_bt', + contest_id: 'tessoku-book', + problem_index: 'A72', + name: 'Tile Painting', + title: 'A72. Tile Painting', + grade: 'Q2', + }, + { + id: 'tessoku_book_bc', + contest_id: 'tessoku-book', + problem_index: 'A55', + name: 'Set', + title: 'A55. Set', + grade: 'Q3', + }, + { + id: 'tessoku_book_ay', + contest_id: 'tessoku-book', + problem_index: 'A51', + name: 'Stack', + title: 'A51. Stack', + grade: 'Q5', + }, + { + id: 'tessoku_book_d', + contest_id: 'tessoku-book', + problem_index: 'A04', + name: 'Binary Representation 1', + title: 'A04. Binary Representation 1', + grade: 'Q6', + }, + { + id: 'tessoku_book_a', + contest_id: 'tessoku-book', + problem_index: 'A01', + name: 'The First Problem', + title: 'A01. The First Problem', + grade: 'Q10', + }, + { + id: 'joi2025_yo1b_a', + contest_id: 'joi2025yo1b', + problem_index: 'A', + name: '徒競走 (Footrace)', + title: 'A. 徒競走 (Footrace)', + grade: 'Q9', + }, + { + id: 'joi2025_yo1a_b', + contest_id: 'joi2025yo1a', + problem_index: 'B', + name: '散歩 (Walking)', + title: 'B. 散歩 (Walking)', + grade: 'Q8', + }, + { + id: 'joi2025_yo1a_a', + contest_id: 'joi2025yo1a', + problem_index: 'A', + name: '鉛筆 2 (Pencils 2)', + title: 'A. 鉛筆 2 (Pencils 2)', + grade: 'Q9', + }, + { + id: 'joi2024_yo1c_a', + contest_id: 'joi2024yo1c', + problem_index: 'A', + name: '分 (Minutes)', + title: 'A. 分 (Minutes)', + grade: 'Q10', + }, + { + id: 'joi2024_yo1a_c', + contest_id: 'joi2024yo1a', + problem_index: 'C', + name: 'ハミング距離 (Hamming Distance)', + title: 'C. ハミング距離 (Hamming Distance)', + grade: 'Q8', + }, + { + id: 'joi2024_yo1a_a', + contest_id: 'joi2024yo1a', + problem_index: 'A', + name: '果物 (Fruit)', + title: 'A. 果物 (Fruit)', + grade: 'Q10', + }, + { + id: 'joi2023_yo1b_b', + contest_id: 'joi2023yo1b', + problem_index: 'B', + name: '三方比較 (Three-Way Comparison)', + title: 'B. 三方比較 (Three-Way Comparison)', + grade: 'Q8', + }, + { + id: 'joi2023_yo1b_a', + contest_id: 'joi2023yo1b', + problem_index: 'A', + name: '時間 (Hour)', + title: 'A. 時間 (Hour)', + grade: 'Q10', + }, + { + id: 'joi2023_yo1a_d', + contest_id: 'joi2023yo1a', + problem_index: 'D', + name: '二人三脚 (Three-Legged Race)', + title: 'D. 二人三脚 (Three-Legged Race)', + grade: 'Q6', + }, + { + id: 'joi2023_yo1a_a', + contest_id: 'joi2023yo1a', + problem_index: 'A', + name: '長方形 (Rectangle)', + title: 'A. 長方形 (Rectangle)', + grade: 'Q10', + }, + { + id: 'joi2022_yo1c_a', + contest_id: 'joi2022yo1c', + problem_index: 'A', + name: '身長 (Height)', + title: 'A. 身長 (Height)', + grade: 'Q10', + }, + { + id: 'joi2022_yo1b_a', + contest_id: 'joi2022yo1b', + problem_index: 'A', + name: '立方体 (Cube)', + title: 'A. 立方体 (Cube)', + grade: 'Q10', + }, + { + id: 'joi2021_yo1b_a', + contest_id: 'joi2021yo1b', + problem_index: 'A', + name: '帰省 (Homecoming)', + title: 'A. 帰省 (Homecoming)', + grade: 'Q8', + }, + { + id: 'joig2021_a', + contest_id: 'joig2021-open', + problem_index: 'A', + name: '金平糖 (Konpeito)', + title: 'A. 金平糖 (Konpeito)', + grade: 'Q8', + }, + { + id: 'joi2016yo_a', + contest_id: 'joi2016yo', + problem_index: 'A', + name: '科目選択 (Selecting Subjects)', + title: 'A. 科目選択 (Selecting Subjects)', + grade: 'Q9', + }, + { + id: 'past18_a', + contest_id: 'past18-open', + problem_index: 'A', + name: '粗大ゴミ', + title: 'A. 粗大ゴミ', + grade: 'Q8', + }, + { + id: 'past202309_a', + contest_id: 'past16-open', + problem_index: 'A', + name: 'ツバメ', + title: 'A. ツバメ', + grade: 'Q8', + }, + { + id: 'past202306_b', + contest_id: 'past15-open', + problem_index: 'B', + name: '殿堂入り', + title: 'B. 殿堂入り', + grade: 'Q9', + }, + { + id: 'past202306_a', + contest_id: 'past15-open', + problem_index: 'A', + name: 'ペナルティ', + title: 'A. ペナルティ', + grade: 'Q10', + }, + { + id: 'past202209_g', + contest_id: 'past202209-open', + problem_index: 'G', + name: 'Wildcards', + title: 'G. Wildcards', + grade: 'Q1', + }, + { + id: 'panasonic2020_a', + contest_id: 'panasonic2020', + problem_index: 'A', + name: 'Kth Term', + title: 'A. Kth Term', + grade: 'Q8', + }, ]; diff --git a/prisma/users.ts b/prisma/users.ts index a97436b81..e6c91fdc8 100644 --- a/prisma/users.ts +++ b/prisma/users.ts @@ -11,3 +11,5 @@ export const users = [ { id: '8', name: 'Frank', role: Roles.USER }, { id: '9', name: 'hogehoge', role: Roles.USER }, ]; + +export const USER_PASSWORD_FOR_SEED = 'Ch0kuda1'; diff --git a/prisma/workbooks.ts b/prisma/workbooks.ts new file mode 100644 index 000000000..21f92b2e3 --- /dev/null +++ b/prisma/workbooks.ts @@ -0,0 +1,620 @@ +import { WorkBookType, type WorkBook } from '../src/lib/types/workbook'; + +function createWorkBookBase(overrides: Partial = {}): WorkBook { + return { + id: 100000, + authorId: '1', + title: '実装力を鍛える問題集', + description: '', + editorialUrl: '', + isPublished: false, + isOfficial: false, + isReplenished: false, + workBookType: WorkBookType.CREATED_BY_USER, + urlSlug: '', // Only include urlSlug when it's explicitly provided + workBookTasks: [], + ...overrides, + }; +} + +export const workbooks = [ + createWorkBookBase({ + title: '標準入出力(1 個の整数)', + description: + '標準入力と標準出力の練習をしましょう。この問題集では、1 個の整数値を標準入力から受け取る問題を集めています。初めてプログラミングをする人に最適の練習問題です。', + editorialUrl: 'https://www.youtube.com/watch?v=CJLvHqP1kbs', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'standard-input-output-1-integer', + workBookTasks: [ + { taskId: 'math_and_algorithm_a', priority: 1, comment: '' }, + { taskId: 'tessoku_book_a', priority: 2, comment: '' }, + { taskId: 'joi2022_yo1b_a', priority: 3, comment: '' }, + { taskId: 'math_and_algorithm_f', priority: 4, comment: '' }, + { taskId: 'joi2023_yo1b_a', priority: 5, comment: '' }, + ], + }), + createWorkBookBase({ + title: '標準入出力(2 個以上の整数)', + description: + '標準入力・標準出力の練習をしましょう。この問題集では、2 個以上の整数値を標準入力から受け取る問題を集めています。', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + workBookTasks: [ + { taskId: 'tessoku_book_bz', priority: 1, comment: '' }, + { taskId: 'abc169_a', priority: 2, comment: '' }, + { taskId: 'math_and_algorithm_b', priority: 3, comment: '' }, + { taskId: 'abc180_a', priority: 4, comment: '' }, + { taskId: 'past202306_a', priority: 5, comment: '' }, + ], + }), + createWorkBookBase({ + title: '10Q 総合問題(全部解く必要はない)', + description: + 'これまでに学んできたことがらを総合的に確認できる問題です。これらの問題のうちのいくつかが解けたら、次のグレード (9Q) に進みましょう!', + isPublished: true, + isOfficial: true, + isReplenished: true, + workBookType: WorkBookType.CURRICULUM, + workBookTasks: [ + { taskId: 'joi2022_yo1c_a', priority: 1, comment: '' }, + { taskId: 'joi2023_yo1a_a', priority: 2, comment: '' }, + { taskId: 'joi2024_yo1a_a', priority: 3, comment: '' }, + { taskId: 'joi2024_yo1c_a', priority: 4, comment: '' }, + { taskId: 'math_and_algorithm_d', priority: 5, comment: '' }, + ], + }), + createWorkBookBase({ + title: '演算子「+」「-」「*」の優先順位', + description: + '10Q の各種問題集でも演算子「+」や「*」は登場しました。今回は、これらの演算子が複雑に絡み合う数式における、演算子の優先順位をマスターしましょう!', + editorialUrl: 'https://atcoder.jp/contests/APG4b/tasks/APG4b_d', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'operator-precedence', + workBookTasks: [ + { taskId: 'abc172_a', priority: 1, comment: '' }, + { taskId: 'abc387_a', priority: 2, comment: '' }, + { taskId: 'abc184_a', priority: 3, comment: '' }, + { taskId: 'abc269_a', priority: 4, comment: '' }, + ], + }), + createWorkBookBase({ + title: '浮動小数点数', + description: '浮動小数点数の扱い方について学びましょう。', + editorialUrl: 'https://atcoder.jp/contests/APG4b/tasks/APG4b_e', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'floating-point-numbers', + workBookTasks: [ + { taskId: 'abc163_a', priority: 1, comment: '' }, + { taskId: 'abc231_a', priority: 2, comment: '' }, + { taskId: 'abc211_a', priority: 3, comment: '' }, + ], + }), + createWorkBookBase({ + title: 'if 文 ①', + description: 'if 文を書く練習をしましょう。', + editorialUrl: 'https://atcoder.jp/contests/APG4b/tasks/APG4b_g', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'if-statement-1', + workBookTasks: [ + { taskId: 'abc174_a', priority: 1, comment: '' }, + { taskId: 'abc334_a', priority: 2, comment: '' }, + { taskId: 'abc152_a', priority: 3, comment: '' }, + { taskId: 'abc150_a', priority: 4, comment: '' }, + { taskId: 'abc199_a', priority: 5, comment: '' }, + ], + }), + createWorkBookBase({ + title: '文字列 ①', + description: '‘d’ のような文字や、”dog” のような文字列の扱いを練習しましょう。', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'string-1', + workBookTasks: [ + { taskId: 'abc325_a', priority: 1, comment: '' }, + { taskId: 'abc244_a', priority: 2, comment: '' }, + { taskId: 'abc335_a', priority: 3, comment: '' }, + ], + }), + createWorkBookBase({ + title: '9Q 総合問題(全部解く必要はない)', + description: + 'これまでに学んできたことがらを総合的に確認できる問題です。これらの問題のうちのいくつかが解けたら、次のグレード (8Q) に進みましょう!', + isPublished: true, + isOfficial: true, + isReplenished: true, + workBookType: WorkBookType.CURRICULUM, + workBookTasks: [ + { taskId: 'abc388_a', priority: 1, comment: '' }, + { taskId: 'abc183_a', priority: 2, comment: '' }, + { taskId: 'joi2025_yo1a_a', priority: 3, comment: '' }, + { taskId: 'joi2016yo_a', priority: 4, comment: '' }, + { taskId: 'past202306_b', priority: 5, comment: '' }, + ], + }), + createWorkBookBase({ + title: '9Q 数学', + description: + 'AtCoder の数学的な問題に苦手意識がある方向けの問題集です。これらの問題を通して、数学の感覚を集中的に磨いていきましょう!', + isPublished: true, + isOfficial: true, + isReplenished: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'math-9q', + workBookTasks: [ + { taskId: 'abc205_a', priority: 1, comment: '' }, + { taskId: 'abc202_a', priority: 2, comment: '' }, + { taskId: 'abc193_a', priority: 3, comment: '' }, + { taskId: 'joi2025_yo1b_a', priority: 4, comment: '' }, + { taskId: 'tessoku_book_ey', priority: 5, comment: '' }, + ], + }), + createWorkBookBase({ + title: 'if 文 ②(else if 文)', + description: + '9Q でも if 文を学びましたが、さらに発展させましょう。else if 文(C++)、elif 文(Python)を用いることで、3 通り以上の場合分けも実行できます。', + editorialUrl: 'https://atcoder.jp/contests/APG4b/tasks/APG4b_g', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'if-statement-2', + workBookTasks: [ + { taskId: 'joi2023_yo1b_b', priority: 1, comment: '' }, + { taskId: 'abc219_a', priority: 2, comment: '' }, + { taskId: 'abc267_a', priority: 3, comment: '' }, + { taskId: 'abc365_a', priority: 4, comment: '' }, + { taskId: 'abc362_a', priority: 5, comment: '' }, + ], + }), + createWorkBookBase({ + title: 'while 文', + description: + 'いよいよ繰り返し処理を実装できる制御構文の 1 つである while 文の登場です! while 文は、条件を満たしている限り、処理を反復する構文です。while 文が使えるようになると、実現できる処理のバリエーションが大きく広がります。', + editorialUrl: 'https://atcoder.jp/contests/APG4b/tasks/APG4b_k', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'while-statement', + workBookTasks: [ + { taskId: 'APG4b_cm', priority: 1, comment: '' }, + { taskId: 'APG4bPython_co', priority: 2, comment: '' }, + { taskId: 'abc336_a', priority: 3, comment: '' }, + { taskId: 'abc281_a', priority: 4, comment: '' }, + ], + }), + createWorkBookBase({ + title: 'for 文 ①(N 回処理する)', + description: + 'for 文は、while 文を用いて実現できる繰り返し処理のうち、よくあるパターンを短く書けるものです。for 文を書けるようになることは、プログラミング入門の登竜門と言えます。しっかり練習してマスターしましょう!', + editorialUrl: 'https://atcoder.jp/contests/APG4b/tasks/APG4b_l', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'for-statement-1', + workBookTasks: [ + { taskId: 'APG4b_cm', priority: 1, comment: '' }, + { taskId: 'APG4bPython_co', priority: 2, comment: '' }, + { taskId: 'abc333_a', priority: 3, comment: '' }, + { taskId: 'abc282_a', priority: 4, comment: '' }, + { taskId: 'abc341_a', priority: 5, comment: '' }, + ], + }), + createWorkBookBase({ + title: '関数 abs(), sqrt()', + description: + '9Q では関数 max(), min() を学びました。ここでは、さらに関数 abs(), sqrt() を学びましょう。x の絶対値は関数 abs() を用いて abs(x) と求められます。x の平方根は関数 sqrt() を用いて sqrt(x) と求められます。', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'abs-sqrt', + workBookTasks: [ + { taskId: 'abc239_a', priority: 1, comment: '' }, + { taskId: 'abc188_a', priority: 2, comment: '' }, + ], + }), + createWorkBookBase({ + title: '8Q 数学', + description: + 'AtCoder の数学的な問題に苦手意識がある方向けの問題集です。これらの問題を通して、数学の感覚を集中的に磨いていきましょう!', + isPublished: true, + isOfficial: true, + isReplenished: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'math-8q', + workBookTasks: [ + { taskId: 'abc400_a', priority: 1, comment: '' }, + { taskId: 'abc343_a', priority: 2, comment: '' }, + { taskId: 'abc240_a', priority: 3, comment: '' }, + { taskId: 'joi2025_yo1a_b', priority: 4, comment: '' }, + { taskId: 'joig2021_a', priority: 5, comment: '' }, + ], + }), + createWorkBookBase({ + title: '不等式「A <= x <= B」の判定(C++ 向け)', + isPublished: true, + isOfficial: true, + isReplenished: true, + workBookType: WorkBookType.CURRICULUM, + workBookTasks: [ + { taskId: 'past202309_a', priority: 1, comment: '' }, + { taskId: 'abc401_a', priority: 2, comment: '' }, + { taskId: 'abc352_a', priority: 3, comment: '' }, + { taskId: 'joi2021_yo1b_a', priority: 4, comment: '' }, + ], + }), + createWorkBookBase({ + title: '8Q 総合問題(全部解く必要はない)', + description: + 'これまでに学んできたことがらを総合的に確認できる問題です。これらの問題のうちのいくつかが解けたら、次のグレード (7Q) に進みましょう!', + isPublished: true, + isOfficial: true, + isReplenished: true, + workBookType: WorkBookType.CURRICULUM, + workBookTasks: [ + { taskId: 'abc406_a', priority: 1, comment: '' }, + { taskId: 'abc401_a', priority: 2, comment: '' }, + { taskId: 'abc397_a', priority: 3, comment: '' }, + { taskId: 'abc394_a', priority: 4, comment: '' }, + { taskId: 'abc392_a', priority: 5, comment: '' }, + { taskId: 'abc391_a', priority: 6, comment: '' }, + { taskId: 'abc384_a', priority: 7, comment: '' }, + { taskId: 'joi2024_yo1a_c', priority: 8, comment: '' }, + { taskId: 'past18_a', priority: 9, comment: '' }, + { taskId: 'panasonic2020_a', priority: 10, comment: '' }, + ], + }), + createWorkBookBase({ + title: 'for 文 ③(最大値・最小値)', + description: + 'for 文を用いると、N 個の値の最大値や最小値を求めることもできます。今後さまざまなアルゴリズムの基礎になる重要な処理ですので、しっかりと練習してマスターしておきましょう!', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'for-statement-3', + workBookTasks: [ + { taskId: 'abc329_b', priority: 1, comment: '' }, + { taskId: 'abc310_a', priority: 2, comment: '' }, + { taskId: 'abc304_a', priority: 3, comment: '' }, + ], + }), + createWorkBookBase({ + title: '多重 for 文 ①・二次元グリッド ①', + description: + '「配列の配列」や「文字列の配列」を用いると、数値や文字を長方形の形状に並べたデータを扱えるようになります。このようなデータを二次元グリッドと呼ぶことにしましょう。二次元グリッドの各マスにアクセスするためには、for 文を二重にネストした “二重 for 文” を活用します。', + editorialUrl: 'https://atcoder.jp/contests/APG4b/tasks/APG4b_t', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'nested-for-statement-1', + workBookTasks: [ + { taskId: 'abc294_b', priority: 1, comment: '' }, + { taskId: 'abc351_b', priority: 2, comment: '' }, + { taskId: 'abc296_b', priority: 3, comment: '' }, + ], + }), + createWorkBookBase({ + title: '関数 ', + description: + 'プログラムを書くとき、特定の処理を「関数」として切り出してまとめることで、綺麗なプログラムになることが多々あります。ここでは、「関数」が有効な問題をいくつか解いてみましょう!', + editorialUrl: 'https://atcoder.jp/contests/APG4b/tasks/APG4b_p', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'function', + workBookTasks: [ + { taskId: 'abc234_a', priority: 1, comment: '' }, + { taskId: 'abc284_b', priority: 2, comment: '' }, + { taskId: 'abc273_a', priority: 3, comment: '' }, + ], + }), + createWorkBookBase({ + title: '8Q までの技術の組合せ', + description: + '8Q では if 文や for 文など、さまざまな技術が登場しました。7Q では、これらの技術をさらに深めていきます。まずは、if 文や for 文を組み合わせて解く問題を解いて、制御構文のセンスを磨いていきましょう! この問題集は分量こそ多いですが、新しい概念は登場しないので、一気に駆け抜けるように解いていきましょう。', + isPublished: true, + isOfficial: true, + isReplenished: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'combination-of-8q-techniques', + workBookTasks: [ + { taskId: 'abc357_b', priority: 1, comment: '' }, + { taskId: 'abc303_a', priority: 2, comment: '' }, + { taskId: 'abc301_a', priority: 3, comment: '' }, + ], + }), + createWorkBookBase({ + title: '7Q 総合問題(全部解く必要はない)', + description: + 'これまでに学んできたことがらを総合的に確認できる問題です。これらの問題のうちのいくつかが解けたら、次のグレード (6Q) に進みましょう!', + isPublished: true, + isOfficial: true, + isReplenished: true, + workBookType: WorkBookType.CURRICULUM, + workBookTasks: [ + { taskId: 'abc407_a', priority: 1, comment: '' }, + { taskId: 'abc405_a', priority: 2, comment: '' }, + { taskId: 'abc398_a', priority: 3, comment: '' }, + { taskId: 'abc387_a', priority: 4, comment: '' }, + { taskId: 'abc380_a', priority: 5, comment: '' }, + ], + }), + createWorkBookBase({ + title: '7Q 数え上げ問題', + isPublished: true, + isOfficial: true, + isReplenished: true, + workBookType: WorkBookType.CURRICULUM, + workBookTasks: [ + { taskId: 'abc142_a', priority: 1, comment: '' }, + { taskId: 'abc140_a', priority: 2, comment: '' }, + { taskId: 'abc225_a', priority: 3, comment: '' }, + ], + }), + createWorkBookBase({ + title: '全探索 ①(全探索の基本)', + description: + '基本的にほとんどの問題は、計算時間を度外視すれば、考えられる場合をすべて調べ上げることによって解決できます。考えられる場合をすべて調べることを「全探索」と呼びます。全探索の練習をしていきましょう。', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'exhaustive-search-1', + workBookTasks: [ + { taskId: 'abc342_a', priority: 1, comment: '' }, + { taskId: 'abc393_b', priority: 2, comment: '' }, + { taskId: 'abc307_b', priority: 3, comment: '' }, + ], + }), + createWorkBookBase({ + title: 'バケット', + description: + 'たとえば、あるデータの中に各整数が含まれるかどうかを効率的に管理したいとき、次のように定義された配列 T を用いることが有効です。T[x] := True (x が含まれるとき), False (x が含まれないとき)。このように、各整数 x に対して所定の値を対応させた配列をバケットと呼ぶことがあります。ここではバケットを扱う練習をしていきましょう。', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'bucket', + workBookTasks: [ + { taskId: 'abc245_b', priority: 1, comment: '' }, + { taskId: 'abc350_b', priority: 2, comment: '' }, + { taskId: 'abc371_b', priority: 3, comment: '' }, + { + taskId: 'joi2023_yo1a_d', + priority: 4, + comment: '問題集「多重 for 文 ③」でも解いた問題ですが、バケットで解くこともできます。', + }, + ], + }), + createWorkBookBase({ + title: 'ビット演算 ①・二進法', + description: + 'AND、OR、XOR などのビット演算子は、0 と 1 に対して定義されるものだと考えている方は多いかもしれません。しかしながら、より一般に、正の整数に関する演算子として定義することもできます。その際には、整数の二進法表現を活用します。', + editorialUrl: 'https://algo-method.com/courses/5a4e0f16a033e228', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'bit-operation-1', + workBookTasks: [ + { taskId: 'abc306_b', priority: 1, comment: '' }, + { taskId: 'tessoku_book_d', priority: 2, comment: '' }, + { taskId: 'abc336_b', priority: 3, comment: '' }, + ], + }), + createWorkBookBase({ + title: '6Q 重実装問題', + description: + '実装が重い問題を集めた問題集です。これらの問題を通して、複雑な処理の細部をしっかりと詰め切る力を養いましょう!', + isPublished: true, + isOfficial: true, + isReplenished: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'heavy-implementation-6q', + workBookTasks: [ + { taskId: 'abc328_b', priority: 1, comment: '' }, + { taskId: 'abc278_b', priority: 2, comment: '' }, + { taskId: 'abc305_b', priority: 3, comment: '' }, + ], + }), + createWorkBookBase({ + title: '6Q 総合問題(全部解く必要はない)', + description: + 'これまでに学んできたことがらを総合的に確認できる問題です。これらの問題のうちのいくつかが解けたら、次のグレード (5Q) に進みましょう!', + isPublished: true, + isOfficial: true, + isReplenished: true, + workBookType: WorkBookType.CURRICULUM, + workBookTasks: [ + { taskId: 'abc405_b', priority: 1, comment: '' }, + { taskId: 'abc390_b', priority: 2, comment: '' }, + { taskId: 'abc386_b', priority: 3, comment: '' }, + { taskId: 'abc381_b', priority: 4, comment: '' }, + ], + }), + createWorkBookBase({ + title: '6Q 幾何', + isPublished: true, + isOfficial: true, + isReplenished: true, + workBookType: WorkBookType.CURRICULUM, + urlSlug: 'geometry-6q', + workBookTasks: [ + { taskId: 'math_and_algorithm_af', priority: 1, comment: '' }, + { taskId: 'abc362_b', priority: 2, comment: '' }, + { taskId: 'abc246_a', priority: 3, comment: '' }, + ], + }), + createWorkBookBase({ + title: 'スタック(stack)', + description: 'スタックの基礎から応用まで学べる問題集です。', + editorialUrl: 'https://qiita.com/drken/items/6a95b57d2e374a3d3292', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.SOLUTION, + urlSlug: 'stack', + workBookTasks: [ + { taskId: 'tessoku_book_ay', priority: 1, comment: '' }, + { taskId: 'abc396_b', priority: 2, comment: '' }, + { taskId: 'abc394_d', priority: 3, comment: '' }, + { taskId: 'abc328_d', priority: 4, comment: '' }, + { taskId: 'abc307_d', priority: 5, comment: '' }, + { taskId: 'abc333_e', priority: 6, comment: '' }, + { taskId: 'abc372_d', priority: 7, comment: '' }, + { taskId: 'abc359_e', priority: 9, comment: '' }, + { taskId: 'abc379_f', priority: 10, comment: '' }, + { taskId: 'arc076_c', priority: 11, comment: '' }, + { taskId: 'abc311_g', priority: 12, comment: '' }, + { taskId: 'abc234_g', priority: 13, comment: '' }, + ], + }), + createWorkBookBase({ + title: 'ポテンシャル付き Union-Find', + editorialUrl: 'https://qiita.com/drken/items/cce6fc5c579051e64fab', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.SOLUTION, + urlSlug: 'union-find-with-potential', + workBookTasks: [ + { taskId: 'abc373_d', priority: 1, comment: 'DFS・BFSでも解けます' }, + { taskId: 'abc320_d', priority: 2, comment: 'DFS・BFSでも解けます' }, + { + taskId: 'abc328_f', + priority: 3, + comment: 'ポテンシャル付き Union-Find が有効活用できる問題です', + }, + { + taskId: 'abc280_f', + priority: 4, + comment: 'ポテンシャル付き Union-Find を少し工夫して活用できます', + }, + { taskId: 'arc188_c', priority: 5, comment: '' }, + ], + }), + createWorkBookBase({ + title: 'ビット全探索', + editorialUrl: 'https://drken1215.hatenablog.com/entry/2019/12/14/171657', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.SOLUTION, + urlSlug: 'bit-exhaustive-search', + workBookTasks: [ + { taskId: 'abc374_c', priority: 1, comment: '' }, + { taskId: 'abc358_c', priority: 2, comment: '' }, + { taskId: 'abc384_c', priority: 3, comment: '' }, + { taskId: 'abc321_c', priority: 4, comment: '' }, + { taskId: 'tessoku_book_bt', priority: 5, comment: '' }, + { taskId: 'past202209_g', priority: 6, comment: '' }, + { taskId: 'abc219_e', priority: 7, comment: '' }, + ], + }), + createWorkBookBase({ + title: '貪欲法(greedy method)', + description: + '貪欲法とは、最適化問題において、1 ステップ先のことのみを考えて最適化する判断を繰り返して、解を作り上げていく方法です。貪欲法の基づく解法で最適解を導ける問題を集めました。ぜひ解いてみてください!', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.SOLUTION, + urlSlug: 'greedy-method', + workBookTasks: [ + { taskId: 'abc397_b', priority: 1, comment: '' }, + { taskId: 'abc315_c', priority: 2, comment: '' }, + { taskId: 'abc318_c', priority: 3, comment: '' }, + { taskId: 'abc313_c', priority: 4, comment: '' }, + { taskId: 'abc301_d', priority: 5, comment: '' }, + { taskId: 'abc312_f', priority: 6, comment: '' }, + { taskId: 'abc389_e', priority: 7, comment: '' }, + ], + }), + createWorkBookBase({ + title: '再帰関数', + description: + '関数の中で自分自身を呼び出す関数を「再帰関数」と呼びます。再帰関数を使いこなすには慣れが必要です。この問題集で再帰関数の扱い方に慣れていきましょう!', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.SOLUTION, + urlSlug: 'recursive-function', + workBookTasks: [ + { taskId: 'abc273_a', priority: 1, comment: '' }, + { taskId: 'abc263_c', priority: 2, comment: '' }, + { taskId: 'abc367_c', priority: 3, comment: '' }, + { taskId: 'abc357_c', priority: 4, comment: '' }, + { taskId: 'abc340_c', priority: 5, comment: '' }, + { taskId: 'abc382_c', priority: 6, comment: '' }, + { taskId: 'abc321_c', priority: 7, comment: '' }, + { taskId: 'abc380_d', priority: 8, comment: '' }, + { taskId: 'abc310_d', priority: 9, comment: '' }, + { taskId: 'abc391_e', priority: 10, comment: '' }, + ], + }), + createWorkBookBase({ + title: '優先度付きキュー:次に大きい組を求める', + description: + '優先度付きキューの使い道として、「次の大きさをもつ組を求める」というものがあります。そのような問題を集中的に解いていきましょう。', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.SOLUTION, + urlSlug: 'priority-queue', + workBookTasks: [ + { taskId: 'abc123_d', priority: 1, comment: '' }, + { taskId: 'abc297_e', priority: 2, comment: '' }, + { taskId: 'abc391_f', priority: 3, comment: '' }, + ], + }), + createWorkBookBase({ + title: '連想配列(map・dict)', + description: + 'C++ の map 型や、Python の dict 型の練習をします。連想配列は、index にさまざまな型の値を指定できるようにした配列です。バケットでは解けない問題も、連想配列を用いることで解けることがあります。', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.SOLUTION, + urlSlug: 'map-dict', + workBookTasks: [ + { taskId: 'abc308_b', priority: 1, comment: '' }, + { taskId: 'abc378_c', priority: 2, comment: '' }, + { taskId: 'abc398_c', priority: 3, comment: '' }, + { taskId: 'abc343_d', priority: 4, comment: '' }, + { taskId: 'abc233_d', priority: 5, comment: '' }, + { taskId: 'abc304_d', priority: 6, comment: '' }, + { taskId: 'abc146_e', priority: 7, comment: '' }, + ], + }), + createWorkBookBase({ + title: '順序付き集合(set・SortedSet)', + description: + '集合(set)に対して、順序の機能を持たせたものを扱います。「集合に含まれている値の最小値を求めよ」「集合に含まれている要素のうち x 以上である最小の値を求めよ」といった処理を高速に実行するものです。C++ では set 型が使えます。Python では tatyam さんの SortedSet 型を使いましょう。', + isPublished: true, + isOfficial: true, + workBookType: WorkBookType.SOLUTION, + urlSlug: 'ordered-set', + workBookTasks: [ + { taskId: 'tessoku_book_bc', priority: 1, comment: '' }, + { taskId: 'tessoku_book_eb', priority: 2, comment: '' }, + { taskId: 'abc385_d', priority: 3, comment: '' }, + { taskId: 'abc380_e', priority: 4, comment: '' }, + { taskId: 'abc308_g', priority: 5, comment: '' }, + { taskId: 'abc255_h', priority: 6, comment: '' }, + ], + }), + createWorkBookBase({ + title: '整数系探索問題(250-like Number など)', + description: + '整数問題の中には、探索アプローチによって解決できるものが数多くあります。そのような問題に慣れていきましょう。', + isPublished: false, + isOfficial: true, + workBookType: WorkBookType.SOLUTION, + workBookTasks: [ + { taskId: 'math_and_algorithm_l', priority: 1, comment: '' }, + { taskId: 'abc343_c', priority: 2, comment: '' }, + { taskId: 'abc330_c', priority: 3, comment: '' }, + { taskId: 'abc284_d', priority: 4, comment: '' }, + { taskId: 'abc400_c', priority: 5, comment: '' }, + { taskId: 'abc400_e', priority: 5, comment: '' }, + ], + }), +];