Cod sursa(job #476408)

Utilizator mlazariLazari Mihai mlazari Data 10 august 2010 21:31:10
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<fstream>

using namespace std;

#define ll long long

ifstream fi("reuniune.in");
ofstream fo("reuniune.out");

ll i,A,P,x0[3],y0[3],x1[3],y1[3],rasterX[7],rasterY[7];
bool filled[5][5];

void addToRaster(ll raster[], ll c) {
  int i=1,j;
  while(i<=raster[0] && raster[i]<c) ++i;
  if(i>raster[0]) raster[++raster[0]]=c;
  else
   if(c!=raster[i]) {
     ++raster[0];
     for(j=raster[0];j>i;--j) raster[j]=raster[j-1];
     raster[i]=c;
   }
}

void fillRectangle(int k) {
  int left,down,right,up,i,j;
  for(left=1;rasterX[left]<x0[k];++left);
  for(down=1;rasterY[down]<y0[k];++down);
  for(right=left;rasterX[right]<x1[k];++right);
  for(up=down;rasterY[up]<y1[k];++up);
  for(i=left-1;i<right-1;++i)
   for(j=down-1;j<up-1;++j) filled[i][j]=true;
}

void calculate() {
  int i,j;
  for(i=0;i<rasterX[0]-1;++i)
   for(j=0;j<rasterY[0]-1;++j)
    if(filled[i][j]) {
      A+=(rasterX[i+2]-rasterX[i+1])*(rasterY[j+2]-rasterY[j+1]);
      if(!i || !filled[i-1][j]) P+=rasterY[j+2]-rasterY[j+1];
      if(i==rasterX[0]-2 || !filled[i+1][j]) P+=rasterY[j+2]-rasterY[j+1];
      if(!j || !filled[i][j-1]) P+=rasterX[i+2]-rasterX[i+1];
      if(j==rasterY[0]-2 || !filled[i][j+1]) P+=rasterX[i+2]-rasterX[i+1];
    }
}

int main() {
  for(i=0;i<3;++i) {
    fi>>x0[i]>>y0[i]>>x1[i]>>y1[i];
    addToRaster(rasterX,x0[i]);
    addToRaster(rasterY,y0[i]);
    addToRaster(rasterX,x1[i]);
    addToRaster(rasterY,y1[i]);
  }
  for(i=0;i<3;++i) fillRectangle(i);
  calculate();
  fo<<A<<" "<<P<<"\n";
  return 0;
}