RGB Šah

Tabla za RGB šah je kvadratnog oblika i njena polja su crvene, zelene i plave boje. Gornje levo polje je crvene boje, polje desno od njega zelene boje, a polje desno od njega plave boje. Ovaj obrazac ređanja boja se nastavlja ciklično po vrstama. Na primer za \(n = 4\), tabla izgleda ovako:

R G B R G B R G B R G B R G B R

pri čemu su sa R označena crvena, sa G zelena, a sa B plava polja.

Napisati program koji određuje koliko ima crvenih, zelenih i plavih polja na putu od početne do krajnje zadate pozicije, pri čemu se put kreira po redovima: ide se desno do kraja reda, zatim se prelazi na sledeći red, i tako redom. I početna i krajnja pozicija se računaju u zbir.

Opis ulaza

Sa standardnog ulaza se unosi veličina stranice table \(n\) (\(3 \leq n \leq 10^5\)), a nakon toga i koordinate početnog i krajnjeg polja, \((x_1, y_1)\) i \((x_2, y_2)\) (\(0 \leq x_1, x_2, y_1, y_2 < n\)). Podrazumevati da su koordinate gornjeg levog polja \((0,0)\).

Opis izlaza

Na standardni izlaz ispisati redom koliko ima crvenih, zelenih i plavih polja na putu od početnog do krajnjeg polja, računajući i njih.

Primer

Ulaz

4 1 1 3 2

Izlaz

3 3 4

Objašnjenje

Putanja od početnog do krajnjeg polja je označena malim slovima

R G B R G b r g b r g b r g b R

Rešenje

Opis glavnog rešenja

U ovom bloku se opisuje glavno rešenje zadatka.

#include <iostream>

using namespace std;

int divisible_in_range(int a, int b, int k) 
{
  int l = a % k == 0 ? a / k : a / k + 1;   // ceil(a/k)
  int r = b / k;                            // floor(b/k)
  return r >= l ? r - l + 1 : 0;
}

int main() 
{
   int n; cin >> n;

   int x1, y1, x2, y2;
   cin >> x1 >> y1 >> x2 >> y2;

   int start = n * x1 + y1;
   int end = n * x2 + y2;

   int R = divisible_in_range(start, end, 3);
   int G = R;
   if (start % 3 == 1) G++;     // [G B R ...]
   if (end % 3 == 0) G--;       // [... G B R]

   int B = R;
   if (start % 3 >= 1) B++;     // [G B R ...] ili [B R ...]
   if (end % 3 <= 1) B--;       // [... G B R] ili [... G B]

   cout << R << " " << G << " " << B << endl;

   return 0;
}
#include <iostream>
#include <string>
#include <vector>

using namespace std;

void next(char &x)
{
    if (x == 'R') {
        x = 'G';
    } else if (x == 'G') {
        x = 'B';
    } else { // x == 'B'
        x = 'R';
    }
}

void update_count(char x, int &R, int &G, int &B)
{
    if (x == 'R') {
        R++;
    } else if (x == 'G') {
        G++;
    } else if (x == 'B') {
        B++;
    }
}

int main() 
{
   int n; cin >> n;

   int x1, y1, x2, y2;
   cin >> x1 >> y1 >> x2 >> y2;

   char tmp = 'R';
   vector<string> M(n);
   for (int i = 0; i < n; i++) {
       for (int j = 0; j < n; j++) {
           M[i].push_back(tmp);
           next(tmp);
       }
   }

   int R = 0, G = 0, B = 0;
   for (int i = 0; i < n; i++) {
       for (int j = 0; j < n; j++) {
           if ((i == x1 && j >= y1) ||
                   (x1 < i && i < x2) ||
                   (i == x2 && j <= y2)) {
               update_count(M[i][j], R, G, B);
           }
       }
   }

   cout << R << " " << G << " " << B << endl;

   return 0;
}