infoarena

infoarena - concursuri, probleme, evaluator, articole => .CAMPION => Subiect creat de: Ilie Ovidiu Horatiu din Ianuarie 26, 2014, 23:24:50



Titlul: ec-killed by signal
Scris de: Ilie Ovidiu Horatiu din Ianuarie 26, 2014, 23:24:50
Buna. Am lucrat problema ec de pe campion. Ideea ar fi ca nu inteleg de ce urmatorul cod primeste killed by signal pe toate testele, iar pe calculatorul meu merge foarte bine. Banuiesc ca e datorita faptului ca evaluarea se face sub linux, iar eu rulez pe windows. Cum pot scapa de killed by signal si pe linux?
Cod:
//horatiu11
# include <cstdio>
# include <cstring>
# include <cmath>
# define nmax 10001
using namespace std;
int v[2*nmax],n,k,x,y,L,nr2,nr1,nrx,nrxp,k1,k2,val,delta;
long double rez1,rez2;
char ch,s[nmax];
int main()
{
    int i;
    freopen("ec.in","r",stdin);
    freopen("ec.out","w",stdout);
    scanf("%d%d",&n,&k);
    for(i=1;i<=n*n;++i)
    {
        scanf("%d",&val);
        v[val+10000]=1;
    }
    scanf("%c",&ch);
    while(k)
    {
        gets(s);L=strlen(s);
        if(!strchr(s,'^'))
        {
            ++x;
            i=0;nrx=0;nr1=0;nr2=0;
            while(s[i]!='x')nrx=nrx*10+int(s[i]-'0'),++i;
            i+=2;
            while(s[i]!='=')nr1=nr1*10+int(s[i]-'0'),++i;
            ++i;
            while(i<L)nr2=nr2*10+int(s[i]-'0'),++i;
            rez1=(long double)(nr2-nr1)/nrx;
            if(rez1==int(rez1))
                if(v[(int)rez1+10000]==1)++k1;
        }
        else
        {
            ++y;
            i=0;nrxp=0;nrx=0;nr1=0;nr2=0;
            while(s[i]!='x')nrxp=nrxp*10+int(s[i]-'0'),++i;
            i+=4;
            while(s[i]!='x')nrx=nrx*10+int(s[i]-'0'),++i;
            i+=2;
            while(s[i]!='=')nr1=nr1*10+int(s[i]-'0'),++i;
            ++i;
            while(i<L)nr2=nr2*10+int(s[i]-'0'),++i;
            nr1-=nr2;
            delta=nrx*nrx-4*nrxp*nr1;
            if(delta<0)continue;
            if(delta==0)
            {
                rez1=(long double)nrx*(-1)/(long double)2*nrxp;
                if(rez1==(int)rez1)
                    if(v[(int)rez1+10000]==1)++k2;
            }
            else
            {
                rez1=(long double)nrx*(-1)+sqrtl((long double)delta)/(long double)2*nrxp;
                rez2=(long double)nrx*(-1)-sqrtl((long double)delta)/(long double)2*nrxp;
                if(int(rez1)==rez1)
                {
                    if(v[(int)rez1+10000]==1)++k2;
                }
                else if(int(rez2)==rez2)
                    if(v[(int)rez2+10000]==1)++k2;
            }
        }
        --k;
    }
    printf("%d %d\n%d %d\n",x,k1,y,k2);
    return 0;
}