Cod sursa(job #114857)

Utilizator floringh06Florin Ghesu floringh06 Data 16 decembrie 2007 00:02:22
Problema Reuniune Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.02 kb
#include <cstdio>

using namespace std;

#define FIN "reuniune.in"
#define FOUT "reuniune.out"

typedef struct 
{
        int x0, x1;
        int y0, y1;
} rect;

rect A[5];
int i;

    inline long double MIN (int A, int B)
    {
           if (A > B) return (long double)B; else return (long double)A;
    }
    
    inline long double MAX (int A, int B)
    {
           if (A > B) return (long double)A; else return (long double)B;
    }
    
    long double MIN1 (int a, int b, int c)
    {
         if (b < a) a = b;
         if (c < a) a = c;
         return (long double)a;
    } 
    
    long double MAX1 (int a, int b, int c)
    {
         if (b > a) a = b;
         if (c > a) a = c;
         return (long double)a;
    } 

    long double INTER1 (rect A, rect B)
    {         
         long double H, V;
         H = MIN (A.x1, B.x1) - MAX (A.x0, B.x0);
         if (H < 0) H = 0;
         V = MIN (A.y1, B.y1) - MAX (A.y0, B.y0);
         if (V < 0) V = 0;
         
         return H * V;
    }
    
    long double INTER2(rect A, rect B, rect C)
    {
         long double H, V;
         H = MIN1 (A.x1, B.x1, C.x1) - MAX1 (A.x0, B.x0, C.x0);
         if (H < 0) H = 0;
         V = MIN1 (A.y1, B.y1, C.y1) - MAX1 (A.y0, B.y0, C.y0);
         if (V < 0) V = 0;
         
         return H * V;
    }
    
    long double PER1 (rect A, rect B)
    {         
         long double H, V;
         H = MIN (A.x1, B.x1) - MAX (A.x0, B.x0);
         if (H < 0) return 0;
         V = MIN (A.y1, B.y1) - MAX (A.y0, B.y0);
         if (V < 0) return 0;
         
         return H*2 + V*2;
    }
    
    long double PER2(rect A, rect B, rect C)
    {
         long double H, V;
         H = MIN1 (A.x1, B.x1, C.x1) - MAX1 (A.x0, B.x0, C.x0);
         if (H < 0) return 0;
         V = MIN1 (A.y1, B.y1, C.y1) - MAX1 (A.y0, B.y0, C.y0);
         if (V < 0) return 0;
         
         return H*2 + V*2;
    }

    void solve ( void )
    {
          int i, j;
          double Best = 0;
          for (i = 1; i <= 3; ++i)
              Best += (long double)(A[i].x1 - A[i].x0)*(long double)(A[i].y1 - A[i].y0);
          for (i = 1; i < 3; ++i)
              for (j = i + 1; j <= 3; ++j)
                  Best -= INTER1(A[i], A[j]);      
          Best += INTER2(A[1], A[2], A[3]);
          printf ("%.0Lf ", Best);
          Best = 0;
          for (i = 1; i <= 3; ++i)
              Best += (long double)(A[i].x1 - A[i].x0)*2 + (long double)(A[i].y1 - A[i].y0)*2;
          for (i = 1; i < 3; ++i)
              for (j = i + 1; j <= 3; ++j)
                  Best -= PER1(A[i], A[j]);      
          Best += PER2(A[1], A[2], A[3]);
          printf ("%.0Lf\n", Best);
    }

    int main ()
    {
         freopen (FIN, "r", stdin);
         freopen (FOUT, "w", stdout);
         
         for (i = 1; i <= 3; ++i)
             scanf ("%d %d %d %d", &A[i].x0, &A[i].y0, &A[i].x1, &A[i].y1);
         
         solve ();
         
         return 0;
    }