Cod sursa(job #1672159)

Utilizator andy1207Cioltan Andrei andy1207 Data 2 aprilie 2016 13:28:13
Problema Tribute Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include<cstdio>
int vl[50001];
int vc[50001];
int vv[50001];
int main()
{
 int n,dx,dy,maxx,maxy,minx,miny,i,a,b,f,st,dr,min,j,s,t,min1,in,sf,e;
 freopen("tribute.in","r",stdin);
 freopen("tribute.out","w",stdout);
 scanf("%d%d%d",&n,&dx,&dy);
 maxx=maxy=-1;
 minx=miny=999999;
 s=t=0;
 for(i=1;i<=n;i++)
    {
     scanf("%d%d",&a,&b);
     vl[a]++;///lini
     vc[b]++;///coloane
     if(a>dx-1)
        dr++;
     if(a>dx-1)
        s=s+a-dx+1;
     if(b>dy-1)
        t=t+b-dy+1;

     if(a>maxx)
        maxx=a;
     if(b>maxy)
        maxy=b;
     if(a<minx)
        minx=a;
     if(b<miny)
        miny=b;
    }
 st=0;
 in=-1;
 sf=dx-1-1;
 e=s;
 while(sf<=maxx)
      {
       in++;
       sf++;
       e-=dr;///scad cate unu pentru fiecare punct din dreapta
       e+=st;///adun cate unu pentru fiecare punct din stanga
       vv[in]+=e;
       if(vl[sf+1]!=0)
          {
           dr-=vl[sf+1];///scad cate elem sunt pe linia care intra in secventa din elem din dreapta
          }
       if(vl[in-1]!=0)
          {
           st+=vl[in-1];///adun cate elem sunt pe linia care iese din secventa la elem din stanga
          }
       /*in++;
       sf++;
       e-=dr;///scad cate unu pentru fiecare punct din dreapta
       e+=st;///adun cate unu pentru fiecare punct din stangas
       vv[in]+=e;*/
      }
 st=0;
 in=-1;
 sf=dy-1-1;
 e=t;
 min=999999;
 while(sf<=maxy)
      {
       in++;
       sf++;
       e-=dr;///scad cate unu pentru fiecare punct din dreapta
       e+=st;///adun cate unu pentru fiecare punct din stanga
       vv[in]+=e;
       if(vv[in]<min && vv[in]!=0)
          min=vv[in];
       if(vc[sf+1]!=0)
          {
           dr-=vc[sf+1];///scad cate elem sunt pe linia care intra in secventa din elem din dreapta
          }
       if(vc[in-1]!=0)
          {
           st+=vc[in-1];///adun cate elem sunt pe linia care iese din secventa de elem din stanga
          }
       /*in++;
       sf++;
       e-=dr;///scad cate unu pentru fiecare punct din dreapta
       e+=st;///adun cate unu pentru fiecare punct din stangas
       vv[in]+=e;
       if(vv[in]<min)
          min=vv[in];*/
      }
 printf("%d\n",min);
return 0;
}