upload mission
This commit is contained in:
101
src/views/mission/UploadMissionForm.tsx
Normal file
101
src/views/mission/UploadMissionForm.tsx
Normal file
@@ -0,0 +1,101 @@
|
||||
import React, { useState } from "react";
|
||||
import { useAppDispatch, useAppSelector } from "../../redux/hooks";
|
||||
import { uploadMission } from "../../redux/slices/missions";
|
||||
|
||||
const UploadMissionForm: React.FC = () => {
|
||||
const dispatch = useAppDispatch();
|
||||
const { status, error } = useAppSelector(state => state.missions);
|
||||
|
||||
// Локальные состояния формы
|
||||
const [name, setName] = useState("");
|
||||
const [difficulty, setDifficulty] = useState(1);
|
||||
const [tags, setTags] = useState<string[]>([]);
|
||||
const [tagsValue, setTagsValue] = useState<string>("");
|
||||
const [file, setFile] = useState<File | null>(null);
|
||||
|
||||
const handleSubmit = async (e: React.FormEvent) => {
|
||||
e.preventDefault();
|
||||
if (!file) return alert("Выберите файл миссии!");
|
||||
|
||||
try {
|
||||
dispatch(uploadMission({ file, name, difficulty, tags }));
|
||||
|
||||
alert("Миссия успешно загружена!");
|
||||
setName("");
|
||||
setDifficulty(1);
|
||||
setTags([]);
|
||||
setFile(null);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
alert("Ошибка при загрузке миссии: " + err);
|
||||
}
|
||||
};
|
||||
|
||||
const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||
if (e.target.files && e.target.files[0]) {
|
||||
setFile(e.target.files[0]);
|
||||
}
|
||||
};
|
||||
|
||||
const handleTagsChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||
setTagsValue(e.target.value);
|
||||
const value = e.target.value;
|
||||
const tagsArray = value.split(",").map(tag => tag.trim()).filter(tag => tag);
|
||||
setTags(tagsArray);
|
||||
};
|
||||
|
||||
return (
|
||||
<form onSubmit={handleSubmit} className="max-w-md mx-auto p-4 border rounded">
|
||||
<div className="mb-4">
|
||||
<label className="block mb-1">Название миссии</label>
|
||||
<input
|
||||
type="text"
|
||||
value={name}
|
||||
onChange={e => setName(e.target.value)}
|
||||
className="w-full border px-2 py-1"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="mb-4">
|
||||
<label className="block mb-1">Сложность</label>
|
||||
<input
|
||||
type="number"
|
||||
value={difficulty}
|
||||
min={1}
|
||||
max={5}
|
||||
onChange={e => setDifficulty(Number(e.target.value))}
|
||||
className="w-full border px-2 py-1"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="mb-4">
|
||||
<label className="block mb-1">Теги (через запятую)</label>
|
||||
<input
|
||||
type="text"
|
||||
value={tagsValue}
|
||||
onChange={handleTagsChange}
|
||||
className="w-full border px-2 py-1"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="mb-4">
|
||||
<label className="block mb-1">Файл миссии</label>
|
||||
<input type="file" onChange={handleFileChange} accept=".zip" required />
|
||||
</div>
|
||||
|
||||
<button
|
||||
type="submit"
|
||||
disabled={status === "loading"}
|
||||
className="bg-blue-500 text-white px-4 py-2 rounded disabled:opacity-50"
|
||||
>
|
||||
{status === "loading" ? "Загрузка..." : "Загрузить миссию"}
|
||||
</button>
|
||||
|
||||
{status === "failed" && error && <p className="text-red-500 mt-2">{error}</p>}
|
||||
</form>
|
||||
);
|
||||
};
|
||||
|
||||
export default UploadMissionForm;
|
||||
129
src/views/mission/codeeditor/CodeEditor.tsx
Normal file
129
src/views/mission/codeeditor/CodeEditor.tsx
Normal file
@@ -0,0 +1,129 @@
|
||||
import React, { useState } from "react";
|
||||
import Editor from "@monaco-editor/react";
|
||||
import { upload } from "../../../assets/icons/input";
|
||||
import { cn } from "../../../lib/cn";
|
||||
import { DropDownList } from "../../../components/drop-down-list/DropDownList";
|
||||
|
||||
const languageMap: Record<string, string> = {
|
||||
c: "cpp",
|
||||
cpp: "cpp",
|
||||
java: "java",
|
||||
python: "python",
|
||||
pascal: "pascal",
|
||||
kotlin: "kotlin",
|
||||
csharp: "csharp"
|
||||
};
|
||||
|
||||
const CodeEditor: React.FC = () => {
|
||||
const [language, setLanguage] = useState<string>("cpp");
|
||||
const [code, setCode] = useState<string>("");
|
||||
const [isDragging, setIsDragging] = useState<boolean>(false);
|
||||
|
||||
|
||||
const items = [
|
||||
{ value: "c", text: "C" },
|
||||
{ value: "cpp", text: "C++" },
|
||||
{ value: "java", text: "Java" },
|
||||
{ value: "python", text: "Python" },
|
||||
{ value: "pascal", text: "Pascal" },
|
||||
{ value: "kotlin", text: "Kotlin" },
|
||||
{ value: "csharp", text: "C#" },
|
||||
];
|
||||
|
||||
const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||
const file = e.target.files?.[0];
|
||||
if (!file) return;
|
||||
|
||||
const reader = new FileReader();
|
||||
reader.onload = (event) => {
|
||||
const text = event.target?.result;
|
||||
if (typeof text === "string") setCode(text);
|
||||
};
|
||||
reader.readAsText(file);
|
||||
e.target.value = "";
|
||||
};
|
||||
|
||||
const handleDrop = (e: React.DragEvent<HTMLLabelElement>) => {
|
||||
e.preventDefault();
|
||||
setIsDragging(false);
|
||||
const droppedFile = e.dataTransfer.files[0];
|
||||
if (!droppedFile) return;
|
||||
|
||||
const reader = new FileReader();
|
||||
reader.onload = (event) => {
|
||||
const text = event.target?.result;
|
||||
if (typeof text === "string") setCode(text);
|
||||
};
|
||||
reader.readAsText(droppedFile);
|
||||
};
|
||||
|
||||
const handleDragOver = (e: React.DragEvent<HTMLLabelElement>) => {
|
||||
e.preventDefault(); // обязательно
|
||||
};
|
||||
|
||||
const handleDragEnter = (e: React.DragEvent<HTMLLabelElement>) => {
|
||||
e.preventDefault();
|
||||
setIsDragging(true);
|
||||
};
|
||||
|
||||
const handleDragLeave = (e: React.DragEvent<HTMLLabelElement>) => {
|
||||
e.preventDefault();
|
||||
setIsDragging(false);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="flex flex-col w-full h-full">
|
||||
{/* Панель выбора языка и загрузки файла */}
|
||||
<div className="flex items-center justify-between py-3 ">
|
||||
<div className="flex items-center gap-[20px]">
|
||||
<DropDownList items={items} onChange={(v) => { setLanguage(v) }} />
|
||||
|
||||
<label
|
||||
className={cn("h-[40px] w-[250px] rounded-[10px] px-[16px] relative flex items-center cursor-pointer transition-all bg-liquid-lighter outline-dashed outline-[2px] outline-transparent active:scale-[95%]",
|
||||
isDragging && "outline-blue-500 "
|
||||
)}
|
||||
onDrop={handleDrop}
|
||||
onDragOver={handleDragOver}
|
||||
onDragEnter={handleDragEnter}
|
||||
onDragLeave={handleDragLeave}
|
||||
>
|
||||
<span className="text-[18px] text-liquid-white font-bold pointer-events-none">
|
||||
{"Загрузить решение"}
|
||||
</span>
|
||||
<img src={upload} className="absolute right-[16px] pointer-events-none" />
|
||||
<input
|
||||
type="file"
|
||||
onChange={(e) => handleFileUpload(e)}
|
||||
className="hidden"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Monaco Editor */}
|
||||
<div className="bg-[#1E1E1E] py-[10px] h-full rounded-[10px]">
|
||||
<Editor
|
||||
width="100%"
|
||||
height="100%"
|
||||
language={languageMap[language]}
|
||||
value={code}
|
||||
onChange={(value) => setCode(value ?? "")}
|
||||
theme="vs-dark"
|
||||
options={{
|
||||
fontSize: 14,
|
||||
minimap: { enabled: false },
|
||||
automaticLayout: true,
|
||||
quickSuggestions: true,
|
||||
suggestOnTriggerCharacters: true,
|
||||
tabSize: 4,
|
||||
insertSpaces: true,
|
||||
detectIndentation: false,
|
||||
autoIndent: "full",
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default CodeEditor;
|
||||
192
src/views/mission/statement/Mission.tsx
Normal file
192
src/views/mission/statement/Mission.tsx
Normal file
@@ -0,0 +1,192 @@
|
||||
import { useEffect, useRef } from "react";
|
||||
|
||||
declare global {
|
||||
interface Window {
|
||||
MathJax?: {
|
||||
startup?: { promise?: Promise<void> };
|
||||
typesetPromise?: (elements?: Element[]) => Promise<void>;
|
||||
[key: string]: any;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
export default function MissionStatement() {
|
||||
const containerRef = useRef<HTMLDivElement>(null);
|
||||
const legend = "В честь юбилея ректорат ЮФУ решил запустить акцию <<Сто и десять кексов>>. \r\n\r\n $x$, $a_i^2 + b_i^2 \le a_{i+1}^2$ В каждом корпусе университета открылась лавка с кексами, в которой каждый студент может получить бесплатные кексы.\r\n\r\nНе прошло и пары минут после открытия, как к лавкам набежали студенты и образовалось много очередей. Но самая большая очередь образовалась в главном корпусе ЮФУ. Изначально в этой очереди стояло $n$ студентов, но потом в течение следующих $m$ минут какие-то студенты приходили и вставали в очередь, а какие-то уходили.\r\n\r\nЗа каждым студентом закреплен номер его зачетной книжки, будем называть это число номером студента. У каждого студента будет уникальный номер, по которому можно однозначно его идентифицировать. Будем считать, что каждую минуту происходило одно из следующих событий:\r\n\r\n\\begin{enumerate}\r\n \\item Студент с номером $x$ пришел и встал перед студентом с номером $y$;\r\n \\item Студент с номером $x$ пришел и встал в конец очереди;\r\n \\item Студент с номером $x$ ушел из очереди; возможно, он потом вернется.\r\n\\end{enumerate}\r\n\r\nАналитикам стало интересно, а какой будет очередь после $m$ минут? \r\n\r\nПомогите им и сообщите конечное состояние очереди.\r\n\r\n";
|
||||
const htmlContent = `
|
||||
<DIV class="problem-statement">
|
||||
<DIV class="header">
|
||||
<DIV class="title">Очередь за кексами</DIV>
|
||||
<DIV class="time-limit">
|
||||
<DIV class="property-title">ограничение по времени на тест</DIV>1 секунда
|
||||
</DIV>
|
||||
<DIV class="memory-limit">
|
||||
<DIV class="property-title">ограничение по памяти на тест</DIV>256 мегабайт
|
||||
</DIV>
|
||||
<DIV class="input-file input-standard">
|
||||
<DIV class="property-title">ввод</DIV>стандартный ввод
|
||||
</DIV>
|
||||
<DIV class="output-file output-standard">
|
||||
<DIV class="property-title">вывод</DIV>стандартный вывод
|
||||
</DIV>
|
||||
</DIV>
|
||||
<DIV class="legend">
|
||||
<P>
|
||||
\\bf{test}
|
||||
$$$x$$$, $$$a_i^2 + b_i^2 \\le a_{i+1}^2$$$
|
||||
Some complex formula: $$$P(|S - E[S]| \\ge t) \\le 2 \\exp \\left( -\\frac{2 t^2 n^2}{\\sum_{i = 1}^n (b_i - a_i)^2} \\right).$$$
|
||||
В честь юбилея ректорат ЮФУ решил запустить акцию «Сто и десять кексов». В каждом корпусе
|
||||
университета открылась лавка с кексами, в которой каждый студент может получить бесплатные кексы.</P>
|
||||
<P>Не прошло и пары минут после открытия, как к лавкам набежали студенты и образовалось много очередей. Но
|
||||
самая большая очередь образовалась в главном корпусе ЮФУ. Изначально в этой очереди стояло $$$n$$$
|
||||
студентов, но потом в течение следующих $$$m$$$ минут какие-то студенты приходили и вставали в очередь,
|
||||
а какие-то уходили.</P>
|
||||
<P>За каждым студентом закреплен номер его зачетной книжки, будем называть это число номером студента. У
|
||||
каждого студента будет уникальный номер, по которому можно однозначно его идентифицировать. Будем
|
||||
считать, что каждую минуту происходило одно из следующих событий:</P>
|
||||
<P></P>
|
||||
<OL>
|
||||
<LI> Студент с номером $$$x$$$ пришел и встал перед студентом с номером $$$y$$$; </LI>
|
||||
<LI> Студент с номером $$$x$$$ пришел и встал в конец очереди; </LI>
|
||||
<LI> Студент с номером $$$x$$$ ушел из очереди; возможно, он потом вернется. </LI>
|
||||
</OL>
|
||||
<P></P>
|
||||
<P>Аналитикам стало интересно, а какой будет очередь после $$$m$$$ минут? </P>
|
||||
<P>Помогите им и сообщите конечное состояние очереди.</P>
|
||||
</DIV>
|
||||
<P></P>
|
||||
<P></P>
|
||||
<DIV class="input-specification">
|
||||
<DIV class="section-title">Входные данные</DIV>
|
||||
<P></P>
|
||||
<P>В первой строке заданы два целых числа $$$n$$$ и $$$m$$$ $$$(1 \\le n, m \\le 10^5)$$$ — текущее
|
||||
число студентов в очереди и количество изменений.</P>
|
||||
<P>В следующей строке задается $$$n$$$ целых <SPAN class="tex-font-style-bf">различных</SPAN> чисел $$$a_1,
|
||||
a_2, \\cdots , a_n$$$ $$$(1 \\le a_i \\le 10^9)$$$, где $$$a_i$$$ — номер студента, который
|
||||
стоит на $$$i$$$-й позиции в очереди.</P>
|
||||
<P>В следующих $$$m$$$ строках идет описание запросов изменения очереди.</P>
|
||||
<P>В каждой строке в зависимости от типа запроса задается два или три числа. Первое число $$$t_j$$$ $$$(1
|
||||
\\le t_j \\le 3)$$$ — тип события, которое произошло в $$$j$$$-ю минуту.</P>
|
||||
<P>Если $$$t_j = \\textbf{1}$$$, то в строке задается еще 2 числа $$$x$$$ $$$(1 \\le x_j \\le 10^9)$$$ и
|
||||
$$$y$$$ $$$(1 \\le y_j \\le 10^9)$$$ — номер студента, который пришел, и номер студента, перед
|
||||
которым он встанет в очереди. Гарантируется, что студент с номером $$$x$$$ ещё не занял очередь, а
|
||||
студент с номером $$$y$$$ уже стоит в ней. </P>
|
||||
<P>Если $$$t_j = \\textbf{2}$$$, то в строке задается еще 1 число $$$x$$$ $$$(1 \\le x_j \\le
|
||||
10^9)$$$ — номер студента, который пришел и встал в конец очереди. Гарантируется, что студент
|
||||
с номером $$$x$$$ ещё не занял очередь.</P>
|
||||
<P>Если $$$t_j = \\textbf{3}$$$, то в строке задается еще 1 число $$$x$$$ $$$(1 \\le x_j \\le
|
||||
10^9)$$$ — номер студента, который ушел из очереди. Гарантируется, что студент с номером
|
||||
$$$x$$$ стоит в очереди.</P>
|
||||
</DIV>
|
||||
<P></P>
|
||||
<P></P>
|
||||
<DIV class="output-specification">
|
||||
<DIV class="section-title">Выходные данные</DIV>
|
||||
<P></P>
|
||||
<P>В первой строке выведите одно число $$$|a|$$$ — длину очереди после выполнения всех запросов
|
||||
изменения.</P>
|
||||
<P>В следующей строке выведите $$$|a|$$$ чисел $$$a_1, a_2, \\cdots , a_{|a|}$$$, где $$$a_i$$$ —
|
||||
номер студента, который стоит на $$$i$$$-й позиции в очереди.</P>
|
||||
</DIV>
|
||||
<P></P>
|
||||
<P></P>
|
||||
<DIV class="sample-tests">
|
||||
<DIV class="section-title">Пример</DIV>
|
||||
<P></P>
|
||||
<P></P>
|
||||
<DIV class="sample-test">
|
||||
<DIV class="input">
|
||||
<DIV class="title">Входные данные</DIV>
|
||||
<PRE class="content" data-content="7 6
|
||||
1 2 3 4 5 6 7
|
||||
1 8 3
|
||||
2 9
|
||||
3 3
|
||||
1 3 9
|
||||
2 10
|
||||
3 1
|
||||
">
|
||||
<DIV class="test-example-line test-example-line-even test-example-line-0">7 6</DIV><DIV class="test-example-line test-example-line-even test-example-line-0">1 2 3 4 5 6 7</DIV><DIV class="test-example-line test-example-line-even test-example-line-0">1 8 3</DIV><DIV class="test-example-line test-example-line-even test-example-line-0">2 9</DIV><DIV class="test-example-line test-example-line-even test-example-line-0">3 3</DIV><DIV class="test-example-line test-example-line-even test-example-line-0">1 3 9</DIV><DIV class="test-example-line test-example-line-even test-example-line-0">2 10</DIV><DIV class="test-example-line test-example-line-even test-example-line-0">3 1</DIV></PRE>
|
||||
</DIV>
|
||||
<DIV class="output">
|
||||
<DIV class="title">Выходные данные</DIV>
|
||||
<PRE class="content">
|
||||
9
|
||||
2 8 4 5 6 7 3 9 10
|
||||
</PRE>
|
||||
</DIV>
|
||||
</DIV>
|
||||
</DIV>
|
||||
<P></P>
|
||||
<P></P>
|
||||
<DIV class="note">
|
||||
<DIV class="section-title">Примечание</DIV>
|
||||
<P></P>
|
||||
<P>Изначально очередь выглядит следующим образом:</P>
|
||||
<P><IMG class="tex-graphics" src="e29b6eb80ce5dcdb59a696421149e86cf24fff83.png"></P>
|
||||
<P>В первую минуту приходит студент с номером 8 и встает перед студентом с номером 3.</P>
|
||||
<P><IMG class="tex-graphics" src="cb6dba7c484189e88d8e1bc0e15767bbb44c0c69.png"></P>
|
||||
<P>Потом студент с номером 9 встает в конец очереди.</P>
|
||||
<P><IMG class="tex-graphics" src="b65f6e3c0bcc7e96380e577e3a79156116f6947e.png"></P>
|
||||
<P>Студент с номером 3 уходит из очереди.</P>
|
||||
<P><IMG class="tex-graphics" src="514e52cdf82b640ce29f9178bbd9be3379ab43dd.png"></P>
|
||||
<P>Потом он возвращается и становится перед студентом с номером 9.</P>
|
||||
<P><IMG class="tex-graphics" src="6f77902a9e98428961fb5c1bde374d946a82cdd2.png"></P>
|
||||
<P>После в конец очереди становится студент с номером 10.</P>
|
||||
<P><IMG class="tex-graphics" src="7b0ffd2ae443ff754e3131a6ddc77af4cb17a043.png"></P>
|
||||
<P>И студент с номером 1 уходит из очереди.</P>
|
||||
<P><IMG class="tex-graphics" src="15c12c02bcb2f87450906d26075f1336c6f8bb79.png"></P>
|
||||
<P>После $$$m$$$ событий очередь имеет следующий вид:</P>
|
||||
<P><IMG class="tex-graphics" src="ef8c0f8c7ba7108bef3d50979ae09eb267158ee6.png"></P>
|
||||
</DIV>
|
||||
</DIV>
|
||||
<P></P>
|
||||
<P> </P>
|
||||
|
||||
`;
|
||||
|
||||
useEffect(() => {
|
||||
// 1️⃣ Конфигурация MathJax
|
||||
(window as any).MathJax = {
|
||||
tex: {
|
||||
inlineMath: [["$$$", "$$$"]], // наш формат
|
||||
displayMath: [["$$$$$$", "$$$$$$"]],
|
||||
processEscapes: true,
|
||||
},
|
||||
options: {
|
||||
skipHtmlTags: ["script", "noscript", "style", "textarea", "pre", "code"],
|
||||
},
|
||||
startup: {
|
||||
typeset: false,
|
||||
},
|
||||
};
|
||||
|
||||
// 2️⃣ Подключаем MathJax
|
||||
const script = document.createElement("script");
|
||||
script.src = "https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js";
|
||||
script.async = true;
|
||||
|
||||
script.onload = () => {
|
||||
if (window.MathJax?.startup?.promise) {
|
||||
window.MathJax.startup.promise.then(() => renderMath());
|
||||
} else {
|
||||
renderMath();
|
||||
}
|
||||
};
|
||||
|
||||
document.head.appendChild(script);
|
||||
|
||||
// 3️⃣ Отрисовка формул
|
||||
const renderMath = () => {
|
||||
if (containerRef.current && window.MathJax?.typesetPromise) {
|
||||
window.MathJax.typesetPromise([containerRef.current]).catch(console.error);
|
||||
}
|
||||
};
|
||||
|
||||
return () => {
|
||||
script.remove();
|
||||
};
|
||||
}, []);
|
||||
|
||||
return <div ref={containerRef} dangerouslySetInnerHTML={{ __html: htmlContent }} />;
|
||||
}
|
||||
62
src/views/mission/statement/Statement.tsx
Normal file
62
src/views/mission/statement/Statement.tsx
Normal file
@@ -0,0 +1,62 @@
|
||||
import React, { useState } from "react";
|
||||
import { cn } from "../../../lib/cn";
|
||||
// import FullLatexRenderer from "./FullLatexRenderer";
|
||||
|
||||
const Statement: React.FC = () => {
|
||||
|
||||
const data = {
|
||||
"extraResources": {
|
||||
"example.01.mu": "TVXzATcgNg0KMSAyIDMgNCA1IDYgNw0KMSA4IDMNCjIgOQ0KMyAzDQoxIDMgOQ0KMiAxMA0KMyAxDQo="
|
||||
},
|
||||
"scoring": null,
|
||||
"notes": "Изначально очередь выглядит следующим образом:\r\n\r\n\\includegraphics{o1.png}\r\n\r\nВ первую минуту приходит студент с номером 8 и встает перед студентом с номером 3.\r\n\r\n\\includegraphics{o2.png}\r\n\r\nПотом студент с номером 9 встает в конец очереди.\r\n\r\n\\includegraphics{o3.png}\r\n\r\nСтудент с номером 3 уходит из очереди.\r\n\r\n\\includegraphics{o4.png}\r\n\r\nПотом он возвращается и становится перед студентом с номером 9.\r\n\r\n\\includegraphics{o5.png}\r\n\r\nПосле в конец очереди становится студент с номером 10.\r\n\r\n\\includegraphics{o6.png}\r\n\r\nИ студент с номером 1 уходит из очереди.\r\n\r\n\\includegraphics{o7.png}\r\n\r\nПосле $m$ событий очередь имеет следующий вид:\r\n\r\n\\includegraphics{o8.png}",
|
||||
"legend": "В честь юбилея ректорат ЮФУ решил запустить акцию <<Сто и десять кексов>>. \r\n\r\n $x$, $a_i^2 + b_i^2 \le a_{i+1}^2$ В каждом корпусе университета открылась лавка с кексами, в которой каждый студент может получить бесплатные кексы.\r\n\r\nНе прошло и пары минут после открытия, как к лавкам набежали студенты и образовалось много очередей. Но самая большая очередь образовалась в главном корпусе ЮФУ. Изначально в этой очереди стояло $n$ студентов, но потом в течение следующих $m$ минут какие-то студенты приходили и вставали в очередь, а какие-то уходили.\r\n\r\nЗа каждым студентом закреплен номер его зачетной книжки, будем называть это число номером студента. У каждого студента будет уникальный номер, по которому можно однозначно его идентифицировать. Будем считать, что каждую минуту происходило одно из следующих событий:\r\n\r\n\\begin{enumerate}\r\n \\item Студент с номером $x$ пришел и встал перед студентом с номером $y$;\r\n \\item Студент с номером $x$ пришел и встал в конец очереди;\r\n \\item Студент с номером $x$ ушел из очереди; возможно, он потом вернется.\r\n\\end{enumerate}\r\n\r\nАналитикам стало интересно, а какой будет очередь после $m$ минут? \r\n\r\nПомогите им и сообщите конечное состояние очереди.\r\n\r\n",
|
||||
"authorLogin": "valavshonok",
|
||||
"language": "russian",
|
||||
"timeLimit": 1000,
|
||||
"output": "В первой строке выведите одно число $|a|$~--- длину очереди после выполнения всех запросов изменения.\r\n\r\nВ следующей строке выведите $|a|$ чисел $a_1, a_2, \\cdots , a_{|a|}$, где $a_i$~--- номер студента, который стоит на $i$-й позиции в очереди.",
|
||||
"inputFile": "stdin",
|
||||
"outputFile": "stdout",
|
||||
"input": "В первой строке заданы два целых числа $n$ и $m$ $(1 \\le n, m \\le 10^5)$~--- текущее число студентов в очереди и количество изменений.\r\n\r\nВ следующей строке задается $n$ целых \\textbf{различных} чисел $a_1, a_2, \\cdots , a_n$ $(1 \\le a_i \\le 10^9)$, где $a_i$~--- номер студента, который стоит на $i$-й позиции в очереди.\r\n\r\nВ следующих $m$ строках идет описание запросов изменения очереди.\r\n\r\nВ каждой строке в зависимости от типа запроса задается два или три числа. Первое число $t_j$ $(1 \\le t_j \\le 3)$~--- тип события, которое произошло в $j$-ю минуту.\r\n\r\nЕсли $t_j = \\textbf{1}$, то в строке задается еще 2 числа $x$ $(1 \\le x_j \\le 10^9)$ и $y$ $(1 \\le y_j \\le 10^9)$~--- номер студента, который пришел, и номер студента, перед которым он встанет в очереди. Гарантируется, что студент с номером $x$ ещё не занял очередь, а студент с номером $y$ уже стоит в ней. \r\n\r\nЕсли $t_j = \\textbf{2}$, то в строке задается еще 1 число $x$ $(1 \\le x_j \\le 10^9)$~--- номер студента, который пришел и встал в конец очереди. Гарантируется, что студент с номером $x$ ещё не занял очередь.\r\n\r\nЕсли $t_j = \\textbf{3}$, то в строке задается еще 1 число $x$ $(1 \\le x_j \\le 10^9)$~--- номер студента, который ушел из очереди. Гарантируется, что студент с номером $x$ стоит в очереди.",
|
||||
"authorName": "Виталий Лавшонок",
|
||||
"sampleTests": [
|
||||
{
|
||||
"output": "9\r\n2 8 4 5 6 7 3 9 10 \r\n",
|
||||
"input": "7 6\r\n1 2 3 4 5 6 7\r\n1 8 3\r\n2 9\r\n3 3\r\n1 3 9\r\n2 10\r\n3 1\r\n",
|
||||
"inputFile": "example.01",
|
||||
"outputFile": "example.01.a"
|
||||
}
|
||||
],
|
||||
"name": "Очередь за кексами",
|
||||
"interaction": null,
|
||||
"memoryLimit": 268435456,
|
||||
"tutorial": "Давайте просто промоделируем все действия.\r\n\r\nЗаведем список элементов, а также сохраним по ключу $x$ указатель на элемент списка. Мы можем это сделать, так как все элементы различны. Например, в С++ можно просто завести коллекцию list<int>, а также map<int, list<int>::iterator> или реализовать свой список.\r\n\r\nТеперь мы можем легко обрабатывать все запросы, а в конце просто выведем весь список.\r\n\r\nЗапрос 1-го типа можно обработать так: просто берем по ключу указатель на нужный элемент и вставляем перед ним другой элемент, останется только по ключу $x$ записать указатель на новый элемент.\r\n\r\nЗапрос 2-го типа~--- просто добавить в список элемент в конец и сохранить на него указатель.\r\n\r\nЗапрос 3-го типа~--- удаляем из списка элемент по его указателю.\r\n\r\nВ конце просто выводим массив.\r\n\r\nИтоговая сложность $O(mlog(n))$"
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="flex flex-col w-full h-full bg-red-3001 overflow-y-scroll medium-scrollbar pl-[20px] pr-[12px] gap-[20px]">
|
||||
<div>
|
||||
<p className="h-[50px] text-[40px] font-bold text-liquid-white">Грод на 2700</p>
|
||||
<p className="h-[23px] text-[18px] font-bold text-liquid-light">Задача #1234</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
tags
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<p className="text-liquid-white h-[20px] text-[18px] font-bold"><span className="text-liquid-light">ограничение по времени на тест:</span> 1 секунда</p>
|
||||
<p className="text-liquid-white h-[20px] text-[18px] font-bold"><span className="text-liquid-light">ограничение по памяти на тест:</span> 256 мегабайт</p>
|
||||
<p className="text-liquid-white h-[20px] text-[18px] font-bold"><span className="text-liquid-light">ввод:</span> стандартный ввод</p>
|
||||
<p className="text-liquid-white h-[20px] text-[18px] font-bold"><span className="text-liquid-light">вывод:</span> стандартный вывод</p>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
{/* <FullLatexRenderer content={data.legend}/> */}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
);
|
||||
};
|
||||
|
||||
export default Statement;
|
||||
Reference in New Issue
Block a user