Cod sursa(job #2482023)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 27 octombrie 2019 18:22:25
Problema Laser Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.86 kb
#include <fstream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#define ver 0.000000001
#define P 3.14159265358979323846264338327950288
using namespace std;
ifstream fin ("laser.in");
ofstream fout("laser.out");
int n,m,x1,x2,y3,y2,i,j,x,y,a[1100][1100],sol[1100],t;
double segs[520],segd[520],v[1100],st,dr,ung[1100];
int main ()
{
    fin>>n;
    for(i=1;i<=n;i++)
    {
        fin>>x1>>y3>>x2>>y2;
        st=atan2(y3,x1);
        if(st<0) st+=2*P;
        dr=atan2(y2,x2);
        if(dr<0) dr+=2*P;
        v[i*2-1]=st;v[i*2]=dr;
        if(st-dr>ver) swap(st,dr);
        segs[i]=st;segd[i]=dr;
    }
    m=2*n;
    sort(v+1,v+m+1);
    for(i=1;i<m;i++) ung[i]=(v[i]+v[i+1])/2;
    ung[m]=(v[1]+v[m]+2*P)/2;
    if(ung[m]>2*P) ung[m]-=2*P;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            if(v[j]>=segs[i]&&segd[i]>=v[j])
                a[i][j]=1;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        a[i][m+1]=x;
    }
    x=1;y=1;
    while(x<=n&&y<=m)
    {
        for(i=x;i<=n;i++) if(a[i][y]!=0) break;
        if(i==n+1)
        {
            y++;
            continue;
        }
        if(i!=x) for(j=1;j<=m+1;j++)
            swap(a[x][j],a[i][j]);
        for(i=x+1;i<=n;i++)
            if(a[i][y])
                for(j=y;j<=m+1;j++)
                    a[i][j]^=a[x][j];
        x++;y++;
    }
    int ok=0,nr=0;
    for(i=n;i>=1;i--)
    {
        for(j=1;j<=m+1;j++) if(a[i][j]) break;
        if(j==m+2)
            continue;
        if(j==m+1)
        {
            ok=-1;
            break;
        }
        sol[j]=a[i][m+1];
        for(t=j+1;t<=m;t++)
            sol[j]^=sol[t]*a[i][t];
        if(sol[j]==1) nr++;
    }
    if(ok==-1) return 0;
    fout<<nr<<"\n";
    for(i=1;i<=m;i++)
        if(sol[i]==1) fout<<fixed<<setprecision(6)<<ung[i]*180/P<<"\n";
    return 0;
}