Binary Indexed Tree の基礎と応用

概要 Binary Indexed Tree(BIT)は、単点更新と区間クエリを効率的に処理できるデータ構造です。計算量 O(log N) で操作を実行可能であり、競技プログラミングやアルゴリズム最適化で広く利用されます。 構造と原理 BIT は 2 進数表現に基づく構造を利用します。任意の整数は複数の 2 のべき乗和で表せることから、配列要素をべき乗区間で管理します。lowbit 演算(x & - ...

6月25日 18:51 投稿

USACO問題「Cow Exhibition」の動的計画法による解法

問題概要 n 個の要素があり、それぞれに整数値の属性 a と b が割り当てられています。いくつかの要素を選択して、選ばれた要素の a 属性の合計 と b 属性の合計 の総和を最大化したいと考えます。ただし、以下の条件を満たす必要があります: a 属性の合計 ≥ 0 b 属性の合計 ≥ 0 この条件下で、(aの合計) + (bの合計) を最大にするプログラムを作成します。 アプロ ...

6月23日 20:37 投稿

Codeforces Round 998 (Div.3) 解説: A-D問題の解法と実装例

コンテスト参加後の復習と解法の整理を行います。問題AからDまでのアプローチとコードをまとめました。 A. Fibonacciness 5要素の数列における最大の「フィボナッチ度」を求める問題です。数列の長さが5であるため、最大でも度は3となります。各位置で成立するフィボナッチ関係の式を検討します。 具体的には、a0+a1 = a2、a1+a2 = a3、a2+a3 = a4の3つの条件が考えら ...

6月22日 17:44 投稿

プログラミング問題解法集

可能な限り簡潔にします。 CF679E 直接代入と修正のタイミングが正しいことがわかりますので、書き方について説明します。区間を良い数に変える操作を「加算」と呼びます。 既に区間代入が行われた区間にUpというマークを付けると、その区間とその子区間は1つの点と見なせます。そのため、修正の複雑さは単点修正と同じになります。 したがって、加算操作は次のように記述 ...

6月21日 23:23 投稿

競技プログラミングコンテスト問題解説:Codeforces Round 521 (Div. 3)

A. カエルのジャンプ 問題の条件に従って直接シミュレーションを行います。データ範囲に注意し、long long型を使用します。 void solve(){ long long a, b, k; cin >> a >> b >> k; cout n; vector<int> arr(n); for(int i = 0; i < n; i++) cin >> arr[i]; int result = 0; for(int i = 0; i < n - 2; i++){ if(arr[i] = ...

6月19日 23:58 投稿

競技プログラミングコンテスト問題の解法解説

円周率日チャレンジ Pythonの高精度計算を活用する問題。浮動小数点数の精度問題を回避するため、整数演算で処理する。 n = int(input()) pi_value = 31415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679 results = [] for _ in range(n): numerator, denominator = map(int, input().split()) approx = nume ...

6月15日 16:47 投稿

SMU春季2023竞赛第5轮(2023年江西省级程序设计竞赛官方赛题)

問題リンク 問題A. 木を掘って火を起こす S * V >= n さえ満たせばよい #include<bits/stdc++.h> #define int long long #define endl '\n' using namespace std; const int N = 2010,mod = 1e9 + 7; int n,s,v; void solve() { cin >> n >> s >> v; if(s * v >= n) cout << 1 << endl; else cout &lt ...

6月14日 20:52 投稿

アルゴリズム競技におけるC++ビット演算テクニック

ビット演算の基本と応用 ビット演算とシフト演算は、コンピュータの基本的な操作であり、バイナリレベルでのデータ操作を可能にします。アルゴリズム競技において、これらの操作は特定のタスクを効率的に実行するための強力なツールとなります。その特性と応用例を理解することは、競技プログラミングにおいて非常に重要です。 1. 演算子の優先順位 C++における演算子の優 ...

6月14日 17:14 投稿

競技プログラミング問題解説: EPIC Institute of Technology 2025

配列操作と最適化アルゴリズムの応用 A. 順序逆転検出 要素順を変更して、新しい配列を作成し、その配列が元の配列と異なる順序になるようにする問題です。 #include <vector> #include <iostream> using namespace std; void findDisorder(vector<int>& arr) { for (int i = 0; i < arr.size() - 1; ++i) { if (arr[i] > arr[i + 1]) ...

6月13日 22:16 投稿

Codeforces 1000~1100 第三週の問題解説

部分文字列と部分配列 目的は、文字列 a と b を部分配列として含む最短の文字列を見つけることです。その長さは a と b の長さの合計から、両方で共通する文字数を引いたものです。a は必ず含まれるため、b の各文字が a で順番に現れるかをチェックします。 注意: 部分文字列は連続した文字列ですが、部分配列は順序を保ちつつ連続性は必要ありません。 #include <bit ...

6月13日 22:13 投稿