Kyopro Library
 
読み取り中…
検索中…
一致する文字列を見つけられません
ring.hpp
[詳解]
1#include"../../kyopro_library/template.hpp"
2
3/// @brief 円環上での計算
4namespace Ring {
5 /// @brief 円環上で p1->p2 に+方向に移動する際に target を通過するかを判定する。
6 /// @ref verify: https://atcoder.jp/contests/abc367/tasks/abc367_a
7 bool BetweenIncrement(ll p1, ll p2, ll target) {
8 if(p1==p2) return p1==target;
9 return (target-p2)*(p2-p1)*(p1-target)>=0;
10 }
11
12 /// @brief 円環上で p1->p2 に-方向に移動する際に target を通過するかを判定する。
13 bool BetweenDecrement(ll p1, ll p2, ll target) {
14 swap(p1,p2);
15 return BetweenIncrement(p1,p2,target);
16 }
17
18 /// @brief サイズ n の円環上で p1->p2 に移動する距離を返す。
19 ll DistanceMin(ll p1, ll p2, ll n) {
20 if(p1>p2) swap(p1,p2);
21 return min(p2-p1,n-(p2-p1));
22 }
23
24 /// @brief サイズ n の円環上で p1->p2 に+方向に移動する距離を返す。
25 ll DistanceIncrement(ll p1, ll p2, ll n) {
26 return p1<p2 ? p2-p1 : (n+p2-p1)%n;
27 }
28
29 /// @brief サイズ n の円環上で p1->p2 に-方向に移動する距離を返す。
30 ll DistanceDecrement(ll p1, ll p2, ll n) {
31 return p1>p2 ? p1-p2 : (n+p1-p2)%n;
32 }
33}
円環上での計算
Definition ring.hpp:4
ll DistanceMin(ll p1, ll p2, ll n)
サイズ n の円環上で p1->p2 に移動する距離を返す。
Definition ring.hpp:19
bool BetweenDecrement(ll p1, ll p2, ll target)
円環上で p1->p2 に-方向に移動する際に target を通過するかを判定する。
Definition ring.hpp:13
bool BetweenIncrement(ll p1, ll p2, ll target)
円環上で p1->p2 に+方向に移動する際に target を通過するかを判定する。 verify: https://atcoder.jp/contests/abc367/tasks/abc367_a
Definition ring.hpp:7
ll DistanceIncrement(ll p1, ll p2, ll n)
サイズ n の円環上で p1->p2 に+方向に移動する距離を返す。
Definition ring.hpp:25
ll DistanceDecrement(ll p1, ll p2, ll n)
サイズ n の円環上で p1->p2 に-方向に移動する距離を返す。
Definition ring.hpp:30