AtCoderNotesForBeginners

Show some knowledges for beginners on AtCoder.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, Greasemonkey alebo Violentmonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey, % alebo Violentmonkey.

Na nainštalovanie skriptu si budete musieť nainštalovať rozšírenie, ako napríklad Tampermonkey alebo Userscripts.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie, ako napríklad Tampermonkey.

Na inštaláciu tohto skriptu je potrebné nainštalovať rozšírenie správcu používateľských skriptov.

(Už mám správcu používateľských skriptov, nechajte ma ho nainštalovať!)

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie, ako napríklad Stylus.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

Na inštaláciu tohto štýlu je potrebné nainštalovať rozšírenie správcu používateľských štýlov.

(Už mám správcu používateľských štýlov, nechajte ma ho nainštalovať!)

// ==UserScript==
// @name         AtCoderNotesForBeginners
// @namespace    https://github.com/AwashAmityOak
// @version      0.2.1
// @description  Show some knowledges for beginners on AtCoder.
// @author       AwashAmityOak
// @license      MIT
// @match        https://atcoder.jp/contests/*/tasks/*
// @grant        none
// @copyright    2024 AwashAmityOak (https://github.com/AwashAmityOak)
// ==/UserScript==

(function () {
    "use strict";

    const getTypeSizeTable = () => {
        const table = document.createElement("table");
        table.classList.add("table");
        table.classList.add("table-bordered");
        table.classList.add("table-striped");
        table.innerHTML = `
<thead>
    <tr>
        <th>型</th>
        <th>範囲</th>
    </tr>
</thead>
<tbody>
    <tr>
        <td><code>int</code></td>
        <td>
            <var>-2^{31}, \\ldots, 2^{31}-1</var>
            <var>(-2 \\times 10^9, \\ldots, 2 \\times 10^9)</var>
        </td>
    </tr>
    <tr>
        <td><code>long long</code></td>
        <td>
            <var>-2^{63}, \\ldots, 2^{63}-1</var>
            <var>(-9 \\times 10^{18}, \\ldots, 9 \\times 10^{18})</var>
        </td>
    </tr>
</tbody>
`;
        table.querySelectorAll("var").forEach(e=>{
            e.innerHTML = "\\(" + e.innerHTML + "\\)";
        });
        renderMathInElement(table, katexOptions);
        return table;
    };

    const getTimeComplexityTable = () => {
        const table = document.createElement("table");
        table.classList.add("table");
        table.classList.add("table-bordered");
        table.classList.add("table-striped");
        table.innerHTML = `
<thead>
    <tr>
        <th>入力サイズ</th>
        <th>時間計算量</th>
    </tr>
</thead>
<tbody>
    <tr>
        <td><var>N \\leq 10</var></td>
        <td><var>O(N!)</var></td>
    </tr>
    <tr>
        <td><var>N \\leq 20</var></td>
        <td><var>O(2^N)</var></td>
    </tr>
    <tr>
        <td><var>N \\leq 50</var></td>
        <td><var>O(N^4)</var></td>
    </tr>
    <tr>
        <td><var>N \\leq 500</var></td>
        <td><var>O(N^3)</var></td>
    </tr>
    <tr>
        <td><var>N \\leq 5000</var></td>
        <td><var>O(N^2)</var></td>
    </tr>
    <tr>
        <td><var>N \\leq 10^5</var></td>
        <td><var>O(N)</var> or <var>O(N \\log N)</var></td>
    </tr>
    <tr>
        <td><var>10^5 < N</var></td>
        <td><var>O(\\log N)</var> or <var>O(1)</var></td>
    </tr>
</tbody>
`;
        table.querySelectorAll("var").forEach(e=>{
            e.innerHTML = "\\(" + e.innerHTML + "\\)";
        });
        renderMathInElement(table, katexOptions);
        return table;
    };

    const elements = document.querySelectorAll(".part > section");
    for (const parent of elements) {
        if (parent.innerHTML.indexOf("制約") == -1) {
            continue;
        }

        const typeSizeElement = document.createElement("details");
        typeSizeElement.appendChild((() => {
            const s = document.createElement("summary");
            s.innerHTML = "型のサイズ";
            return s;
        })());
        const typeSizeTable = getTypeSizeTable();
        typeSizeTable.style.marginTop = "5px";
        typeSizeTable.style.marginBottom = "5px";
        typeSizeElement.appendChild(typeSizeTable);
        typeSizeElement.style.marginBottom = "10px";
        parent.appendChild(typeSizeElement);

        const timeComplexityElement = document.createElement("details");
        timeComplexityElement.appendChild((() => {
            const s = document.createElement("summary");
            s.innerHTML = "時間計算量";
            return s;
        })());
        const timeComplexityTable = getTimeComplexityTable();
        timeComplexityTable.style.marginTop = "5px";
        timeComplexityTable.style.marginBottom = "5px";
        timeComplexityElement.appendChild(timeComplexityTable);
        parent.appendChild(timeComplexityElement);
    }
})();