Cod sursa(job #2482126)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 27 octombrie 2019 20:14:32
Problema Laser Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <fstream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#define ver 0.00000001
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 verif()
{
    if(segd[i]-segs[i]>=180+ver)
        return (v[j]<=segs[i]+ver)||(v[j]>=segd[i]-ver);
    return (v[j]>=segs[i]-ver&&v[j]<=segd[i]+ver);
}
int main ()
{
    fin>>n;m=2*n;
    for(i=1;i<=n;i++)
    {
        fin>>x1>>y3>>x2>>y2;
        st=atan2(y3,x1)*180.0/acos(-1);
        if(st<0.0) st+=360.0;
        dr=atan2(y2,x2)*180.0/acos(-1);
        if(dr<0.0) dr+=360.0;
        v[i*2-1]=st;v[i*2]=dr;
        if(st>dr) swap(st,dr);
        segs[i]=st;segd[i]=dr;
    }
    sort(v+1,v+m+1);
    v[m+1]=v[1]+360.0;
    for(int i=1;i<=m;i++)
    {
        ung[i]=(v[i]+v[i+1])/2.0;
        if(ung[i]>360.0) ung[i]-=360.0;
    }
    for(i=1;i<=n;i++) for(j=1;j<=m;j++)
        a[i][j]=verif();
    for(i=1;i<=n;i++) fin>>a[i][m+1];
    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 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) fout<<2/0;
        sol[j]=a[i][m+1];
        for(t=j+1;t<=m;t++)
            sol[j]^=sol[t]*a[i][t];
    }
    for(i=1;i<=m;i++) if(sol[i]) nr++;
    fout<<nr<<"\n";
    for(i=1;i<=m;i++)
        if(sol[i]==1) fout<<fixed<<setprecision(6)<<ung[i]<<"\n";
    return 0;
}