競技プログラミングにおける代表的アルゴリズムテンプレート集
高精度計算
トライ木を用いたA+B
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
struct TrieNode {
int children[26];
int value;
} nodes[1000];
char buffer[100];
int nodeCount = 0, totalNodes = 0, resultSum = 0;
bool negativeFlag;
void insertNumber() {
int cur ...
7月3日 20:44 投稿
C++による基本プログラミング問題の解法
問題 1000: 2つの整数の合計
問題概要
2つの整数 a と b を読み込み、それらの合計を出力してください。
C++ コード例
#include <iostream> // 標準入出力ライブラリをインクルード
int main() {
int value1, value2; // 2つの整数値を格納する変数を宣言
// 標準入力から2つの整数値を読み込む
std::cin >> value1 >> value2;
// 読み込んだ2つ ...
7月2日 17:38 投稿
2024牛客夏季多校トレーニングキャンプ第9回 バーチャル参加記録
A. Image Scaling
簡単な問題。矩形の幅と高さを求め、それらの最大公約数で割って互いに素にするだけ。
コードを表示#include <cstdio>
#include <cstring>
int n, m, x1, y1, x2, y2;
char grid[505][505];
int gcd(int a, int b) {
while (b) {
int t = b;
b = a % b;
a = t;
}
return a;
}
int main() {
scanf ...
7月1日 20:33 投稿
牛客週間コンテスト 第5回
牛客週間コンテスト 第5回
A-游游の文字変換
#include <iostream>
#include <string>
using namespace std;
int main() {
string input;
cin >> input;
for (size_t i = 0; i < input.length(); ++i) {
char current = input[i];
if (current >= 'A' && current < 'Z') {
input[i] = cu ...
7月1日 00:04 投稿
3×3グリッド全点灯における最小操作手数求解アルゴリズム
問題概要
3行3列のマトリックス状に配置された9つの照明スイッチがある。各スイッチを操作すると、該当する位置および上下左右に隣接するセルの電球状態が反転する(ON⇔OFF)。初期状態の入力が与えられた際、すべてのセルをON状態に切り替えるための最小操作回数を求めよ。
入力・出力仕様
標準入力からは3行にわたり、各行3個の整数が半角スペース区切りで渡される。各 ...
6月29日 21:46 投稿
C++による競技プログラミング問題の解決アプローチ
基本的な比較計算
二つの整数の積を比較する問題では、直接的な計算を用いる。
#include <iostream>
int main() {
long long w, x, y, z;
std::cin >> w >> x >> y >> z;
std::cout numA >> numB;
std::cout 1) isCritical[node] = true;
}
int main() {
int cols;
cin >> cols;
string rowA, rowB;
cin >> rowA >> rowB;
i ...
6月28日 22:57 投稿
AtCoder Beginner Contest 170の問題解説と実装
問題Dの解法
整数配列Aが与えられたとき、他の全ての要素で割り切れない要素の数を求める問題です。配列サイズは最大2×10^5です。
解法としては、各数値の出現頻度を記録し、各要素の約数を調べて他の要素で割り切れるか判定します。重複要素がある場合に注意が必要です。
#include<bits/stdc++.h>
using namespace std;
const int MAX = 1e6+5;
int main() {
...
6月28日 02:43 投稿
P5298 [PKUWC2018] Minimax 解説:セグメント木マージによる木DP最適化
問題の分析
この問題は、セグメント木のマージ操作を用いて木構造上の動的計画法を最適化する手法が鍵となります。
まず、値の範囲が最大で10^9まで及ぶため、離散化(座標圧縮)が必要です。各値の出現確率を管理する必要があるため、基本的な木DPを考えます。
動的計画法の設計
dp[v][j] を頂点vにおいて、j番目に小さい値が出現する確率と定義します。遷移は以下の3 ...
6月28日 02:04 投稿
AtCoder Beginner Contest 378
A - ペアリング
問題文
4つの数が与えられる。各ステップで同じ値の2つの数字を選んで削除する。この操作を最大何回行えるかを求める。
解法
シミュレーションを行う。
コード
コードを表示#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> pii;
const int mxn = 1e6 + 5;
void solve()
{
int a, b, c, d;
...
6月27日 01:13 投稿
競技プログラミング問題集: 生成器、MEX、XORの応用
理想的な生成器の判定
正整数kが「理想生成器」であるとは、任意の整数n(n ≥ k)が、長さkの回文配列の要素和として表現可能な場合を指す。回文配列とは、配列aがa1からakまでとakからa1までが同一となる配列である。例として、k=1は理想生成器である(nは[n]で表現可能)が、k=2は非理想(3を表現不可能)。
解法: kが奇数の場合のみ理想生成器となる。偶数の場合、配列 ...
6月26日 21:45 投稿