srupのメモ帳

競プロで解いた問題や勉強したことを記録していくメモ帳

yukicoder No.396 クラス替え

問題

問題概要

省略

解法

2m個で循環するので、mod(2m)で計算してる。modを取った後の値がmより大きいか、小さいかで場合分けして、数字が昇順に並ぶ部分なのか、昇順に並ぶ部分なのかで考えて、何組なのかを考えている。

ミス

1オリジンでやっていてばぐらした。0オリジンでやれば、modとってもすんなり行ける。

コード

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
typedef long long ll;
#define rep(i,n) for(int i=0;i<(n);i++)

int main(void){
    ll n, m; cin >> n >> m;
    ll x, y; cin >> x >> y;
    ll mod = 2 * m;
    ll numx = x % mod;
    ll numy = y % mod;

    if(numx > m) numx = 2 * m - numx + 1;
    if(numx == 0) numx = 1;

    if(numy > m) numy = 2 * m - numy + 1;
    if(numy == 0) numy = 1;

    if(numx % mod == numy % mod) printf("YES\n");
    else printf("NO\n");
    return 0;
}